Как покривате Ansible с тестове?
sobes.tech AI
Отговор от AI
Използвам няколко основни подхода:
-
Синтактична проверка:
Проверява правилността на синтаксиса на плейбуците и ролите преди тяхното изпълнение.# Проверка на синтаксиса на плейбука ansible-playbook --syntax-check playbook.yml -
Идемпотентност:
Проверява, че повторното изпълнение на плейбука не променя състоянието на системата след първото успешно изпълнение.# Изпълнение на плейбука ansible-playbook playbook.yml # Повторно изпълнение с флаг --check за проверка на промените ansible-playbook playbook.yml --checkИзходът трябва да показва
changed=0 run=true. -
Molecule:
Фреймуърк за локално или отдалечено тестване на роли Ansible. Позволява изпълнение на различни сценарии за тестване (linting, идемпотентност, тестване на функции).# Инициализация на Molecule в директорията на ролята molecule init scenario -r default # Изпълнение на тестовете на Molecule molecule test -
Тестове на системно ниво (Functional Testing):
Проверяват дали системата след прилагане на Ansible е в очакваното състояние. Използват:- Testinfra: Проверява състоянието на хостовете и услугите след прилагане на конфигурацията.
- InSpec: Ruby-базирана рамка за тестване на състоянието на системата с използване на DSL.
В Molecule може да се интегрира Testinfra:
# секция platforms в molecule/default/molecule.yml platforms: - name: instance image: image_name # ... други настройки на платформата # секция verifier verifier: name: testinfra options: v: TrueПример за тест с Testinfra (
tests/test_default.py):# импорт на testinfra def test_nginx_is_installed(host): # Проверка дали пакетът nginx е инсталиран nginx = host.package("nginx") assert nginx.is_installed def test_nginx_is_running(host): # Проверка дали услугата nginx е стартирана nginx = host.service("nginx") assert nginx.is_running def test_nginx_listens_on_port_80(host): # Проверка дали nginx слуша порт 80 assert host.socket("tcp://0.0.0.0:80").is_listening -
Интеграция с CI/CD:
Автоматизиране на изпълнението на тестове в CI/CD пайплайн след всеки комит или Pull Request. Например, с използване на Jenkins, GitLab CI, GitHub Actions.
Изборът на конкретен подход зависи от сложността на ролята/плейбука и изискванията към степента на покритие с тестове. Обикновено използвам комбинация от тези методи.