Возможно, каждый ИТ-специалист хоть раз в жизни сталкивался с необходимостью получения данных о параметрах, а также внесения изменений в конфигурацию большого (или не очень) количества хостов.
Для решения этой задачи существует инструмент под названием Ansible.
Под хостом в контексте статьи понимается серверная машина под управлением ОС Linux, неважно какого именно дистрибутива, имеющая предустановленный python3 (возможно, развернутая в Docker-контейнере).
Что такое Ansible?
Ansible - это система управления конфигурациями, которая применяется для автоматизации настройки и развертывания ПО.
Ссылка на документацию по Ansible - https://docs.ansible.com/
Постановка задачи:
Задача состоит из одного пункта, а именно: необходимо получить информацию об установленной версии ОС (название дистрибутива, версию дистрибутива, релиз).
Для чего это может пригодится?
Предположим, в вашей организации планируется обновление и переход с CentOS 7 на CentOS 8 или CentOS 9. Чтобы вручную не проверять каждый сервер или не создавать скрипт на Python, вы можете использовать инструмент, предназначенный для этой цели. Это позволит автоматизировать сбор информации о необходимых хостах.
Немного теории (без нее никуда):
Для выполнения поставленных задач автоматизации в Ansible, используется следующие части:
1. Файл инвентаризации хостов (inventory) - нужен для указания списка хостов, к которым буду применяться скрипты автоматизации и дополнительные параметры
2. Собственно сами скрипты (playbooks), или сценарии (кому как удобно, главное, что смысл ясен) - скрипты в Ansible пишутся в формате .yaml, со своей некой структурой, в которой имеется совокупность задач (tasks), применяемых к хостам.
Подготовка:
Не буду описывать, как именно устанавливать Ansible (информацию по установке можно посмотреть в документации по Ansible), важно знать, что Ansible делится на две части:
- Мастер-нода — это хост, на котором установлен Ansible и с которого запускается выполнение сценариев (playbooks).
- Ведомые хосты (контролируемые) — это хосты, на которых будет происходить сбор информации.
Для подготовки к сбору информации нужно выполнить следующие шаги:
- Создать каталог в файловой системе, причем не важно, где именно, главное соблюдать права доступа на сам каталог\под каталоги и файлы.
- Внутри созданного каталога создать директорию inventory, в которую мы поместим файл с описанием хостов и параметрами подключения.
- Внутри каталога также создать директорию playbooks, в которой будут содержаться сами скрипты (плейбуки).
Создаем inventory файл:
В созданном ранее каталоге inventory, нужно создать файл hosts.ini (название файла можно указать любое), в данный файл нужно поместить следующее содержимое (для примера будет использоваться 1 группа хостов и один хост в этой группе, на практике количество групп может быть любое и можно даже группы хостов разбить на отдельные файлы):
[main]
172.22.168.0 ansible_ssh_user=admin ansible_ssh_pass=1234
В данном случае:
- main — название группы,
- 172.22.168.0 — IP-адрес хоста,
- ansible_ssh_user — пользователь для подключения SSH,
- ansible_ssh_pass — пароль пользователя.
На данном этапе подготовка inventory файла выполнена, переходим к созданию самого сценария.
Создание сценария (Play):
В директории playbooks, создаем файл check_host_release.yaml со следующим содержимым:
---
- name: "Проверяем название ОС, версию дистрибутива и релиз"
hosts: main
gather_facts: true
tasks:
- name: "Смотрим версию ОС"
debug:
msg: "OS:{{ansible_facts.distribution}} release:{{ansible_facts.distribution_release}} version:{{ansible_facts.distribution_version}}"
В данном сценарии мы указываем название нашего playbook'а (на языке Ansible "Play"), выбираем группу хостов main (где содержится один хост 172.22.168.0), в переменной gather_facts указываем, что необходимо собрать информацию о хосте (на самом деле информации собирается большое кол-во), и собственно описание наших задач (в рамках примера только 1 задача с названием -"Смотрим версию ОС" ), далее, мы используем модуль debug для вывода информации об ОС через переменную msg и подставляем интересующие нас переменные в формате шаблонизатора jinja2, где:
- в {{ansible_facts.distribution}} - содержится информация об названии ОС,
- в {{ansible_facts.distribution_release}} - содержится информация о релизе,
- в {{ansible_facts.distribution_version}} - содержится информация о версии дистрибутива.
Запускаем сценарий:
Для запуска сценария, нужно перейти в корневой каталог проекта Ansible в терминале и выполнить следующую команду:
ansible-playbook -i inventory/hosts.ini playbooks/check_host_release.yaml
Результат выполнения сценария:
PLAY [Проверяем название ОС, версию дистрибутива и релиза] *******************************************************************************
TASK [Gathering Facts] *******************************************************************************
ok: [172.22.168.0]
TASK [Смотрим версию ОС] *******************************************************************************
ok: [172.22.168.0] => {
"msg": "OS:Ubuntu release:noble version:24.04"
}
PLAY RECAP *******************************************************************************
172.22.168.0 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Как видим, выполняются описанные нами шаги в сценарии и мы получаем название ОС (в данном случае - это Ubuntu), название релиза (noble) и версию дистрибутива (24.04).
На этом задача выполнена. С помощью этого скрипта и Ansible можно собирать интересующую нас информацию о большом количестве хостов.
П. С.
В заголовке статьи написано "Как получить исчерпывающую информацию о хостах с помощью Ansible", но информацию, которую возвращает скрипт исчерпывающей не назовешь. Для того, чтобы действительно получить исчерпывающую информацию о хостах, можно изменить сценарий следующим образом:
---
- name: "Проверяем название ОС, версию дистрибутива и релиза"
hosts: main
gather_facts: true
tasks:
- name: "Смотрим всю доступную информацию о хосте"
debug:
msg: "{{ansible_facts}}"
Мы изменили задачу на вывод всей переменной ansible_facts, которая представляет собой словарь с большим количеством информации о хостах. Рекомендую изменить сценарий в начале статьи на этот, выполнить и посмотреть результат.
Если статья вам понравилась, будет отлично, если поставите лайк и подпишетесь на канал =)