Привет, Хабр! Продолжу серию статей об эффективном использовании Ansible для развертывания больших инфраструктур компаний.
В предыдущей статье я показывал, как мы формируем сети и располагаем в них хосты, используя Ansible inventory. Напомню на примере двух сетей — subnet_srv и dmz:
subnet_dmz:
hosts:
bind-vm:
servicename: bind
subnet_srv:
hosts:
gitlab-vm:
servicename: gitlab
serviceversion: "16.11.10"
dc-vm:
servicename: dc
serviceversion: "2.4"
Теперь расскажу, как мы конфигурируем установку отдельных развертываемых хостов и их сервисов, а также как связываются сервисы между собой.
Конфигурация хоста
Хост конфигурируем переменными Ansible. Для удобства вся конфигурация разделена на три пула переменных:
-
Полученные из основного Ansible inventory file. Отличительные особенности:
Основные переменные, с помощью которых мы конфигурируем информационные системы.
Все переменные жестко регламентированные.
Их можно использовать как контракты для внешних систем конфигурации.
-
Сформированные на основе переменных Ansible inventory file. Отличительная особенность:
Мы их не изменяем, но можем использовать для конфигурации Ansible-service (А-service)* при разработке. К примеру, FQDN любого хоста можно автоматически получать из hostname и домена (поддомена), которые мы задаем в основном файле inventory.
-
Заданные в Ansible-service (А-service). Отличительные особенности:
Применяется для настройки ролей и коллекций, используемых в нашем плейбуке A-service.
Может формироваться из двух других пулов переменных, описанных выше.
Не используется в динамической конфигурации.
Ansible-service (A-service)
Что такое A-service и как мы его формируем достойна отдельной статьи, поэтому, будет рассказано позже. В приближении, это playbook разворачивания хоста и его сервиса с заложенной конфигурацией. К примеру: развернуть Ubuntu 22 и GitLab 16.11.10 только указав для хоста имя A-service и версию вложенного приложения, в данном случае Gitlab.
Заложенная конфигурация, это и есть третий пул переменных конфигурирования.
В рамках статьи рассмотрим только первый и второй пул переменных.
Пример настройки хоста:
all:
vars:
domain: 'zu.stf'
children:
subnet_srv:
vars:
external_router: router1
cidrip: 10.125.0.225/27
hosts:
gitlab:
number_in_subnet: 6
# dns: 'bind'
# dc: 'dc'
servicename: gitlab
serviceversion: "16.11.10"
Основное: смотрим, какой A-service нужно запустить, по названию переменной servicename. Это gitlab.
-
Для развертывания виртуальной машины и подключения нужны IP-адрес и учетные данные:
IP-адрес получаем из переменных cidrip (подсеть) и number_in_subnet (номер по порядку в допсети).
Учетные данные заложены во втором пуле переменных. Они соответствуют шаблону ОС на платформе, с помощью которых развертывается виртуальная машина.
A-service проверяет переменную версии приложения — serviceversion. Будет развернута именно указанная версия.
В качестве имени машины будет использовано имя хоста inventory.
Получили: развернута машина на Ubuntu 22 (шаблон по умолчанию) с IP-адресом 10.125.0.231 и установленным GitLab версии 16.11.10.
Конфигурация хоста со ссылками на другие хосты
Как вы заметили, в YAML-коде выше были закомментированы строки:
# dns: 'bind'
# dc: 'dc'
В этих параметрах указано, какой хост является DNS-сервером (куда ходить за резолвом), а какой — контроллером домена (где будет выполняться аутентификация пользователей для GitLab). Полный файл YAML будет выглядеть следующим образом:
all:
vars:
domain: 'zu.stf'
children:
subnet_dmz:
vars:
external_router: router1
cidrip: 10.12.0.1/27
hosts:
bind:
number_in_subnet: 3
servicename: bind
subnet_srv:
vars:
external_router: router1
cidrip: 10.125.0.225/27
hosts:
gitlab:
number_in_subnet: 6
# dns: 'bind'
# dc: 'dc'
servicename: gitlab
serviceversion: "16.11.10"
dc:
number_in_subnet: 7
dns: 'bind'
servicename: dc
Рассмотрим настройку DNS:
A-service, который запускал установку GitLab, проверяет наличие переменной dns.
Из переменной dns получаем имя хоста — bind.
Через стандартный словарь Ansible — hostvars['bind'] — получаем IP-адрес.
При настройке сети машины с GitLab указываем полученный IP-адрес.
Рассмотрим настройку контроллера домена:
A-service, который запускал установку GitLab, проверяет наличие переменной dc.
Из переменной dc получаем имя хоста — dc.
Через стандартный словарь Ansible — hostvars['dc'] — получаем IP-адрес и учетные данные.
Для подключения GitLab к контроллеру домена заходим в контроллер через делегирование и создаем учетную запись для аутентификации.
Добавляем созданную учетную запись на GitLab.
Конфигурация хоста с помощью параметров других хостов
Мы уже использовали переменные других хостов inventory для настройки целевого хоста через переменную hostvars[].
К примеру, можно было не создавать в A-service GitLab учетную запись для контроллера домена, а получать все хосты, для которых нужно создать учетные данные, в A-service dc. Но нам это не подошло, так как сервис GitLab мы устанавливаем после контроллера домена. У вас может быть своя приоритизация установки A-service.
Введем новую сущность — артефактные переменные.
Артефактные переменные
При развертывании сервисов могут оставаться артефакты: переменные, учетные данные, ключи и т. п. Все данные, которые можно в дальнейшем использовать, мы сохраняем в качестве переменных Ansible inventory хоста в ./host_vars установленного хоста. Их мы и называем артефактными переменными.
Рассмотрим пример установки workstation и iTop.
Для работы workstation нам нужно:
Добавить рабочую станцию в домен.
Создать учетную запись на контроллере домена.
Для работы iTop нужны:
Учетная запись на контроллере домена.
Учетная запись от workstation.
YAML-конфигурация будет выглядеть следующим образом:
all:
vars:
domain: 'zu.stf'
children:
subnet_dmz:
vars:
external_router: router1
cidrip: 10.12.0.1/27
hosts:
bind:
number_in_subnet: 3
servicename: bind
subnet_srv:
vars:
external_router: router1
cidrip: 10.125.0.225/27
hosts:
ws1:
number_in_subnet: 4
dns: 'dc'
dc: 'dc'
itop: 'itop'
servicename: workstation
itop:
number_in_subnet: 8
dns: 'dc'
dc: 'dc'
servicename: itop
dc:
number_in_subnet: 7
dns: 'bind'
servicename: dc
Настройка workstation:
Настройка DNS (как для GitLab).
Добавление доменного пользователя (как для GitLab).
Сохранение учетных данных, сгенерированных на контроллере домена, в ./host_vars/aduser.yml в переменной aduser_list.
Настройка iTop:
Настройка DNS (как для GitLab).
Добавление доменного пользователя (как для GitLab).
Поиск хостов, у которых значение параметра hostvars['item'].itop совпадает с именем хоста iTop.
Добавление найденных пользователей в базу iTop для аутентификации.
Настройка iTop на контроллере домена.
Проверка того, что все пользователи, которых нужно указать в iTop, добавлены.
Итог
-
Определили формат конфигурирования хоста:
внутренних параметров (версия приложения, IP-адрес);
статических параметров, зависящих от других хостов (DNS, контроллера домена);
динамических параметров (доменных пользователей для iTop), зависящих от других хостов.
Рассмотрели сценарии конфигурирования хоста.
Определили расположение переменных конфигурирования (это необходимо не только для настройки, но и для разработки).
Описали важность такой переменной, как hostvars[].