====== Концепция ======
Управление хостами, по сети, через ssh подключение, нужен беспарольный доступ с хоста ансибла на целевой хост\\
При запуске плейбука из консоли, используется авторизованный пользователь, в файле **ansible.cfg** можно указать другого в параметре "remote_user"\\
В командах мы описываем желаемое состояние системы, при выполнении софт проверяет так ли это, если нет, то выполняет необходимые действия\\
Команды можно выполнять одиночно из cli, либо объединять в файлы конфигурации т.н. плейбуки **"playbooks"**, описание в формате **yaml**\\
:!: Пример плейбука
Описано две задачи, сначала установка nginx, затем копирование файла
- hosts: web-servers
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
- name: Push future default virtual host configuration
copy: src=files/site.conf dest=/etc/nginx/sites-enabled/ mode=0640
**Inventory** файл в котором хранится перечень целевых хостов, с которыми ведется работа. Так же здесь могут хранится переменные.\\
По умолчанию **/etc/ansible/inventory/hosts**, можно задавать другое расположение через конфиг. Расширение добавлять не нужно\\
Хосты могут объединяться в группы, с-но при выполнении можно указывать эти группы\\
:!: Пример файла инвертори
./inventory/hosts.yaml
all:
children:
myGroup:
vars:
myVariable1: value
myVariable2: value
myVariable3: value
hosts:
alias1:
ansible_host: 0.0.0.0
alias2:
ansible_host: 1.1.1.1
alias3:
ansible_host: 2.2.2.2
Непонятки с организацией этого инвентаря, полезная команда "ansible-inventory -i hosts.yaml --list" для отладки\\
Далее в коде доступны эти хосты и набор переменных к каждому
./test.yaml
...
with_items: "{{ groups['myGroup'] }}" # Применить таску ко всем хостам из группы
"{{ hostvars[item] }}" # Элемент группы, хост
"{{ hostvars[item][myVariable1-4] }}" # Во вложенном массиве доступна вся инфа о хосте, в т.ч. набор переменных из инвентори, персонализированный получается
**Roles**, роли используются для разделения плейбука на части, и организации файлов. Для роли создается каталог, технически структура файлов может быть любой, но есть соглашение об конкретной организации файлов, что добавляет универсальности и порядка.\\
Создание происходит автоматически, командой **$ ansible-galaxy init role-name**\\
Особенность в том что роли могут быть вложенными т.е. составлять цепочку выполнения\\
{{:ansible_roles.png?direct&300 |}}
Все переменные в ансибл **глобальные**, но есть замороченная **система уровней**, которая как то работает, и есть **куча нюансов**, так что с именованием нужно быть аккуратнее\\
Хороший путь ансибл это максимально **простое и линейное описание** последовательного процесса, по возможности стоит максимально **исключить условия, циклы** и прочую логику из конфигов, лучше написать 10 тривиальных строк вместо одной "кучерявой"\\
**Шаблоны** нечто иное как использование переменных типа **{ { inventory_hostname } }** (двойные скобки вместе), это собсна и есть "jinja2"- система шаблонов для python\\
**notify** обработчик, который будет вызван в случае успешного выполнения задачи\\
**handlers** описание обработчика, который может быть вызван по имени\\
**ansible.cfg** основной конфиг\\
:!: Пример
[[https://riptutorial.com/ansible/example/21992/ansible-cfg|Тут есть более полное описание]]
# Варианты размещения (указания)
- ANSIBLE_CONFIG (an environment variable)
- ansible.cfg (in the current directory)
- .ansible.cfg (in the home directory)
- /etc/ansible/ansible.cfg
# Чекнуть (надо быть в папке с плейбуком)
ansible-config list
ansible-config view
[defaults]
# Используемый инвентори
inventory = ./myhosts
# Чтобы убрать предупреждение об автопоиске питона
interpreter_python = auto_silent
# Подключаемый пользователь
remote_user = anuser
# Отключение подтверждения нового ssh ключа
host_key_checking = False
# Отключение сбора фактов
gathering = explicit
:!: