Cloud-init — это инструмент для настройки облачного сервера, который позволяет передать пользовательские параметры (user-data) при запуске виртуальной машины и тем самым ускорить и автоматизировать процесс настройки серверов.
С помощью cloud-init вы можете настроить конфигурацию сервера, установить нужное ПО, создать нужные директории и пользователей и назначить им права — и многое другое. 
Сценарии cloud-init также можно передавать через Terraform, а в ближайшее время реализуем и передачу через CLI.
Форматы
Сценарии cloud-init можно передавать в виде текстовых файлов #cloud-config или shell-скриптов #!/bin/sh.
При использовании shell-скриптов необходимо учитывать следующее:
- shell-скрипт будет автоматически преобразован в
cloud-configс директивойruncmd;
runcmdвыполняется однократно, поэтому после изменения скрипта и перезагрузки VDS скрипт не будет выполнен.Если вам нужно, чтобы сценарий выполнялся при каждой загрузке сервера, необходимо использовать скрипты в формате
cloud-configи директивуbootcmd.
Особенности
- Сценарии выполняются от root, поэтому в командах не требуется указыватьsudo.
- Все созданные файлы и директории будут принадлежать пользователю root, поэтому если необходимо, чтобы доступ к ним имел иной пользователь, задайте в сценарии соответствующие права для него.
- Так как сценарий выполняется полностью автоматически, в нем не получится использоваться команды, запрашивающие действия от пользователя. Для команд, требующих подтверждения в процессе выполнения, используйте ключ -y(например,apt upgrade -y).
- Лог выполнения сценария записывается в файл /var/log/cloud-init-output.log.
- На Ubuntu cloud-initпо умолчанию создаст пользователяubuntu, если нет инструкцииusers. Если создание пользователей не требуется, рекомендуется указать запись вида:
users: []Загрузка сценария
Загрузить сценарий cloud-init можно:
- На этапе создания сервера. Заданные параметры будут применены при установке.
- При переустановке сервера. Заданные параметры будут применены при установке.
- После создания сервера, в разделе «Конфигурация». Чтобы заданные параметры были применены при следующей перезагрузке, необходимо перезагрузить систему командой: cloud-init clean --reboot.
Редактирование сценария
Вы можете изменять уже загруженный скрипт cloud-init в настройках сервера.
Чтобы заданные параметры были применены при следующей перезагрузке, необходимо перезагрузить систему командой:
cloud-init clean --reboot.
- Перейдите на вкладку «Конфигурация».
- Кликните «Редактировать» в блоке «Cloud-init».
- Внесите изменения и сохраните их.
Сценарий будет применен при следующей перезагрузке сервера.
Примеры shell-скриптов
Скрипт обязательно должен начинаться с
#!/bin/sh.
Установка пакетов
С помощью скрипта ниже установим fail2ban:
#!/bin/sh
apt -y update
apt -y install fail2banУстановка LAMP на CentOS
#!/bin/sh
##Ставим PHP 7.2
yum -y install epel-release
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php72
yum update -y
yum install -y php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-process php-ldap php-mbstring
##Ставим MariaDB 11.02
wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod +x mariadb_repo_setup
bash mariadb_repo_setup
yum install -y httpd mariadb-server
##Запускаем автозагрузку сервисов
systemctl start mariadb
systemctl enable mariadb
systemctl start httpd
systemctl enable httpd
##Назначаем права
chmod 2775 /var/www
find /var/www -type d -exec chmod 2775 {} \;
find /var/www -type f -exec chmod 0664 {} \;
## Вывод phpinfo
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
## Открываем порт
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPTПримеры cloud-config
Файл обязательно должен начинаться с
#cloud-config.
Установка пакетов
#cloud-config
package_update: true
packages:
 - apache2
 - mariadb-server
 - mariadb-clientСоздание пользователей
#cloud-config
users:
  - name: username
  - name: new_usernameПри создании пользователя через cloud-init пропадет возможность авторизации под пользователем root с использованием пароля. Это происходит из-за того, что ваш user-data перезаписывает настройки, заданные vendor-data.
Если вам нужна авторизация под root с паролем, используйте директиву chpasswd и явно задайте пароль:
#cloud-config
users:
  - name: newuser
    shell: /bin/bash
    groups: [sudo]
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
chpasswd:
  list: |
    root:rootpass
    newuser:newuserpass
  expire: false
В этом случае пароль root, отображаемый в панели управления, больше не будет актуален. Однако при смене пароля через панель управления он обновится корректно.
Если авторизация по паролю вам не нужна, используйте SSH-ключи.
Добавление SSH-ключей
#cloud-config
ssh_authorized_keys:
  - ssh-rsa ПУБЛИЧНЫЙ_КЛЮЧ username@serverМожно добавить несколько ключей сразу:
#cloud-config
ssh_authorized_keys:
  - ssh-rsa ПУБЛИЧНЫЙ_КЛЮЧ username@server
  - ssh-rsa ПУБЛИЧНЫЙ_КЛЮЧ_2 username2@desktopСоздание пользователя с правами sudo, добавление SSH-ключей и настройка оболочки bash
#cloud-config
users:
  - name: username
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - ПУБЛИЧНЫЙ_КЛЮЧ username@server
      - ПУБЛИЧНЫЙ_КЛЮЧ_2 username2@desktopУстановка LAMP на Ubuntu
#cloud-config
package_update: true
packages:
  - apache2
  - php-mysql
  - mysql-server
  - libapache2-mod-php
  - php-gd
  - php-curl
runcmd:
  - [ find, /var/www, -type, d, -exec, chmod, 2775, {}, \; ]
  - [ find, /var/www, -type, f, -exec, chmod, 0664, {}, \; ]
write_files:
  - path: /var/www/html/phpinfo.php
    owner: www-data:www-data
    content: |
      "<?php phpinfo(); ?>"После завершения настройки при переходе по адресу http://ip_адрес_сервера/phpinfo.php отобразится страница с параметрами PHP.
Больше примеров можно найти в документации cloud-init.
Как можно хранить и использовать секреты в cloud init Как можно передать какие то параметры в cloud init (что нибудь вроде env переменнных)
Добрый день!
Судя по вашему описанию, для реализации подобного требуются метаданные в cloud-init. Они у нас пока не поддерживаются, поэтому передать переменные вы не сможете.
Очень интересно
хорошая !
Фигасебе ! Таймвэв ! жжжжжжет!