SUPER-G.EEK.JP

twitter: @hum_op_dev
github: ophum

さくらのクラウドの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で指定したemacsjqがインストールされています。

おわり

以上 2024 年 3 月時点でさくらのクラウドで可能な cloud-init でのネットワークを設定する方法でした。

Tags: