Управление хостами, по сети, через 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
Особенность в том что роли могут быть вложенными т.е. составлять цепочку выполнения
Все переменные в ансибл глобальные, но есть замороченная система уровней, которая как то работает, и есть куча нюансов, так что с именованием нужно быть аккуратнее
Хороший путь ансибл это максимально простое и линейное описание последовательного процесса, по возможности стоит максимально исключить условия, циклы и прочую логику из конфигов, лучше написать 10 тривиальных строк вместо одной «кучерявой»
Шаблоны нечто иное как использование переменных типа { { inventory_hostname } } (двойные скобки вместе), это собсна и есть «jinja2»- система шаблонов для python
notify обработчик, который будет вызван в случае успешного выполнения задачи
handlers описание обработчика, который может быть вызван по имени
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