Инструкция по установке и запуску Ansible на Linux

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: Ansible, CentOS, Ubuntu.

Мы рассмотрим простую устаноку Ansible на Linux. Инструкция подойдет для Ubuntu, а также Rocky/CentOS.

Установка

Установка для Ubuntu и CentOS выполняется, немного, по-разному. Рассмотрим оба варианта.

Ubuntu

Выполняем команды:

apt update

apt install ansible

CentOS

По умолчанию Ansible нет в репозитории CentOS — устанавливаем EPEL:

yum install epel-release

После устанавливаем сам сервер управления:

yum install ansible

* система автоматически обновит список пакетов с учетом нового репозитория и начнет установку Ansible. Если появится запрос на подтверждение, отвечаем Y.

Начальная настройка и тестовый запуск Ansible

Разобьем наши действия на небольшие группы.

Настройка инвентарного файла

В данном файле хранится информация о хостах и/или группах хостов. Также в нем могет храниться переменные, определенные для конкретной группы хостов или конкретного компьютера.

Есть два варианта написания инвентарного файла — в формате 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

* в данном примере также создана группа серверов test_servers, в которую добавлены два сервера server01 и server02 с IP-адресами 192.168.1.100 и 192.168.1.101. Адреса не обязательно писать, если имя машины разрешается с помощью DNS. Также не обязательно указывать порты, если они стандартные (22).
** обратите внимание, что мы также добавили переменную ansible_python_interpreter с указанием пути для запуска python.

Настройка ansible

Открываем конфигурационный файл 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. 

Если мы создали и хотим использовать инвентарный файл yml, то вводим:

ansible -i /etc/ansible/inventory/test_servers.yml -m ping test_servers -u root -kK

* мы должны указать путь до файла inventory с помощью опции -i.

Будет запрошен пароль от учетной записи (в нашем случае, 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.dmosk.ru
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 блока задач:

  1. На всех хостах (hosts: all) нашего инвентарного файла запускаются 3 роли (prepare, install, settings). Ansible выполняет сбор фактов (gather_facts: yes), подключение к хостам будет выполняться от пользователя root, а также создается переменная app_ver: 14.
  2. На узле server1 запускается одна задача по установке пакета curl.

Теперь запустим плейбук командой:

ansible-playbook -i /etc/ansible/inventory/test_servers.yml ./my_play.yml

* мы используем созданный ранее инвентарный файл и запускаем плейбук my_play.yml.

Решение возможных проблем

В процессе запуска и работы с Ansible мы можем получить множество ошибок. Опишу некоторые из них.

Failed to connect to the host

Чаще всего, при запуске 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.

Python Module not found

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. Установим его:

python -m pip install firewall

При получении ошибки:

No module named pip

... устанавливаем в систему пакет python-pip.

Читайте также

Другие инструкции про Ansible:

1. Примеры работы с Ansible.

2. Примеры ролей Ansible для установки сервисов и настройки системы.

3. Как настроить Windows для управления с Ansible.

4. Использование роли и плейбука Ansible на примере установки и настройки NGINX.

# CentOS # DevOps # Linux # Rocky Linux # Ubuntu # UNIX # Серверы # Управление
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет