Ansible настраивает серверы: ставит пакеты, раскладывает конфиги, перезапускает сервисы. Terraform обычно создаёт инфраструктуру (машины, сети, базы), Ansible настраивает то, что внутри машин. Ansible работает без агента: подключается по SSH и выполняет модули на Python, который должен быть на целевой машине.
Инвентарь
Список хостов и групп. Простейший вариант INI:
[web]
web1.example.ru
web2.example.ru ansible_port=2222
[db]
db1.example.ru
[prod:children]
web
db
[web:vars]
nginx_workers=4
Инвентарь бывает динамическим: плагин запрашивает список машин у облака по тегам.
Плейбук, задачи, модули
- name: Настроить веб-серверы
hosts: web
become: true
vars:
app_port: 8080
tasks:
- name: Установить nginx
ansible.builtin.apt:
name: nginx
state: present
update_cache: true
- name: Положить конфиг
ansible.builtin.template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
validate: nginx -t -c %s
notify: reload nginx
handlers:
- name: reload nginx
ansible.builtin.service:
name: nginx
state: reloaded
- Модуль делает одно действие:
apt,copy,template,service,user,lineinfile. - Задача вызывает модуль с параметрами.
- become повышает права (sudo).
- Handler выполняется, только если его уведомила задача, которая что-то изменила, и только один раз в конце play (или раньше, по
meta: flush_handlers).
Идемпотентность
Главное свойство: повторный запуск ничего не меняет, если система уже в нужном состоянии. Модули вроде apt с state: present проверяют состояние сами. А command и shell выполняются всегда и всегда сообщают changed. Для них задают creates, removes или changed_when, а лучше ищут подходящий модуль.
Проверка: запустить плейбук дважды; во второй раз должно быть changed=0.
Роли
Роль это переиспользуемый пакет: tasks/, handlers/, templates/, files/, defaults/ (переменные по умолчанию, легко переопределить), vars/ (переменные роли с высоким приоритетом), meta/ (зависимости). Готовые роли и коллекции ставят через ansible-galaxy.
Переменные и приоритет
Переменные задаются в десятке мест. Запомнить крайние: defaults роли имеют самый низкий приоритет, -e (extra vars) в командной строке самый высокий. Между ними инвентарь, group_vars, host_vars, переменные плея и vars/ роли. Хорошая практика: значения по умолчанию в defaults, окружения в group_vars.
Полезные режимы запуска
--check --diff: сухой прогон с показом изменений в файлах.--limit web1.example.ru: только часть хостов.--tags nginx: только задачи с тегом.serial: 2в плейбуке: обновлять по 2 хоста за раз (rolling), вместе сmax_fail_percentage.forks(по умолчанию 5): сколько хостов обрабатывать параллельно.
Секреты
ansible-vault шифрует файлы или отдельные значения: ansible-vault encrypt group_vars/prod/vault.yml. Пароль от vault передают через файл или скрипт, в CI из хранилища секретов. Чтобы секрет не попал в лог, задаче ставят no_log: true.
Тестирование
ansible-lint для стиля и типичных ошибок, Molecule для прогона роли на одноразовом контейнере или ВМ с проверкой идемпотентности.
Частые ошибки
shell: apt-get install -y nginxвместо модуляapt: не идемпотентно и без проверок.- Рестарт сервиса задачей в конце, а не через handler: сервис перезапускается при каждом прогоне.
- Пароли открытым текстом в
group_vars. - Перезапуск всех серверов разом без
serial. - Шаблон конфига без
validate: битый конфиг уронит nginx.
Что спросят на собесе
- Чем Ansible отличается от Terraform и когда что использовать.
- Что такое идемпотентность и как сделать идемпотентной задачу с
shell. - Как работают handlers.
- Как обновить 50 серверов, не уронив сервис.
- Как хранить секреты в Ansible.