Используемые термины: Ansible , CentOS , Ubuntu .
Мы рассмотрим простую устаноку Ansible на Linux. Инструкция подойдет для Ubuntu, а также Rocky/CentOS.
Установка Ansible на Linux
Базовая настройка и запуск ad-hoc команды
Подключение без ввода пароля
Применение плейбуков
Диагностика проблем
Дополнительные материалы
Выполним как саму установку ansible, так и дополнительные коллекции.
Установка для различных дистрибутивов Linux выполняется, немного, по-разному. Рассмотрим варианты.
Выполняем команды:
apt update
apt install ansible
По умолчанию Ansible нет в репозитории CentOS — устанавливаем EPEL:
yum install epel-release
После устанавливаем сам сервер управления:
yum install ansible
* система автоматически обновит список пакетов с учетом нового репозитория и начнет установку Ansible. Если появится запрос на подтверждение, отвечаем Y.
Устанавливаем ансибл командой:
dnf install ansible
Так как ansible является приложением python, его можно установить модулем с помощью менеджера pip. Данный способ является универсальным для всех операционных систем, а также предоставляет больший диапазон версий для установки.
Для начала необходимо убедиться, что у нас установлен pip пакет. Для разных систем это делается по своему.
а) Для Deb (Debian / Ubuntu / Astra Linux):
apt install python3-pip
б) Для RPM (Rocky Linux / РЕД ОС):
dnf install python3-pip
После установки python-pip можно установить модуль ansible.
Выполняем команду:
python3 -m pip install ansible-core
Если нам нужна конкретная версия, то указываем ее во время установки:
python3 -m pip install ansible-core==2.15
* в нашем примере будет устанавливаться версия 2.15. Ознакомиться со списком версий можно на сайте pypi.org .
Проверить установленную версию приложения можно командой:
ansible —version
Рекомендуется сразу установить или обновить стандартные коллекции для задач Ansible:
ansible-galaxy collection install community.general
Разобьем наши действия на небольшие группы.
В данном файле хранится информация о хостах и/или группах хостов. Также в нем могет храниться переменные, определенные для конкретной группы хостов или конкретного компьютера.
Есть два варианта написания инвентарного файла — в формате yml или ini. Рассмотрим оба.
1. Файл формата ini.
Даннай формат используется по умолчанию. Откроем на редактирование файл с серверами, которыми хотим управлять:
vi /etc/ansible/hosts
и приведем его к следующему виду:
[test_servers]
192.168.1.100
192.168.1.101
* в данном примере создана группа серверов test_servers, в которую добавлены два сервера с IP-адресами 192.168.1.100 и 192.168.1.101.
2. Файл формата yml.
Создадим отдельный каталог:
mkdir /etc/ansible/inventory
И создадим файл:
vi /etc/ansible/inventory/test_servers.yml
—
test_servers:
vars:
ansible_python_interpreter: /usr/bin/python3
hosts:
server01:
ansible_ssh_host: 192.168.1.100
ansible_ssh_port: 22
server02:
ansible_ssh_host: 192.168.1.101
ansible_ssh_port: 22
server03:
ansible_connection: local
* в данном примере также создана группа серверов test_servers, в которую добавлены три сервера server01 и server02 с IP-адресами 192.168.1.100 и 192.168.1.101 , а также server03 , который является локальным сервером с типом подключения local . Адреса не обязательно писать, если имя машины разрешается с помощью DNS. Также не обязательно указывать порты, если они стандартные (22).
** обратите внимание, что мы также добавили переменную ansible_python_interpreter с указанием пути для запуска python.
Открываем конфигурационный файл ansible:
vi /etc/ansible/ansible.cfg
Для более новых версий ansible конфигурационный файл не создается. Создаем для него каталог и сам файл:
mkdir /etc/ansible
vi /etc/ansible/ansible.cfg
Снимаем комментарий с опции host_key_checking , приведя ее к виду:
host_key_checking = False
* данная настройка позволит нашему серверу управления автоматически принимать ssh fingerprint, избавляя нас от необходимости постоянно вводить yes , когда мы впервые конфигурируем новый сервер.
Также в секцию defaults добавим:
[defaults]
…
interpreter_python = auto_silent
* данная опция указывает, чтобы ansible автоматически искал python на целевом хосте без показа предупреждений.
Теперь выполним проверку доступности добавленных серверов:
ansible -m ping test_servers -u root -kK
* данная команда проверит доступность по сети двух серверов из группы test_servers от учетной записи root .
1. Если мы создали и хотим использовать инвентарный файл yml, то вводим:
ansible -i /etc/ansible/inventory/test_servers.yml -m ping test_servers -u root -kK
* мы должны указать путь до файла inventory с помощью опции -i.
2. Если мы хотим выполнить сценарий, подключившись к локальному компьютеру, то выполняем:
ansible -m ping localhost —connection=local
Если подключение не local, будет запрошен пароль от учетной записи (в нашем случае, root). После будет запрошен пароль суперпользователя на серверах.
На экране должно появиться, примерно, следующее:
192.168.1.100 | SUCCESS => {
«ansible_facts»: {
«discovered_interpreter_python»: «/usr/bin/python3»
},
«changed»: false,
«ping»: «pong»
}
192.168.1.101 | SUCCESS => {
«ansible_facts»: {
«discovered_interpreter_python»: «/usr/bin/python»
},
«changed»: false,
«ping»: «pong»
}
Наш сервер управления готов к работе.
В нашем примере аутентификация на узлах выполняется с помощью пароля. Это не очень удобно и безопасно. Рассмотрим вариант использования ssh ключа.
На компьютере с ansible сгенерируем пару ключей следующей командой:
ssh-keygen -t ed25519
После нажатия Enter система попросит ввести параметры размещения ключа и пароль. Ничего не меняем, нажимая ввод и соглашаясь со значениями по умолчанию.
Мы увидим что-то на подобие:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519
Your public key has been saved in /root/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:FTDGR6Gz92WI33/ywMSImcqfx2IRQjrD20tE/qzqZ5Y root@ansible.remontka.com
The key’s randomart image is:
+—[ED25519 256]—+
| .+o+. |
| .+o.. |
| . =o.. |
| = ++.= + |
| *S+*.o = |
| ..oo+o * |
| .o+ oo + |
| E.o.o .o.|
| .o= .oo o+|
+—-[SHA256]——+
* обратите внимание, что мы сгенерировали ключи под пользователем root и из местоположение в каталоге /root/.ssh .
Теперь скопируем публичный ключ на все серверы, к которым будем подключаться:
ssh-copy-id -i /root/.ssh/id_ed25519.pub root@192.168.1.100
ssh-copy-id -i /root/.ssh/id_ed25519.pub root@192.168.1.101
* в нашем примере мы копируем наш ключ для пользователя root на удаленной системе.
Мы также можем скопировать ключ вручную. Для этого содержимое публичного файла (в нашем случае, id_ed25519.pub ) добавить в файл authorized_keys для нужного пользователя. Например:
mkdir /root/.ssh
vi /root/.ssh/authorized_keys
* в данном примере мы сможем подключиться к компьютеру с нашим сертификатом под пользователм root .
Готово. Попробуем подключиться по SSH без пароля к любому из серверов:
ssh root@192.168.1.100
Мы должны подключиться к серверу без запроса пароля.
Теперь можно попробовать запустить наш ансибл без ввода паролей:
ansible -m ping test_servers -u root
Или с использованием инвентарного файла yml:
ansible -i /etc/ansible/inventory/test_servers.yml -m ping test_servers -u root
Команда должна выполниться без запросов пароля.
Плейбук представляет из себя файл, в котором мы перечисляем список задач и/или ролей для выполнения ансиблом. Более того, в нем можно задать переменные и поведение работы ansible. Рассмотрим пример:
vi my_play.yml
— hosts: all
gather_facts: yes
user: root
vars:
app_ver: 14
roles:
— role: prepare
— role: install
— role: settings
— hosts: server1
gather_facts: no
user: root
tasks:
— name: install curl
package:
name: curl
state: present
В данном примере мы выполняем 2 блока задач:
Теперь запустим плейбук командой:
ansible-playbook -i /etc/ansible/inventory/test_servers.yml ./my_play.yml
* мы используем созданный ранее инвентарный файл и запускаем плейбук my_play.yml .
В процессе запуска и работы с Ansible мы можем получить множество ошибок. Опишу некоторые из них.
Чаще всего, при запуске Ansible для нового хоста, мы можем получить ошибку соединения с хостом.
Причина: проблема, как правило, заключается в отсутствии прав на подключение к удаленному хосту по SSH.
Решение: введите с сервера ansible команду для подключения к удаленному хосту по SSH, например:
ssh root@192.168.1.100
* в данном случае, мы пытаемся подключиться к серверу 192.168.1.100 по SSH от пользователя root.
Если подключиться к серверу 192.168.1.100 вышеописанной командой не удалось, возможно введен неправильный пароль или доступ по SSH от root запрещен. В этом случае, создайте служебную учетную запись на сервере 192.168.1.100 и используйте ее для подключения по SSH. Например, на удаленном сервере вводим:
useradd ansible
passwd ansible
* в даном примере мы создали учетную запись ansible и задали ей пароль.
Теперь вводим нашу команду для проверки:
ansible -m ping test_servers -u ansible -kK
* обратите внимание, что мы выполняем теперь запрос от пользователя ansible .
Ansible для своей работы использует модули, разработанные на языке Python. Чтобы он мог запускать вне необходимые команды, мы должны обеспечить наличие в системе соответсвующих модулей, а также удовлетворить требования по их версии.
Причина: в системе не установлен нужный для работы ансибл модуль питона или модуль есть, но его версия не подходит.
Решение: устанавливать и обновлять модули python мы можем с помощью утилиты pip.
Предположим, что мы получили ошибку:
Python Module not found: firewalld and its python module are required for this module, version 0.2.11 or newer required (0.3.9 or newer for offline operations)
В ошибке сказано, что нам нужен модуль firewall. Установим его:
python3 -m pip install firewall
При получении ошибки:
No module named pip
… устанавливаем в систему пакет python3-pip .
При подключении и выполнении какого либо задания (например, setup) на удаленном хосте мы получаем ошибку, в тексте которой есть строка:
ModuleNotFoundError: No module named ‘ansible.module_utils.six.moves
Причина: несовместимость версии ansible и python. Например, если используется ansible версии 2.9, а на хосте python версии 3.12, мы получим данную ошибку.
Решение: удобнее всего обновить версию ansible. Посмотреть ее можно командой:
ansible —version
Обновление пакета стоит выполнить с использованием нативных репозиториев.
а) Для Deb (Debian / Ubuntu / Astra Linux):
apt update
apt install ansible
б) Для RPM (Rocky Linux / РЕД ОС):
dnf install ansible
После можно проверить работу сценария ansible, который выдавал ошибку.
Если обновление не помогло, значит встроенный репозиторий содержит устаревшую версию пакета. Данное поведение, как правило, характерно для систем на базе DEB. Для обновления, в таком случае, будем использовать репозиторий разработчика:
apt install software-properties-common
apt-add-repository ppa:ansible/ansible
И выполняем обновление:
apt install ansible
Другие инструкции про Ansible:
2. Примеры ролей Ansible для установки сервисов и настройки системы .
3. Как настроить Windows для управления с Ansible .
4. Использование роли и плейбука Ansible на примере установки и настройки NGINX .
Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…
Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…
Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…
Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…
YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…
Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…