Введение в сценарии облачного конфигурирования

Вступление

Программаcloud-init, доступная в последних дистрибутивах (только Ubuntu 14.04 и CentOS 7 на момент написания этой статьи), может потреблять и выполнять данные из поляuser-data вDigitalOcean metadata service. Этот процесс ведет себя по-разному в зависимости от формата информации, которую он находит. Один из самых популярных форматов сценариев вuser-data - это формат файлаcloud-config.

Cloud-config файлы - это специальные сценарии, разработанные для запуска процесса cloud-init. Они обычно используются для начальной настройки при самой первой загрузке сервера. В этом руководстве мы обсудим формат и использование файлов облачной конфигурации.

Общая информация о Cloud-Config

Форматcloud-config реализует декларативный синтаксис для многих общих элементов конфигурации, упрощая выполнение многих задач. Он также позволяет указывать произвольные команды для всего, что выходит за пределы предопределенных декларативных возможностей.

Этот подход «лучший из обоих миров» позволяет файлу действовать как файл конфигурации для общих задач, сохраняя при этом гибкость сценария для более сложной функциональности.

YAML Форматирование

Файл записывается с использованием формата сериализации данных YAML. Формат YAML создан для того, чтобы его было легко понять людям и легко анализировать для программ.

Файлы YAML, как правило, достаточно интуитивно понятны при их чтении, но полезно знать фактические правила, которые ими управляют.

Некоторые важные правила для файлов YAML:

  • Отступы с пробелами указывают на структуру и отношения элементов друг к другу. Элементы с более глубоким отступом являются вложенными элементами первого элемента с более низким уровнем отступа над ними.

  • Участники списка могут быть идентифицированы лидирующей чертой

  • Записи ассоциативного массива создаются с использованием двоеточия (:), за которым следуют пробел и значение.

  • Блоки текста с отступом. Чтобы указать, что блок должен читаться как есть, с сохранением форматирования, используйте символ канала (|) перед блоком.

Давайте возьмем эти правила и проанализируем пример файлаcloud-config, обращая внимание только на форматирование:

#cloud-config
users:
  - name: demo
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDf0q4PyG0doiBQYV7OlOxbRjle026hJPBWD+eKHWuVXIpAiQlSElEBqQn0pOqNJZ3IBCvSLnrdZTUph4czNC4885AArS9NkyM7lK27Oo8RV888jWc8hsx4CD2uNfkuHL+NI5xPB/QT3Um2Zi7GRkIwIgNPN5uqUtXvjgA+i1CS0Ku4ld8vndXvr504jV9BMQoZrXEST3YlriOb8Wf7hYqphVMpF3b+8df96Pxsj0+iZqayS9wFcL8ITPApHi0yVwS8TjxEtI3FDpCbf7Y/DmTGOv49+AWBkFhS2ZwwGTX65L61PDlTSAzL+rPFmHaQBHnsli8U9N6E4XHDEOjbSMRX [email protected]
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcthLR0qW6y1eWtlmgUE/DveL4XCaqK6PQlWzi445v6vgh7emU4R5DmAsz+plWooJL40dDLCwBt9kEcO/vYzKY9DdHnX8dveMTJNU/OJAaoB1fV6ePvTOdQ6F3SlF2uq77xYTOqBiWjqF+KMDeB+dQ+eGyhuI/z/aROFP6pdkRyEikO9YkVMPyomHKFob+ZKPI4t7TwUi7x1rZB1GsKgRoFkkYu7gvGak3jEWazsZEeRxCgHgAV7TDm05VAWCrnX/+RzsQ/1DecwSzsP06DGFWZYjxzthhGTvH/W5+KFyMvyA+tZV4i1XM+CIv/Ma/xahwqzQkIaKUwsldPPu00jRN user@desktop
runcmd:
  - touch /test.txt

Глядя на этот файл, мы можем узнать много важных вещей.

Во-первых, каждый файлcloud-config должен начинаться только с#cloud-config в самой первой строке. Это сигнализирует программе cloud-init, что это следует интерпретировать как файлcloud-config. Если бы это был обычный файл сценария, в первой строке указывался бы интерпретатор, который должен использоваться для выполнения файла.

