Сценарии cloud-init

Cloud-init — это инструмент для настройки облачного сервера, который позволяет передать пользовательские параметры (user-data) при запуске виртуальной машины и тем самым ускорить и автоматизировать процесс настройки серверов.

С помощью cloud-init вы можете настроить конфигурацию сервера, установить нужное ПО, создать нужные директории и пользователей и назначить им права — и многое другое. 

Возможность передавать сценарии cloud-init через CLI и Terraform будет реализована в ближайшее время.

Форматы

Сценарии 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 можно:

  • На этапе создания сервера. Заданные параметры будут применены при установке.

081449bf 55b6 44d0 Bd74 578830f3efef

  • После создания сервера, в разделе «Конфигурация». Заданные параметры будут применены при следующей перезагрузке.

E5d9634a 23f5 491b B45f 60f3be14d878

Редактирование сценария

Вы можете изменять уже загруженный скрипт cloud-init в настройках сервера.

  1. Перейдите на вкладку «Конфигурация».
  2. Кликните «Редактировать» в блоке «Cloud-init».
  3. Внесите изменения и сохраните их.

E5d9634a 23f5 491b B45f 60f3be14d878

Сценарий будет применен при следующей перезагрузке сервера. 

Примеры 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

Добавление 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.