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.11 | Python 2.7, Python 3.5 – 3.9 | Python 2.6 – 2.7, Python 3.5 – 3.9 |
2.12 | Python 3.8 – 3.10 | Python 2.6 – 2.7, Python 3.5 – 3.10 |
2.13 | Python 3.8 – 3.10 | Python 2.7, Python 3.5 – 3.10 |
2.14 | Python 3.9 – 3.11 | Python 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. Еще больше примеров можно найти в документации по продукту.