Что запускается и когда
Каждый Linux-образ несёт cloud-init. При первой загрузке он читает user-data, прикреплённый к вашему заказу, применяет его один раз и записывает маркер, чтобы больше никогда не запускаться. Всё это происходит до того, как вы могли бы что-то ввести, и в этом суть: окно между существованием инстанса и его настройкой — это окно, которого у вас не должно быть.
Проверьте документ перед заказом. Проверка схемы ловит ошибку отступа, которая иначе стоила бы вам пересборки:
cloud-init schema --config-file user-data.yaml --annotateUser-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 делает во второй раз, а это редко то же самое, что в первый.
Где остановиться
cloud-init предназначен для начальной загрузки и не знает, в каком состоянии машина должна быть завтра. Используйте его, чтобы достичь точки, где ваши настоящие инструменты могут вступить в дело: ключ, сеть, агент. Остановитесь там. Шестьдесят строк — это здоровый user-data, а шестьсот — это система управления конфигурацией без возможности сходимости.
cloud-init query -a
cloud-init query ds.meta_dataИдентификатор инстанса, код сайта, имя хоста и назначенные при загрузке адреса — всё это там, что и нужно скрипту, когда он должен где-то зарегистрироваться и ещё не знает, где проснулся.