さくらのクラウドのcloud-initでネットワークの設定を行う方法(2024/03)
2024/03 時点でのさくらのクラウドの cloud-init でネットワークの設定を行う方法を記述します。
利用する OS
利用する OS は Ubuntu 22.04 の cloudimg を利用します。
前提
2024/03 時点でさくらのクラウドの cloud-init では network-config を指定することができません。 利用者が指定できるのは user-data とクラウドから提供される meta-data のみとなっています。
user-data でネットワークの設定を行う
network-config で設定できないので user-data で無理くりネットワークの設定を行います。
write_files と runcmd を使う方法(問題あり)
以下のように、netplan の設定ファイルを write_files で設置し runcmd で netplan apply をします。
1#cloud-config
2fqdn: test.local
3password: $6$rounds=4096$h2xDoQtATt$AaQK928JO.RO0.9.cgyi.dAx8egj6ijfn8C1kKYOzFeXQ1o.y9HbqmWfWZmmH2JrNPP.iSbEjRP1YxO8hKy3O0
4chpasswd:
5 expire: false
6ssh_pwauth: false
7ssh_authorized_keys:
8 - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQD2Uueyqs7OzE5Z170xebEpE2duKroFbPGSot0OGNPbtbnCw7mtAqHzSExfMsuUufr3Q6+8aM5o1nMXyrzx5FKd/ZJeJmpEdNhgwsyztYD35BJMukZ0LE7Ueu+Artq803Aeoco3Z2YhquMbnNynMQjuvDiB8KYWbhalpp+4td6S5bqpMry8XDdOt2PnEP2tpcoYV1InHWn72G6O7yEJvBCkrRXpqToqgJxOPIgDr/ECAusr1XTBTR7a9KU6PzLgk2au50d+uSHXDt5Dbo6DriUpEVaVW7VLVTT0lDu9pqWUHeXvNLjyEV1/x8pNc9m16oaJrPONiyOSW0c8ItuFJ6y+AIAthnxtG6UISfeTf9e+NvxmqLaFU3jowMnsKksh2KCC6VLgEel/vVNmS+6YJheSS9V1Gq2iax5IZ1sINUiAGO/fMe6QKOabCFcQvTxBTnt2HE0AMY6pWIgBntlZu8cgwMXEW8IQx1fKZ4IzXNOkajdaknLnSRBKV6w6nAzMiZU=
9
10write_files:
11 - path: /etc/netplan/60-netcfg.yaml
12 owner: root:root
13 permissions: 0o644
14 content: |
15 network:
16 ethernets:
17 ens3:
18 addresses:
19 - 192.168.0.254/24
20 nameservers:
21 addresses:
22 - 210.188.224.10
23 - 210.188.224.11
24 routes:
25 - to: default
26 via: 192.168.0.1
27 renderer: networkd
28 version: 2
29
30runcmd:
31 - sudo netplan apply
以下のようにファイルが設置され、IP アドレスも設定されていることがわかります。
しかし、runcmd が最後に実行されるのでネットワークを利用するモジュールを使用するとエラーになって失敗してしまいます。 例えば packages や ssh-import-id など。 初期設定としてネットワークとユーザーの設定ができれば、あとは ansible でセットアップすることもできますが不便ではあります。
bootcmd を使う方法
bootcmd で ネットワークの設定ファイルを設置します。 bootcmd のタイミングでは netplan apply が失敗します。 そこで、設定ファイルが存在しない場合(初回)は設定ファイルを設置して再起動し、 設定ファイルが存在する場合(再起動後)は何もせずに続行します。 そうすることで、
1#cloud-config
2fqdn: test.local
3password: $6$rounds=4096$h2xDoQtATt$AaQK928JO.RO0.9.cgyi.dAx8egj6ijfn8C1kKYOzFeXQ1o.y9HbqmWfWZmmH2JrNPP.iSbEjRP1YxO8hKy3O0
4package_update: true
5packages:
6 - emacs
7 - jq
8chpasswd:
9 expire: false
10ssh_pwauth: false
11ssh_import_id:
12 - gh:ophum
13
14bootcmd:
15 - |
16 if [ ! -e "/etc/netplan/60-netcfg.yaml" ]; then
17 echo "network:
18 ethernets:
19 ens3:
20 addresses:
21 - 192.168.0.254/24
22 nameservers:
23 addresses:
24 - 210.188.224.10
25 - 210.188.224.11
26 routes:
27 - to: default
28 via: 192.168.0.1
29 renderer: networkd
30 version: 2" | tee /etc/netplan/60-netcfg.yaml
31 reboot
32 fi
以下のように設定されます。
また、ssh_import_id
で指定した github に登録している鍵が.ssh/authorized_keys に登録されていたり、packages
で指定したemacs
とjq
がインストールされています。
おわり
以上 2024 年 3 月時点でさくらのクラウドで可能な cloud-init でのネットワークを設定する方法でした。