Ansible практика – урок №1: Базовая настройка и первый запуск.

Предыдущий урок: Ansible практика – урок №0: Подготовка окружения.

В прошлый раз мы подготовили наше тестовое окружение и установили Ansible. Сегодня нас ждет базовая настройка ansible.cfg файла, отвечающего за параметры запуска Ansible. Создание простейшего inventory  и первый запуск программы.

Первым делом создадим отдельную директорию для ansible и перейдем в нее. Заходим в консоль Control Node и начинаем:

[root@Control-Node ~]# mkdir ansible

[root@Control-Node ~]# cd ansible/
[root@Control-Node ansible]#

Базовая настройка и первый запуск

Шаг 1: Создание простого inventory

Ansible Inventory — это список серверов, с которыми работает Ansible, с их адресами, характеристиками и группами. Такая адресная книга, содержащая вспомогательную информацию о том к кому и как подключаться.

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

С помощью текстового редактора создадим файл inventory в котором построчно перечислим названия и IP адреса Managed нод. В моем случае это:

Managed-Node-1 ansible_host=192.168.0.151
Managed-Node-2 ansible_host=192.168.0.152

Первый столбец – название хоста в рамках Ansible, простые и описательные имена, чтобы вы сами понимали, что это за сервер. ansible_host – физический адрес хоста, может быть задан в качестве доменного имени или IP адреса.

Проверим, что наш инвентори работает. Запустим следующую команду:

[root@Control-Node ansible]# ansible -i inventory all --key-file ~/.ssh/ansible -m 'ping'
Managed-Node-2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
Managed-Node-1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
[root@Control-Node ansible]#

Использованные параметры:

i inventory – указание файла инвентори
all – хосты, с которыми будет работать Ansible
key-file ~/.ssh/ansible – SSH ключ, с которым Ansible будет подключаться к хостам
m ‘ping’ – использование модуля

Ansible запустил модуль ping (m ‘ping’) проверяющий доступность хоста, отправил запрос на подключение с использованием ключа (key-file ~/.ssh/ansible) к каждому (all) хосту, перечисленному в инвентори (i inventory) и успешно подключился.

Мы создали наш первый inventory и совершили успешный запуск Ansible.

Шаг 2: Настройка ansible.cfg файла

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

Используем текстовый редактор, чтобы создать файл ansible.cfg следующего содержания:

[defaults]
inventory=<название_файла>
remote_user=<имя пользователя>

[ssh_connection]
ssh_args=-p <номер_порта> -i <файл_ключа>

Объяснение параметров:

inventory – файл со списком хостов, используемый по умолчанию
remote_user – пользователь под которым осуществляется подключение к управляемым хостам, например, если вы используете отдельного пользователя для управления серверами.
ssh_args – параметры SSH подключения, на случай если вы используете нестандартный порт или хотите изменить другие параметры подключения.

Это далеко не все параметры, которые можно регулировать с помощью ansible.cfg, но на данном этапе нам этого достаточно.

У меня получились такие настройки:

[root@Control-Node ansible]# cat ansible.cfg
[defaults]
inventory=inventory
remote_user=root

[ssh_connection]
ssh_args=-p 22 -i ~/.ssh/ansible 
[root@Control-Node ansible]#

Повторим наш тестовый запуск Ansible ping, но на этот раз исключим из команды параметры, внесенные в конфиг файл:

[root@Control-Node ansible]# ansible all -m 'ping'
Managed-Node-1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
Managed-Node-2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
[root@Control-Node ansible]#

Результат тот же, значит, наши настройки вступили в силу.

Шаг 3: gather_facts сбор информации о хостах

Ansible может собирать основную информацию о серверах, как то – IP адреса, ОС и прочее. Это помогает подстраиваться под окружение. За сбор информации отвечает модуль gather_facts, запустим его для наших хостов:

[root@Control-Node ansible]# ansible all -m gather_facts
Managed-Node-1 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.0.151"
        ],
...
        "ansible_bios_version": "VirtualBox",
...
        "ansible_default_ipv4": {
            "address": "192.168.0.151",
...
        "ansible_distribution": "CentOS",
        "ansible_distribution_file_parsed": true,
        "ansible_distribution_file_path": "/etc/centos-release",
        "ansible_distribution_file_variety": "CentOS",
        "ansible_distribution_major_version": "9",
        "ansible_distribution_release": "Stream",
        "ansible_distribution_version": "9",
...
}
Managed-Node-2 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.0.152"
        ],
...
        "ansible_default_ipv4": {
            "address": "192.168.0.152",
...
        "ansible_distribution": "CentOS",
        "ansible_distribution_file_parsed": true,
        "ansible_distribution_file_path": "/etc/centos-release",
        "ansible_distribution_file_variety": "CentOS",
        "ansible_distribution_major_version": "9",
        "ansible_distribution_release": "Stream",
        "ansible_distribution_version": "9",
...
}
[root@Control-Node ansible]#

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

Шаг 4: Первый запуск Ansible, исполнение команды на удаленном хосте

По сути, мы уже запускали Ansible, используя модули, однако это не вносило никаких изменений на управляемых серверах. Давайте исполним простую команду – создадим тестовый файл.

Сначала зайдем на Managed-Node-1 и проверим отсутствие файла:

[root@Managed-Node-1 ~]# ls /tmp/test_file.txt
ls: cannot access '/tmp/test_file.txt': No such file or directory
[root@Managed-Node-1 ~]#

Можете перепроверить и Managed-Node-2, но я уверен, что и там файл отсутствует.

Возвращаемся к контрольной машине. Выполним команду:

[root@Control-Node ansible]# ansible all -a 'touch /tmp/test_file.txt'
Managed-Node-1 | CHANGED | rc=0 >>

Managed-Node-2 | CHANGED | rc=0 >>

[root@Control-Node ansible]#

Использованные параметры:

all – хосты, над которыми выполняет действие Ansible
a ‘touch /tmp/test_file.txt’ – команда выполняемая на хостах

Зайдем на Managed Node и проверим, появился ли файл:

[root@Managed-Node-1 ~]# ls /tmp/test_file.txt
/tmp/test_file.txt
[root@Managed-Node-1 ~]#

Видим, что Ansible успешно отработал и создал тестовый файл на управляемых хостах.

Итоги:

Сегодня мы провели базовую настройку Ansible, составили наш первый inventory и провели пару тестовых запусков программы с внесением изменений на хосты и без. Так же мы узнали, как и какую Ansible собирает информацию о хостах.

Следующий урок: Ansible практика – урок №2: Как запустить первый плейбук.