Установка Ansible

Ansible – это инструмент для управления конфигурацией и развертываниями ПО на Linux системах. В этой публикации я покажу, как выполняется установка Ansible. Хотя установка – это громко сказано. По сути Ansible – это модуль для Python. И его установка может быть выполнена на любой сервер или рабочую станцию при условии наличии соответствующей версии Python. О предварительных требованиях я расскажу в соответствующем разделе.

Схема развертывания

Схема развертывания крайне простая:

В моей тестовой топологии будет Ansible сервер под управлением Ubuntu Server 22.04. Также для тестов я подготовил один сервер. Также под управлением Ubuntu Server 22.04.Собственно, этим сервером мы с вами и будем управлять с помощью Ansible.

Предварительные требования

Предварительные требования для использования Ansible крайне просты – необходимо, чтобы на том сервере, которые вы планируете использовать для установки Ansible была установлена необходимая версия Python. Аналогичные требования существуют и для тех серверов, на которых вы планировали использовать Ansible для управления конфигураций.

В таблице ниже приведен свод необходимых версий Python в зависимости от используемой версии Ansible. Таблица актуальна на момент подготовки публикации. Актуальную информацию вы всегда сможете найти в документации по продукту.

Версия AnsibleВерсия Python для сервера AnsibleВерсия Python для управляемых устройств
2.11Python 2.7, Python 3.5 – 3.9Python 2.6 – 2.7, Python 3.5 – 3.9
2.12Python 3.8 – 3.10Python 2.6 – 2.7, Python 3.5 – 3.10
2.13Python 3.8 – 3.10Python 2.7, Python 3.5 – 3.10
2.14Python 3.9 – 3.11Python 2.7, Python 3.5 – 3.11

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

Установка Ansible

Теперь я перейду непосредственно к установки Ansible. Первое, что необходимо проверить – это версия Python:

python -V
Python 3.10.6

Как видно из вывода выше, у меня установлена поддерживаемая версия Python. Теперь я могу перейти к следующем шагу – проверка наличия модуля pip для Python.

python3 -m pip -V
/usr/bin/python3: No module named pip

А вот модуля pip как раз и нет. Нужно его установить. В Ubuntu это можно сделать, например, вот такой командой:

sudo apt -y install python3-pip

Повторим проверку наличия модуля pip:

python3 -m pip -V
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)

Теперь все готово для самого главного шага – установка модуля Ansible:

python3 -m pip install ansible
roman@ansible:~$ python3 -m pip -V
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
roman@ansible:~$ python3 -m pip install ansible
Defaulting to user installation because normal site-packages is not writeable
Collecting ansible
  Downloading ansible-8.1.0-py3-none-any.whl (44.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 44.8/44.8 MB 10.5 MB/s eta 0:00:00
Collecting ansible-core~=2.15.1
  Downloading ansible_core-2.15.1-py3-none-any.whl (2.2 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2/2.2 MB 11.4 MB/s eta 0:00:00
Requirement already satisfied: jinja2>=3.0.0 in /usr/lib/python3/dist-packages (from ansible-core~=2.15.1->ansible) (3.0.3)
Requirement already satisfied: cryptography in /usr/lib/python3/dist-packages (from ansible-core~=2.15.1->ansible) (3.4.8)
Requirement already satisfied: PyYAML>=5.1 in /usr/lib/python3/dist-packages (from ansible-core~=2.15.1->ansible) (5.4.1)
Collecting packaging
  Downloading packaging-23.1-py3-none-any.whl (48 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 48.9/48.9 KB 18.4 MB/s eta 0:00:00
Collecting resolvelib<1.1.0,>=0.5.3
  Downloading resolvelib-1.0.1-py2.py3-none-any.whl (17 kB)
Installing collected packages: resolvelib, packaging, ansible-core, ansible
  WARNING: The scripts ansible, ansible-config, ansible-connection, ansible-console, ansible-doc, ansible-galaxy, ansible-inventory, ansible-playbook, ansible-pull and ansible-vault are installed in '/home/roman/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The script ansible-community is installed in '/home/roman/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed ansible-8.1.0 ansible-core-2.15.1 packaging-23.1 resolvelib-1.0.1
roman@ansible:~$ 

Как видно из вывода – установщик предупредил на о том, что директории установки нет в системной переменной PATH. Хотя, на самом деле она там есть.

printenv PATH

roman@ansible:~$ printenv PATH
/home/roman/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
roman@ansible:~$

Теперь проверим версию Ansible:

ansible --version
roman@ansible:~$ ansible --version
ansible [core 2.15.1]
  config file = None
  configured module search path = ['/home/roman/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/roman/.local/lib/python3.10/site-packages/ansible
  ansible collection location = /home/roman/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/roman/.local/bin/ansible
  python version = 3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0] (/usr/bin/python3)
  jinja version = 3.0.3
  libyaml = True
roman@ansible:~$ 

Дополнительно, если я, например, буду использовать подключение к управляемым серверам через логин и пароль, а не через ssh ключи, то необходимо установить утилиту sshpass:

sudo apt -y install sshpass 

Установка Ansible завершена.

Краткий пример использования

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

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

nano hosts.ini

Содержимое файла будет следующим:

[servers]
testserver ansible_host=10.10.10.107 ansible_user=roman

Немного расскажу про структуру файла инвентаризации. То, что написано в квадратных скобках ([servers]) – это имя группы. Вы можете передать имя группы при запуски playbook или команды или же использовать в задачах. Результат будет один – Ansible выполним указанное вами действия для всех хостов в заданной группе. Testserver – это имя хоста, вы можете указать любое значение. Ansible_host – это имя или ip-адрес, по которому следует подключаться к серверу. Ansible_user – говорит самом за себя. Это имя пользователя, под которым нужно подключаться к управляемому серверу.

Теперь сохраним изменения в файле и попробуем запустить нашу первую команду:

ansible servers -i hosts.ini -m ping

, где ansible – это одна из утилит ansible

servers – имя группы из файла инвентаризации

-i – в этом параметре мы передаем расположение нашего файла инвентаризации

-m – указание модуля Ansible. В примере используется модуль ping, который просто проверяет доступность хоста.

При первом подключении необходимо будет добавить открытый ключ сервера в список доверенных. Однако, первая попытка неудачна:

roman@ansible:~$ ansible servers -i hosts.ini -m ping
The authenticity of host '10.10.10.107 (10.10.10.107)' can't be established.
ED25519 key fingerprint is SHA256:kEcvfVmz3BHqAVcd2g2u/yBo+ke3aapnvfF/nMwvjnM.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
testserver | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '10.10.10.107' (ED25519) to the list of known hosts.\r\nroman@10.10.10.107: Permission denied (publickey,password).",
    "unreachable": true
}

Потому что дополнительно необходимо указать параметр -k, который запрашивает пароль для подключения. Повторим попытку:

ansible servers -i hosts.ini -m ping -k
roman@ansible:~$ ansible servers -i hosts.ini -m ping -k
SSH password: 
testserver | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
roman@ansible:~$ 

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

ansible servers -i hosts.ini -a "date" -k
roman@ansible:~$ ansible servers -i hosts.ini -a "date" -k
SSH password: 
testserver | CHANGED | rc=0 >>
Sun Jun 25 06:33:12 AM UTC 2023
roman@ansible:~$ 

Это были лишь базовые примеры использования Ansible. Еще больше примеров можно найти в документации по продукту.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *