6.0 KiB
Кейс: роль Ansible + тестирование в Molecule
Связь с легендой: ../../legend/LEGEND.md — раздел «АО ТНИИС», автоматизация установки/настройки серверов, роли и плейбуки, тестирование через Molecule перед CI (TeamCity).
Что нужно реально сделать (домашний стенд)
Написать Ansible-роль, разворачивающую и конфигурирующую Nginx, и протестировать её через Molecule (Docker-драйвер) — без реальных серверов, но с реальным прогоном роли и проверкой результата.
1. Структура
ansible-lab/
├── ansible.cfg
├── inventory/
│ └── hosts.ini
├── playbook.yml
└── roles/
└── nginx_deploy/
├── defaults/main.yml
├── tasks/main.yml
├── handlers/main.yml
├── templates/nginx.conf.j2
└── molecule/
└── default/
├── molecule.yml
├── converge.yml
└── verify.yml
2. roles/nginx_deploy/defaults/main.yml
nginx_worker_connections: 1024
nginx_server_name: lab.local
3. roles/nginx_deploy/tasks/main.yml
- name: Установить nginx
ansible.builtin.package:
name: nginx
state: present
- name: Развернуть конфиг nginx из шаблона
ansible.builtin.template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
mode: "0644"
notify: reload nginx
- name: Убедиться, что nginx запущен и в автозагрузке
ansible.builtin.service:
name: nginx
state: started
enabled: true
4. roles/nginx_deploy/handlers/main.yml
- name: reload nginx
ansible.builtin.service:
name: nginx
state: reloaded
5. roles/nginx_deploy/templates/nginx.conf.j2
events {
worker_connections {{ nginx_worker_connections }};
}
http {
server {
listen 80;
server_name {{ nginx_server_name }};
location / {
return 200 'ok';
}
}
}
6. molecule/default/molecule.yml
driver:
name: docker
platforms:
- name: nginx-instance
image: geerlingguy/docker-ubuntu2204-ansible:latest
pre_build_image: true
provisioner:
name: ansible
verifier:
name: ansible
7. molecule/default/converge.yml
- name: Converge
hosts: all
roles:
- role: nginx_deploy
8. molecule/default/verify.yml
- name: Verify
hosts: all
tasks:
- name: Проверить, что nginx слушает 80 порт
ansible.builtin.wait_for:
port: 80
timeout: 5
- name: Проверить HTTP-ответ
ansible.builtin.uri:
url: http://localhost/
status_code: 200
9. Шаги воспроизведения
pip install molecule molecule-plugins[docker] ansible.cd roles/nginx_deploy && molecule test— это прогоняет полный цикл: create (поднять Docker-инстанс) → converge (применить роль) → idempotence (повторный прогон роли не должен ничего менять) → verify (проверки из verify.yml) → destroy.- Специально сломать что-то в шаблоне (например, опечатку в директиве nginx) и посмотреть, как
molecule testпадает на этапе converge или verify — это и есть демонстрация того, зачем нужен этот шаг перед CI. - Убедиться, что повторный прогон роли (idempotence check) не репортит изменений — если репортит, значит роль не идемпотентна, и это тоже частый вопрос на собеседовании.
10. Что это даёт в разговоре с интервьюером
- Реальное понимание, зачем нужен Molecule: тестировать роль в изолированном контейнере до того, как она попадёт в реальную инфраструктуру через CI.
- Понимание идемпотентности — краеугольного принципа Ansible.
- Практика с handlers, templates, defaults — стандартной структурой роли.
- Понимание, как Molecule встраивается в CI-конвейер (у меня локально
molecule test, в TeamCity — тот же шаг, но в build step с прогоном перед деплоем).
Нагрузка и цифры
Ansible сам по себе не «нагрузочная» технология в смысле RPS/TPS — релевантная метрика тут время прогона плейбука на N хостов (параллелизм через forks в ansible.cfg). Цифры не зафиксированы отдельно — общий подход к честным цифрам масштаба (три слоя: публичные ориентиры / лабные замеры / реальные факты с работы) описан в ../../legend/CAPACITY.md.
Как это ложится в легенду
В реальной работе (АО ТНИИС) — 15 скриптов/ролей Ansible с управлением конфигурациями через роли и модули, тестирование в CI/CD через Molecule и TeamCity. Домашний кейс воспроизводит тот же цикл в миниатюре на одной роли вместо полного набора инфраструктурных ролей.