В приведенном выше файле есть две директивы верхнего уровня:users иruncmd. Они оба служат ключами. Значения этих ключей состоят из всех строк с отступом после ключей.

В случае ключаusers значение представляет собой один элемент списка. Мы знаем это, потому что следующим уровнем отступа является тире (-), который указывает элемент списка, и потому что на этом уровне отступа есть только один тире. В случае директивыusers это случайно указывает на то, что мы определяем только одного пользователя.

Сам элемент списка содержит ассоциативный массив с большим количеством пар ключ-значение. Это родственные элементы, потому что все они существуют на одном уровне отступа. Каждый из пользовательских атрибутов содержится в одном элементе списка, который мы описали выше.

Следует отметить, что строки, которые вы видите, не требуют кавычек и что в них нет лишних скобок для определения ассоциаций. Интерпретатор может довольно легко определить тип данных, а отступ указывает на связь элементов, как для людей, так и для программ.

К настоящему времени вы должны иметь практические знания о формате YAML и чувствовать себя комфортно, работая с информацией, используя правила, которые мы обсуждали выше.

Теперь мы можем приступить к изучению некоторых из наиболее распространенных директив дляcloud-config.

Управление пользователями и группами

Чтобы определить новых пользователей в системе, вы можете использовать директивуusers, которую мы видели в примере файла выше.

Общий формат пользовательских определений:

#cloud-config
users:
  - first_user_parameter
    first_user_parameter

  - second_user_parameter
    second_user_parameter
    second_user_parameter
    second_user_parameter

Каждый новый пользователь должен начинаться с тире. Каждый пользователь определяет параметры в парах ключ-значение. Следующие ключи доступны для определения:

  • name: имя пользователя учетной записи.

  • primary-group: основная группа пользователя. По умолчанию это будет созданная группа, которая соответствует имени пользователя. Любая группа, указанная здесь, должна уже существовать или должна быть создана явно (мы обсудим это позже в этом разделе).

  • groups: Здесь могут быть перечислены любые дополнительные группы, разделенные запятыми.

  • gecos: поле для дополнительной информации о пользователе.

  • shell: оболочка, которая должна быть установлена ​​для пользователя. Если вы не установите это значение, будет использоваться самая простая оболочкаsh.

  • expiredate: дата истечения срока действия учетной записи в формате ГГГГ-ММ-ДД.

  • sudo: строка sudo, используемая, если вы хотите определить привилегии sudo, без поля имени пользователя.

  • lock-passwd: по умолчанию установлено значение «True». Установите для этого параметра значение «Ложь», чтобы пользователи могли войти с паролем.

  • passwd: хешированный пароль для учетной записи.

  • ssh-authorized-keys: список полных открытых ключей SSH, которые следует добавить в файлauthorized_keys этого пользователя в его каталог.ssh.

  • inactive: логическое значение, при котором учетная запись становится неактивной.

  • system: Если «True», эта учетная запись будет системной учетной записью без домашнего каталога.

  • homedir: используется для отмены значения по умолчанию/home/<username>, которое создается и устанавливается в противном случае.

  • ssh-import-id: идентификатор SSH для импорта из LaunchPad.

  • selinux-user: это можно использовать для установки пользователя SELinux, который должен использоваться для входа в эту учетную запись.

  • no-create-home: Установите значение «True», чтобы избежать создания каталога/home/<username> для пользователя.

  • no-user-group: Установите значение «True», чтобы избежать создания группы с тем же именем, что и пользователь.

  • no-log-init: Установите значение «True», чтобы не запускать базы данных входа пользователя.

Помимо некоторой базовой информации, такой как ключname, вам нужно только определить области, в которых вы отклоняетесь от значения по умолчанию или вводите необходимые данные.

Пользователям важно понять, что полеpasswd должно использоваться в производственных системахnot, если у вас нет механизма немедленного изменения данного значения. Как и вся информация, представленная в виде пользовательских данных, хэш остается доступным для пользователяany в системе в течение всего срока службы сервера. На современном оборудовании эти хэши могут быть легко взломаны за тривиальное время. Разоблачение даже хеш-кода - это огромный риск для безопасности, который нельзя использовать на машинах, которые не являются одноразовыми.

В качестве примера определения пользователя мы можем использовать часть примераcloud-config, который мы видели выше:

