何がいつ実行されるか
すべてのLinuxイメージにはcloud-initが搭載されている。最初の起動時に、注文に添付されたuser-dataを読み取り、一度だけ適用し、二度と実行されないようにマーカーを書き込む。これらはすべて、あなたが何かを入力する前に発生する。それが要点だ。インスタンスが存在してから設定されるまでの間に、あなたが操作できる隙間はない。
注文する前にドキュメントを検証してください。スキーマチェッカーは、再構築にコストがかかるインデントのミスを検出します:
cloud-init schema --config-file user-data.yaml --annotate役立つことを行うuser-data
#cloud-config
hostname: edge-01
fqdn: edge-01.example.com
timezone: UTC
users:
- name: deploy
groups: [sudo]
shell: /bin/bash
sudo: "ALL=(ALL) NOPASSWD:ALL"
ssh_authorized_keys:
- ssh-ed25519 AAAAC3Nza... deploy@laptop
ssh_pwauth: false
disable_root: true
package_update: true
package_upgrade: true
packages:
- nftables
- vnstat
- mtr-tiny
write_files:
- path: /etc/ssh/sshd_config.d/10-local.conf
permissions: "0644"
content: |
PermitRootLogin no
PasswordAuthentication no
AllowUsers deploy
runcmd:
- [systemctl, enable, --now, nftables]
- [systemctl, restart, ssh]最初の行はコメントでも省略可能でもない。#cloud-configがないと、ドキュメントは黙って無視され、インスタンスは何も添付しなかったかのように起動する。
AlmaLinuxでは、groups: [sudo]はgroups: [wheel]になり、再起動するサービスはsshdになる。それ以外はすべて同一です。
動作の確認
cloud-init status --long
journalctl -u cloud-final -b
less /var/log/cloud-init-output.logジャーナルはどの段階で失敗したかを示します。cloud-init-output.logはruncmdエントリの実際の出力を保持しており、そこに原因があります。
シークレットを入れない
user-dataはインスタンスの存続期間中、インスタンス内部から読み取り可能なままです:
cloud-init query userdataそこにあるものはすべて、rootに到達できるプロセスや、ディスクのスナップショットを復元した人なら誰でも利用できます。シークレットを取得するための資格情報をインストールするために使用し、シークレットを運ぶためには使用しないでください。
インスタンスを消費せずにテストする
cloud-init clean --logs --rebootこれにより、マーカー、ログ、キャッシュされたデータソースが削除され、再起動して最初の起動が新しくなります。使い捨てで実行してください。本番環境で実行すると、runcmdが2回目に何をするかを知ることになります。それは通常、最初とは異なります。
どこで止めるか
cloud-initはブートストラップ用であり、マシンが明日どうあるべきかを知りません。実際のツールが引き継げる時点に到達するために使用してください:鍵、ネットワーク、エージェント。そこで止めてください。60行は健全なuser-dataであり、600行は収束方法のない設定管理システムです。
cloud-init query -a
cloud-init query ds.meta_dataインスタンスID、サイトコード、ホスト名、起動時に割り当てられたアドレスはすべてそこにあります。スクリプトがどこかに自分を登録する必要があり、どこで起動したかまだわからない場合に必要です。