15 июня 2022 г.
2078

Установка и настройка Ansible

Описание

Ansible – это единая система управления конфигурациями. Ansible позволяет управлять конфигурацией удаленных систем без использования агентов.

Для работы нужен python и ansible на управляющем хосте, а на управляемом хосте достаточно python. А также нужно настроить доступ между хостами. После этого управляющий хост может отправлять команды на управляемый. Эти команды могут быть указаны через консоль (ad-hoc) или описаны в yaml файле, который называется playbook. В playbook'е описывается желаемое состояние управляемой системы, а Ansible проверяет соответствует ли конфигурация удаленного компьютера описанию в playbook'е. Ansible работает вызывая указанные через команды или playbook модули с задаваемыми пользователем аргументами. Если нет подходящего модуля для какой-либо задачи, его можно написать самому.

    Основные особенности:
  • Push управление конфигурациями, то есть управляющий сервер рассылает необходимые настройки на конечные серверы;
  • Принцип идемпотентности (многократное повторение действия эквивалентно однократному) сначала проверяется состояние объекта и если оно уже приведено в нужному то действие не выполняется;
  • Написан на Python;
  • Модульность;
  • Для подключения к удаленному хосту нужно знать логин и пароль пользователя или должно быть настроено подключение по ключу;
  • До запуска первой задачи происходит сбор фактов — ansible подключается к хосту и запрашивает у него информацию о нем, такую как информацию о системе, о сети, о железе. Эта информация сохраняется в переменных, называемых фактами, обращение к ним работает, как обращение к любым другим переменным.
    Выполняя задачу ansible проделывает следующие действия:
  1. Подключается к хостам и собирает информацию о них (facts);
  2. Генерирует скрипт на python;
  3. Копирует скрипт на хосты;
  4. Запускает скрипт на хостах;
  5. Дожидается пока скрипт завершится на всех хостах.

При выполнении playbook'а с несколькими задачами ansible работает по такому же алгоритму, но при этом (по умолчанию, можно переопределить) ждет пока команда выполниться на всех хостах.

    Список действий для начала работы с ansible:
  1. Установить python и ansible на управляющем хосте
  2. Установить python на управляемом хосте
  3. Заполнить inventory
  4. Изменить конфигурацию
  5. Сгенерировать ключ на управляющем хосте (не обязательно)
  6. Передать ключ на управляемый хост (не обязательно)

Установка

Для работы ansible нужно, чтоб на управляющем и на управляемом хосте стоял ssh и python. Python версии 2.7 стоит по умолчанию, но лучше его обновить, так как более высокая версия поддерживает больше возможностей. Ssh обычно также установлен по умолчанию, но сли его нет - можно установить командой apt/yum install openssh-server. Сам ansible устанавливается только на управляющем хосте.

Установка на CentOS:
Подключить репозиторий epel
yum install epel-release
Установить python
yum install python3
Установить ansible
yum install ansible
Установка на Ubuntu:
Установить python
apt install python3
Установить ansible
apt install ansible

Inventory

На управляющем хосте нужно задать список управляемых хостов (inventory), это осуществляется в файле по умолчанию
/etc/ansible/hosts
или можно создать файл inventory в любом другом месте можно, но при выполнении команды на запуск, нужно будет указать пусть к файлу с помощью ключа -i. Можно указать сразу несколько файлов.

Хосты могут быть просто перечислены в виде списка с ip-адресом или именем хоста на каждой строке, но лучше разбивать хосты на группы.

