====== Концепция ====== Управление хостами, по сети, через 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|Тут есть более полное описание]] [defaults] # Используемый инвентори inventory = ./myhosts # Чтобы убрать предупреждение об автопоиске питона interpreter_python = auto_silent # Подключаемый пользователь remote_user = anuser # Отключение подтверждения нового ssh ключа host_key_checking = False # Отключение сбора фактов gathering = explicit