#cloud-config
users:
  - name: demo
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDf0q4PyG0doiBQYV7OlOxbRjle026hJPBWD+eKHWuVXIpAiQlSElEBqQn0pOqNJZ3IBCvSLnrdZTUph4czNC4885AArS9NkyM7lK27Oo8RV888jWc8hsx4CD2uNfkuHL+NI5xPB/QT3Um2Zi7GRkIwIgNPN5uqUtXvjgA+i1CS0Ku4ld8vndXvr504jV9BMQoZrXEST3YlriOb8Wf7hYqphVMpF3b+8df96Pxsj0+iZqayS9wFcL8ITPApHi0yVwS8TjxEtI3FDpCbf7Y/DmTGOv49+AWBkFhS2ZwwGTX65L61PDlTSAzL+rPFmHaQBHnsli8U9N6E4XHDEOjbSMRX [email protected]
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcthLR0qW6y1eWtlmgUE/DveL4XCaqK6PQlWzi445v6vgh7emU4R5DmAsz+plWooJL40dDLCwBt9kEcO/vYzKY9DdHnX8dveMTJNU/OJAaoB1fV6ePvTOdQ6F3SlF2uq77xYTOqBiWjqF+KMDeB+dQ+eGyhuI/z/aROFP6pdkRyEikO9YkVMPyomHKFob+ZKPI4t7TwUi7x1rZB1GsKgRoFkkYu7gvGak3jEWazsZEeRxCgHgAV7TDm05VAWCrnX/+RzsQ/1DecwSzsP06DGFWZYjxzthhGTvH/W5+KFyMvyA+tZV4i1XM+CIv/Ma/xahwqzQkIaKUwsldPPu00jRN user@desktop

Для определения групп вы должны использовать директивуgroups. Эта директива относительно проста в том, что она просто берет список групп, которые вы хотели бы создать.

Необязательным дополнением к этому является создание подсписка для любой из создаваемых вами групп. Этот новый список определит пользователей, которые должны быть помещены в эту группу:

#cloud-config
groups:
  - group1
  - group2: [user1, user2]

Изменить пароли для существующих пользователей

Для уже существующих учетных записей пользователей (учетная записьroot является наиболее подходящей) пароль можно указать с помощью директивыchpasswd.

Note: эта директиваonly должна использоваться в ситуациях отладки, потому что, опять же, значение будет доступно каждому пользователю в системе в течение всего срока службы сервера. Это даже более актуально в этом разделе, потому что пароли, отправленные с этой директивой, должны быть указаны вplain text.

Основной синтаксис выглядит так:

#cloud-config
chpasswd:
  list: |
    user1:password1
    user2:password2
    user3:password3
  expire: False

Директива содержит два ключа ассоциативного массива. Ключlist будет содержать блок, в котором перечислены имена учетных записей и связанные с ними пароли, которые вы хотите назначить. Ключexpire - это логическое значение, которое определяет, нужно ли менять пароль при первой загрузке или нет. По умолчанию это «True».

Следует отметить, что вы можете установить пароль «RANDOM» или «R», который будет генерировать случайный пароль и записывать его в/var/log/cloud-init-output.log. Имейте в виду, что этот файл доступен любому пользователю в системе, поэтому он не является более безопасным.

Записать файлы на диск

Для записи файлов на диск следует использовать директивуwrite_files.

Каждый файл, который должен быть записан, представлен элементом списка в соответствии с директивой. Эти элементы списка будут ассоциативными массивами, которые определяют свойства каждого файла.

Единственными обязательными ключами в этом массиве являютсяpath, который определяет, куда записывать файл, иcontent, который содержит данные, которые вы хотите, чтобы файл содержал.

Доступные ключи для настройки элементаwrite_files:

  • path: Абсолютный путь к месту в файловой системе, куда должен быть записан файл.

  • content: содержимое, которое должно быть помещено в файл. Для многострочного ввода вы должны начать блок, используя символ канала (|) в строке «контент», за которым следует блок с отступом, содержащий контент. Двоичные файлы должны содержать «!! binary» и пробел перед символом канала.

  • owner: учетная запись пользователя и группа, которым следует предоставить право собственности на файл. Они должны быть указаны в формате «имя пользователя: группа».

  • permissions: восьмеричный набор разрешений, который должен быть предоставлен для этого файла.

  • encoding: необязательная спецификация кодировки для файла. Это может быть «b64» для файлов Base64, «gzip» для сжатых файлов Gzip или «gz + b64» для комбинации. Оставляя это, будет использоваться стандартный тип файла по умолчанию.

