Описание
Ansible – это единая система управления конфигурациями. Ansible позволяет управлять конфигурацией удаленных систем без использования агентов.
Для работы нужен python и ansible на управляющем хосте, а на управляемом хосте достаточно python. А также нужно настроить доступ между хостами. После этого управляющий хост может отправлять команды на управляемый. Эти команды могут быть указаны через консоль (ad-hoc) или описаны в yaml файле, который называется playbook. В playbook'е описывается желаемое состояние управляемой системы, а Ansible проверяет соответствует ли конфигурация удаленного компьютера описанию в playbook'е. Ansible работает вызывая указанные через команды или playbook модули с задаваемыми пользователем аргументами. Если нет подходящего модуля для какой-либо задачи, его можно написать самому.
- Основные особенности:
- Push управление конфигурациями, то есть управляющий сервер рассылает необходимые настройки на конечные серверы;
- Принцип идемпотентности (многократное повторение действия эквивалентно однократному) сначала проверяется состояние объекта и если оно уже приведено в нужному то действие не выполняется;
- Написан на Python;
- Модульность;
- Для подключения к удаленному хосту нужно знать логин и пароль пользователя или должно быть настроено подключение по ключу;
- До запуска первой задачи происходит сбор фактов — ansible подключается к хосту и запрашивает у него информацию о нем, такую как информацию о системе, о сети, о железе. Эта информация сохраняется в переменных, называемых фактами, обращение к ним работает, как обращение к любым другим переменным.
- Выполняя задачу ansible проделывает следующие действия:
- Подключается к хостам и собирает информацию о них (facts);
- Генерирует скрипт на python;
- Копирует скрипт на хосты;
- Запускает скрипт на хостах;
- Дожидается пока скрипт завершится на всех хостах.
При выполнении playbook'а с несколькими задачами ansible работает по такому же алгоритму, но при этом (по умолчанию, можно переопределить) ждет пока команда выполниться на всех хостах.
- Список действий для начала работы с ansible:
- Установить python и ansible на управляющем хосте
- Установить python на управляемом хосте
- Заполнить inventory
- Изменить конфигурацию
- Сгенерировать ключ на управляющем хосте (не обязательно)
- Передать ключ на управляемый хост (не обязательно)
Установка
Для работы ansible нужно, чтоб на управляющем и на управляемом хосте стоял ssh и python. Python версии 2.7 стоит по умолчанию, но лучше его обновить, так как более высокая версия поддерживает больше возможностей. Ssh обычно также установлен по умолчанию, но сли его нет - можно установить командой apt/yum install openssh-server. Сам ansible устанавливается только на управляющем хосте.
Подключить репозиторий epel
yum install epel-releaseУстановить python
yum install python3Установить ansible
yum install ansible
Установить python
apt install python3Установить ansible
apt install ansible
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
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 #ключ для подключения
[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
ansible-inventory --listВывод inventory в виде дерева
ansible-inventory --graph
Конфигурация ansible
/etc/ansible/ansible.cfgОн создается при установке ansible. В нем описаны все возможные параметры, их можно раскомментировать и переопределить.
- Ansible будет искать конфиг в следующих каталогах в указанном порядке:
- Файл, указанный в переменной окружения ANSIBLE_CONFIG
- Текущий каталог
- Домашний каталог пользователя
- /etc/ansible/ansible.cfg
Некоторые параметры конфигурации:
[defaults] host_key_checking = false
[defaults] inventory = ./hostsИли же можно указать абсолютный путь
[defaults] sudo_user = root
[defaults] remote_port = 22
[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.
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') }}"
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 нельзя выполнить команду от 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') }}"
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-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