Сначала указывается название группы в квадратных скобках, затем перечисляются хосты.
Имена хостов прописываются в виде dns-имени хоста или ip.
После названия хоста можно указать параметры подключения к хосту в одну строку.
[servers]
server1 ansible_host=192.168.10.15 ansible_user=user123
server2 ansible_host=192.168.10.20 ansible_user=user12345
Некоторые параметры inventory
ansible_host=192.168.10.15  #имя или ip хоста
ansible_port=22             #порт для подключения по ssh, можно не указывать, тогда будет использоваться 22
ansible_user=user123        #пользователь для подключения по ssh, можно не указывать, тогда будет использоваться пользователь от имени которого запускается playbook
ansible_become_user=sudo_user   #пользователь имеющий права sudo
ansible_password="1234"     #пароль для подключения по ssh, не рекомендуется хранить в открытом виде
ansible_become_password="12345"   #пароль для повышения привилегий, не рекомендуется хранить в открытом виде
ansible_become=yes          #использовать повышение привилегий по умолчанию или нет
ansible_python_interpreter=/usr/bin/python3 #путь к интерпретатору python на хосте, можно не указывать
ansible_ssh_private_key_file=id_rsa.pub     #ключ для подключения
Если у хостов группы одинаковые параметры, их можно перечислить в отдельной группе, которая будет иметь тоже название, но с добавлением :vars, например
[servers]
server1 ansible_host=192.168.10.15
server2 ansible_host=192.168.10.20
  
[servers:vars]
ansible_port=22
ansible_user=user123
ansible_password="1234"
Пароль лучше не хранить в файлах, а при запуске playbook'а добавлять параметр --ask-pass, чтоб вывелся запрос пароля.
Параметры можно хранить в отдельных файлах.
Для этого рядом с файлом inventory нужно создать каталог group_vars (именно с таким названием) и в нем создать файлы, которые называются так же как группы в файле inventory
mkdir group_vars
touch servers
и в этих файлах указать нужные для группы параметры, только вместо равно указывается двоеточие
---
ansible_port:     22
ansible_user:     user123
ansible_password: "1234"

Все хосты в списке делятся, как минимум, на две группы all - все и ungroupt - не состоящие в группах. Таким образом все хосты входят в две группы: all и группа, которой присвоен хост или ungroupt.

Группа может включать в себя другие группы
[servers_db]
192.168.10.15
192.168.10.20
  
[servers_web]
192.168.10.150
192.168.10.160

[servers_all:children]
servers_db
servers_web
Вывод inventory
ansible-inventory --list
Вывод inventory в виде дерева
ansible-inventory --graph

Конфигурация ansible

Основным конфигурационным файлом является
/etc/ansible/ansible.cfg
Он создается при установке ansible. В нем описаны все возможные параметры, их можно раскомментировать и переопределить.
    Ansible будет искать конфиг в следующих каталогах в указанном порядке:
  • Файл, указанный в переменной окружения ANSIBLE_CONFIG
  • Текущий каталог
  • Домашний каталог пользователя
  • /etc/ansible/ansible.cfg

Некоторые параметры конфигурации:

Опция, которая позволяет автоматически принимать ssh fingerprint, избавляя от необходимости вводить yes, при первоначальной конфигурации сервера
[defaults]
host_key_checking = false
Переопределить путь до файла inventory, например пусть файл должен находится в том же каталоге из которого запускается playbook (по умолчанию /etc/ansible/hosts)
[defaults]
inventory = ./hosts
Или же можно указать абсолютный путь
Пользователь по умолчанию, от имени которого запускаются команды на удаленных серверах (по умолчанию - это пользователь от имени которого запускаются команды на управляющем сервере)
[defaults]
sudo_user = root
Порт для соединения по SSH (по умолчанию 22)
[defaults]
remote_port = 22
Цвет сообщений, с положительным результатом, по умолчанию - зеленый (green)
[colors]
ok = green

Настройка пользователя, от имени которого осуществляется работа на удаленном хосте

    Есть три варианта, как указать от имени какого пользователя будет осуществляться выполнение команд на управляемом хосте:
  • По умолчанию выполнение команд на управляемом хосте происходит от имени того же пользователя, от которого запускаются команды на управляющем хосте;
  • При запуске команд указать от имени какого пользователя будет происходить выполнение с помощью ключа -u, например-u user123;
  • Имя пользователя можно указать в inventory параметром ansible_user (server1 ansible_host=192.168.10.15 ansible_user=user123).