Например, мы могли бы записать файл в/test.txt с содержимым:

Here is a line.
Another line is here.

Частьcloud-config, которая будет выполнять это, будет выглядеть следующим образом:

#cloud-config
write_files:
  - path: /test.txt
    content: |
      Here is a line.
      Another line is here.

Обновление или установка пакетов на сервере

Для управления пакетами необходимо учитывать несколько связанных настроек и директив.

Чтобы обновить базу данных apt в дистрибутивах на основе Debian, вы должны установить для директивыpackage_update значение «true». Это синоним вызоваapt-get update из командной строки.

Значение по умолчанию на самом деле «true», поэтому вам нужно беспокоиться об этой директиве, только если вы хотите ее отключить:

#cloud-config
package_update: false

Если вы хотите обновить все пакеты на вашем сервере после его первой загрузки, вы можете установить директивуpackage_upgrade. Это похоже наapt-get upgrade, выполняемый вручную.

По умолчанию для этого параметра установлено значение «false», поэтому убедитесь, что для него задано значение «true», если вам нужна функциональность:

#cloud-config
package_upgrade: true

Чтобы установить дополнительные пакеты, вы можете просто перечислить имена пакетов, используя директиву «packages». Каждый элемент списка должен представлять пакет. В отличие от двух команд, приведенных выше, эта директива будет работать с управляемыми дистрибутивами yum или apt.

Эти предметы могут принимать одну из двух форм. Первая - это просто строка с названием пакета. Вторая форма представляет собой список из двух пунктов. Первый элемент этого нового списка - это имя пакета, а второй элемент - номер версии:

#cloud-config
packages:
  - package_1
  - package_2
  - [package_3, version_num]

Директива «packages» устанавливает дляapt_update значение true, отменяя любые предыдущие настройки.

Настройте ключи SSH для учетных записей пользователей и демона SSH

Вы можете управлять ключами SSH в директивеusers, но вы также можете указать их в специальном разделеssh_authorized_keys. Они будут добавлены в файл с указанным первым авторизованным пользователем.

Это принимает тот же общий формат ключевой спецификации в директивеusers:

#cloud-config
ssh_authorized_keys:
  - ssh_key_1
  - ssh_key_2

Вы также можете заранее сгенерировать закрытые ключи сервера SSH и поместить их в файловую систему. Это может быть полезно, если вы хотите заранее предоставить своим клиентам информацию об этом сервере, позволяя ему доверять серверу, как только он подключится к сети.

Для этого мы можем использовать директивуssh_keys. Это может принимать пары ключей для ключей RSA, DSA или ECDSA с использованиемrsa_private,rsa_public,dsa_private,dsa_public,ecdsa_private иecdsa_public. ) s подпункты.

Поскольку форматирование и разрывы строк важны для закрытых ключей, при их указании обязательно используйте блок с ключом канала. Кроме того, выmust включаете строки ключа начала и конца, чтобы ваши ключи были действительными.

#cloud-config
ssh_keys:
  rsa_private: |
    -----BEGIN RSA PRIVATE KEY-----
    your_rsa_private_key
    -----END RSA PRIVATE KEY-----

  rsa_public: your_rsa_public_key

Настройка доверенных сертификатов CA

Если ваша инфраструктура основана на ключах, подписанных внутренним центром сертификации, вы можете настроить свои новые машины на доверие к сертификату CA, введя информацию о сертификате. Для этого мы используем директивуca-certs.

Эта директива имеет два подпункта. Первый -remove-defaults, который, если установлен в true, удалит всю обычную информацию о доверии сертификатов, включенную по умолчанию. Обычно это не требуется и может привести к некоторым проблемам, если вы не знаете, что делаете, поэтому используйте с осторожностью.

Второй элемент -trusted, это список, каждый из которых содержит сертификат доверенного ЦС:

#cloud-config
ca-certs:
  remove-defaults: true
  trusted:
    - |
      -----BEGIN CERTIFICATE-----
      your_CA_cert
      -----END CERTIFICATE-----

Настройте resolv.conf для использования определенных DNS-серверов

Если вы настроили свои собственные DNS-серверы, которые хотите использовать, вы можете управлять файлом resolv.conf своего сервера с помощью директивыresolv_conf. В настоящее время это работает только для дистрибутивов на основе RHEL.

В соответствии с директивойresolv_conf вы можете управлять своими настройками с помощью элементовnameservers,searchdomains,domain иoptions.

Директиваnameservers должна принимать список IP-адресов ваших серверов имен. Директиваsearchdomains принимает список доменов и поддоменов для поиска, когда пользователь указывает хост, но не домен.

domain устанавливает домен, который следует использовать для любых неразрешимых запросов, аoptions содержит набор параметров, которые могут быть определены в файле resolv.conf.

Если вы используете директивуresolv_conf, вы должны убедиться, что директиваmanage-resolv-conf также имеет значение true. В противном случае ваши настройки будут проигнорированы:

#cloud-config
manage-resolv-conf: true
resolv_conf:
  nameservers:
    - 'first_nameserver'
    - 'second_nameserver'
  searchdomains:
    - first.domain.com
    - second.domain.com
  domain: domain.com
  options:
    option1: value1
    option2: value2
    option3: value3

Выполнить произвольные команды для большего контроля

Если ни одно из управляемых действий, предоставляемыхcloud-config, не работает для того, что вы хотите сделать, вы также можете запускать произвольные команды. Вы можете сделать это с помощью директивыruncmd.

Эта директива принимает список элементов для выполнения. Эти элементы могут быть указаны двумя различными способами, которые будут влиять на то, как они обрабатываются.

Если элемент списка представляет собой простую строку, весь элемент будет передан процессу оболочкиsh для запуска.

Другой вариант - передать список, каждый элемент которого будет выполняться аналогично тому, какexecve обрабатывает команды. Первый элемент будет интерпретироваться как команда или сценарий для запуска, а следующие элементы будут переданы в качестве аргументов для этой команды.

Большинство пользователей могут использовать любой из этих форматов, но гибкость позволяет вам выбрать лучший вариант, если у вас есть особые требования. Любой вывод будет записан в стандартный формат и в файл/var/log/cloud-init-output.log:

#cloud-config
runcmd:
  - [ sed, -i, -e, 's/here/there/g', some_file]
  - echo "modified some_file"
  - [cat, some_file]

Завершение работы или перезагрузка сервера

В некоторых случаях вы захотите завершить работу или перезагрузить сервер после выполнения других элементов. Вы можете сделать это, установив директивуpower_state.

Эта директива имеет четыре подпункта, которые могут быть установлены. Этоdelay,timeout,message иmode.

delay указывает, как долго в будущем должен произойти перезапуск или завершение работы. По умолчанию это будет «сейчас», то есть процедура начнется немедленно. Чтобы добавить задержку, пользователи должны указать в минутах время, которое должно пройти, в формате+<num_of_mins>.

Параметрtimeout принимает значение без единиц измерения, которое представляет количество секунд ожидания завершения cloud-init перед запуском обратного отсчетаdelay.

Полеmessage позволяет указать сообщение, которое будет отправлено всем пользователям системы. mode указывает тип инициируемого события питания. Это может быть «отключение питания» для выключения сервера, «перезагрузка» для перезапуска сервера или «остановка», чтобы система могла решить, какое действие лучше (обычно выключение):

#cloud-config
power_state:
  timeout: 120
  delay: "+5"
  message: Rebooting in five minutes. Please save your work.
  mode: reboot

Заключение

Приведенные выше примеры представляют некоторые из наиболее распространенных элементов конфигурации, доступных при запуске файлаcloud-config. Есть дополнительные возможности, которые мы не рассмотрели в этом руководстве. К ним относятся настройка управления конфигурацией, настройка дополнительных репозиториев и даже регистрация по внешнему URL-адресу при инициализации сервера.

Вы можете узнать больше о некоторых из этих опций, проверив каталог/usr/share/doc/cloud-init/examples. Чтобы получить практическое руководство, которое поможет вам познакомиться с файламиcloud-config, вы можете следовать нашему руководству поhow to use cloud-config to complete basic server configuration здесь.

Related