База знаний

Выполните первоначальную настройку с помощью cloud-init

Прикрепите документ user-data к заказу, и инстанс будет создан с вашим пользователем, вашим ключом, вашими пакетами и вашим firewall уже на месте.

Что запускается и когда

Каждый 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 делает во второй раз, а это редко то же самое, что в первый.

Где остановиться

cloud-init предназначен для начальной загрузки и не знает, в каком состоянии машина должна быть завтра. Используйте его, чтобы достичь точки, где ваши настоящие инструменты могут вступить в дело: ключ, сеть, агент. Остановитесь там. Шестьдесят строк — это здоровый user-data, а шестьсот — это система управления конфигурацией без возможности сходимости.

cloud-init query -a
cloud-init query ds.meta_data

Идентификатор инстанса, код сайта, имя хоста и назначенные при загрузке адреса — всё это там, что и нужно скрипту, когда он должен где-то зарегистрироваться и ещё не знает, где проснулся.

Готовы, когда вы готовы

Выберите город. Выберите размер. Оплатите монетой.

Никаких форм о том, кто вы, никакого ожидания одобрения человеком, никаких звонков для проверки. Счёт оплачен — и учётные данные приходят на почту.