Добавить в корзинуПозвонить
Найти в Дзене
ИТ-культура

Как получить исчерпывающую информацию о хостах с помощью Ansible

Возможно, каждый ИТ-специалист хоть раз в жизни сталкивался с необходимостью получения данных о параметрах, а также внесения изменений в конфигурацию большого (или не очень) количества хостов.
Для решения этой задачи существует инструмент под названием Ansible.
Под хостом в контексте статьи понимается серверная машина под управлением ОС Linux, неважно какого именно дистрибутива, имеющая предустановленный python3 (возможно, развернутая в Docker-контейнере). Что такое Ansible? Ansible - это система управления конфигурациями, которая применяется для автоматизации настройки и развертывания ПО.
Ссылка на документацию по Ansible - https://docs.ansible.com/ Постановка задачи:
Задача состоит из одного пункта, а именно: необходимо получить информацию об установленной версии ОС (название дистрибутива, версию дистрибутива, релиз). Для чего это может пригодится?
Предположим, в вашей организации планируется обновление и переход с CentOS 7 на CentOS 8 или CentOS 9. Чтобы вручную не проверять каж

Возможно, каждый ИТ-специалист хоть раз в жизни сталкивался с необходимостью получения данных о параметрах, а также внесения изменений в конфигурацию большого (или не очень) количества хостов.
Для решения этой задачи существует инструмент под названием 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).
  • Ведомые хосты (контролируемые) — это хосты, на которых будет происходить сбор информации.

Для подготовки к сбору информации нужно выполнить следующие шаги:

  1. Создать каталог в файловой системе, причем не важно, где именно, главное соблюдать права доступа на сам каталог\под каталоги и файлы.
  2. Внутри созданного каталога создать директорию inventory, в которую мы поместим файл с описанием хостов и параметрами подключения.
  3. Внутри каталога также создать директорию 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, которая представляет собой словарь с большим количеством информации о хостах. Рекомендую изменить сценарий в начале статьи на этот, выполнить и посмотреть результат.

Если статья вам понравилась, будет отлично, если поставите лайк и подпишетесь на канал =)