☁️ KVM + Cloud-Init: Настройка сервера «без рук» В продолжение поста.
В продолжение поста. Мы научились поднимать "железо" через Terraform. Но что толку от запущенной VM, если в нее нужно заходить через VNC-консоль, вручную создавать пользователя, прописывать пароли и ставить nginx?
Это медленно и небезопасно.
Решение Cloud-Init. Это стандарт де-факто для инициализации облачных инстансов (AWS, Azure, DigitalOcean), который прекрасно работает и на локальном KVM.
🎯 Задача
При команде terraform apply:
1. Создать VM.
2. Автоматически создать пользователя admin.
3. Закинуть туда ваш публичный SSH-ключ (чтобы заходить без пароля).
4. Установить Nginx и Docker.
📝 Шаг 1. Пишем конфиг (cloud_init.cfg)
Создайте файл cloud_init.cfg. Это обычный YAML, который описывает, что нужно сделать внутри ОС при первом старте.
#cloud-config
hostname: my-web-server
fqdn: my-web-server.local
manage_etc_hosts: true
users:
- name: admin
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa AAAAB3Nza... (ваш публичный ключ id_rsa.pub)
packages:
- nginx
- htop
- git
runcmd:
- [ systemctl, enable, nginx ]
- [ systemctl, start, nginx ]
- [ echo, "Hello from Cloud-Init!", >, /var/www/html/index.html ]
🔗 Шаг 2. Подключаем к Terraform
В наш файл main.tf (из прошлого поста) добавляем ресурс диска Cloud-Init. Terraform создаст маленький ISO-образ с нашим конфигом и подключит его как CD-ROM к виртуалке.
# 1. Читаем конфиг
data "template_file" "user_data" {
template = file("${path.module}/cloud_init.cfg")
}
# 2. Создаем диск с настройками
resource "libvirt_cloudinit_disk" "commoninit" {
name = "commoninit.iso"
user_data = data.template_file.user_data.rendered
}
# 3. Цепляем к машине
resource "libvirt_domain" "vm" {
# ... остальные настройки ...
# Самая важная строчка:
cloudinit = libvirt_cloudinit_disk.commoninit.id
# ...
}
🚀 Результат: Вы запускаете terraform apply.
Через 30 секунд у вас есть поднятый сервер с установленным Nginx. Вы просто пишете:
ssh admin@<ip-address>
...и сразу попадаете внутрь. Никаких паролей, никаких ручных установок.
💡 Важный нюанс: Cloud-Init работает только на специальных Cloud Images (например, Ubuntu Cloud, CentOS GenericCloud, Debian Cloud).
Если вы попытаетесь скормить ему обычный установочный ISO (Desktop/Server installer), магии не произойдет, там нет демона cloud-init, который читает конфиг при загрузке.
#sysadmin #cloudinit #terraform #kvm #devops #automation #linux
👉 @sysadminof