Доступ к удаленному хосту

    Есть два варианта получения доступа к управляемому хосту:
  • На управляющем хосте от нужного пользователя сгенерировать ssh ключ ssh-keygen, передать его на управляемый хост ssh-copy-id user123@192.168.10.15. Это лучший вариант;
  • Доступ по паролю. Для этого при запуске playbook'а нужно добавить ключ --ask-pass, в этом случае выведется запрос пароля пользователя управляемого хоста. Для выполнения команд от имени суперпользователя используются ключи --ask-pass --ask-become-pass --become, в этом случае сначала надо будет ввести пароль для подключения, а потом для повышения привилегий.
Проверить подключение к управляемых хостам можно командой
ansible all -i hosts -m ping -u user123 --ask-pass

Настройка прав на управляемом хосте

Лучше всего на управляемых хостах создать единого пользователя с правами sudo из под которого будет выполняться команды, например с именем ansible_user, это можно сделать вручную для каждого хоста, а можно выполнить команду которая добавит пользователя на всех хостах, с которым будет работать ansible_user.

Создать пользователя на управляемых хостах с CentOS:
ansible all -i hosts -m user -a 'name=ansible_user password="$6$password$HH44FA0c9mGOT4TgoBYhzV5mvo3y9HZuC1RwajYzNptFmAQVZ9U.SE2b3XFB9GmjabT6lE0pAmdTt72ArYNek1" shell=/bin/bash groups=wheel append=yes' --user root --ask-pass
кавычки должны быть именно в таком порядке
all - группа хостов, на которых будет создаваться пользователь
hosts - inventory со списком хостов
password - хэш, который генерируется командой
ansible all -i localhost, -m debug -a "msg={{ 'user-pass' | password_hash('sha512', 'password') }}"
Если выполняется не от пользователя root, то нужно добавить --become и --ask-become-pass, при этом пользователь должен иметь привилегии sudo
ansible all -i hosts -m user -a 'name=ansible_user password="$6$password$HH44FA0c9mGOT4TgoBYhzV5mvo3y9HZuC1RwajYzNptFmAQVZ9U.SE2b3XFB9GmjabT6lE0pAmdTt72ArYNek1" shell=/bin/bash groups=wheel append=yes' --user user123 --ask-pass --ask-become-pass
Создать пользователя на управляемых хостах с Ubuntu:
В Ubuntu нельзя выполнить команду от root поэтому нужно выполнять от имени пользователя с правами sudo и добавлять в группу sudo
ansible all -i hosts -m user -a 'name=ansible_user password="$6$password$JvblJF5KT/tRImFBqXjvoSW1Wnpq/WkLTF1ndkT5mmCW2.FCtOqBeJTS1IorVaUkzokqkTYBTuHzh4KWTIdZ.." shell=/bin/bash groups=sudo append=yes' --user user123 --ask-pass --ask-become-pass --become
кавычки должны быть именно в таком порядке
all - группа хостов, на которых будет создаваться пользователь
hosts - inventory со списком хостов
password - хэш, который генерируется командой
ansible all -i localhost, -m debug -a "msg={{ 'user-pass' | password_hash('sha512', 'password') }}"
Можно сделать так, чтобы не приходилось использовать --ask-become-pass и вводить пароль sudo, для этого в файле /etc/sudoers добавляется параметр NOPASSWD у нужного пользователя
ansible all -i hosts -m lineinfile -a 'dest=/etc/sudoers state=present regexp="^%ansible_user" line="%ansible_user ALL=(ALL) NOPASSWD: ALL" validate="visudo -cf %s"' --user ansible_user --ask-pass --ask-become-pass --become
Чтобы не нужно было вводить пароль для подключения по ssh можно и рекомендуется сгенерировать ssh ключ
ssh-keygen
и разослать его на все хосты
ansible all -i hosts -m authorized_key -a 'user=ansible_user state=present key={{ lookup("file", "~/.ssh/id_rsa.pub") }}' --user ansible_user --ask-pass
теперь можно выполнять команды от текущего пользователя управляющего хоста не вводя пароль, например
ansible all -i hosts -m ping --user ansible_user