Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Человек-Molecule или как тестировать инфраструк...

Человек-Molecule или как тестировать инфраструктуру

Все знают, что в разработке тесты важны и полезны. Но ведь у нас есть еще инфраструктура, как с ней быть? Там тоже есть сложные сценарии развертывания, и цена ошибки может быть еще выше: ведь неправильная конфигурация окружения может быть выявлена только в процессе использования. Поговорим про ценность IaaC подхода и про то, как тестировать ansible роли с помощью Molecule.

Avatar for Romanov Alexey

Romanov Alexey

March 30, 2025
Tweet

More Decks by Romanov Alexey

Other Decks in Programming

Transcript

  1. 11+ лет Java/Kotlin. 6+ лет в роли TeamLead/Архитектора. 5 лет

    опыт DevOps. 8 лет преподаю в Бауманском курс «Распределенные Системы Обработки Информации» aka Микросервисы. Работаю Software Архитектор в Иннотех. Мы с вами встречались на других конференциях :) Обо мне
  2. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 План доклада Какую задачу мы хотим решить? Что такое Infrastructure As A Code и как нам это поможет? Что такое Ansible, для чего нужен. Настраиваем отказоустойчивую репликацию в Postgres. Как это тестировать? (поговорим про Molecule) Тестируем роли (roles). Тестируем весь сценарий (playbooks). Автоматизируем проверки в Github Actions.
  3. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Какую задачу мы хотим решить Сценарии развертывания и обновления инфраструктуры могут быть очень сложными. Внесение изменений в конфигурацию может привести к поломке всего, а мы это узнает только когда уже все сломалось. Даже для локального тестирования нужно уметь настраивать окружение.
  4. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Что такое Infrastructure As A Code Infrastructure As A Code (IaaC) – это процесс управления и настройки серверного окружения с использованием машинно- понятных манифестов, без использования ручной конфигурации. Манифесты хранятся в git и являются точкой истины состояния инфраструктуры.
  5. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Что такое Ansible Ansible — это программное решение для удаленного управления конфигурациями, которое автоматизирует поставку программного обеспечения, управление конфигурацией и развёртывание приложений. Ansible помогает DevOps-специалистам автоматизировать сложные задачи. Не требует агентов 
 Коммуникация с серверами выполняется по SSH. Идемпотентное 
 Независимо от того, сколько раз вы вызываете операцию, результат будет одинаковым. Простое и расширяемое 
 Ansible написанa на Python и использует YAML для написания команд
  6. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Что такое Ansible Inventory 
 Файл, содержащий информацию о серверах, с которыми происходит взаимодействие. Tasks 
 Блок, определяющий одну выполняемую процедуру, например: установка пакета. Roles 
 Набор задач по настройке хоста для выполнения определенной цели, например, настройка службы. Playbooks 
 YAML-файл, в котором описывается какие задачи и на каких серверах будут выполняться.
  7. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Настраиваем отказоустойчивую репликами в Postgres https://github.com/Romanow/molecule-lecture
  8. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Настраиваем отказоустойчивую репликами в Postgres Postgres Master Postgres Slave PgPool II Master-Slave replication read, write replication status read failover connection pool request routing failover
  9. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Структура файлов Playbook postgres.yml Тестируем роль Basic Структура проекта
  10. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Molecule Molecule — это фреймворк, предназначенный для помощи в разработке и тестировании ролей в Ansible. Molecule позволяет тестировать роли в разных экземплярах, операционных системах и дистрибутивах. Driver – тип тестируемой платформы. Platforms – конфигурация инстансов, на которых мы будем устанавливать конфигурацию. Provisioner – это инструмент, который запускает файл converge.yml (test playbook) для всех запущенных экземпляров (поддерживает только Ansible). Verifier – это инструмент, который проверяет роли. Этот верификатор запускает файл verify.yml, чтобы убедиться, что фактическое состояние экземпляра соответствует желаемому состоянию. Lint – статический анализатор кода.
  11. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Molecule 1. --- 2. dependency: 3. name: galaxy 4. driver: 5. name: docker 6. platforms: 7. - name: ubuntu 8. image: ubuntu:22.04 9. privileged: true 10. networks: 11. - name: cluster 12. ipv4_address: 192.168.0.10 13. groups: 14. - postgres 15. provisioner: 16. name: ansible 17. inventory: 18. group_vars: 19. postgres: 20. database_subnet: 192.168.0.0/24 21. verifier: 22. name: ansible 23. lint: |- 24. yamllint . 25. ansible-lint DRIVER PLATFORMS VERIFIER PROVISIONER DRIVER
  12. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Роль Basic Устанавливаем необходимые пакеты. Создаем пользователей и группу. Все можно проверить на одном instance.
  13. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Тестируем роль Basic 1. —— 2. dependency: 3. name: galaxy 4. driver: 5. name: docker 6. platforms: 7. - name: ubuntu 8. image: ubuntu:22.04 9. privileged: true 10. provisioner: 11. name: ansible 12. log: true 13. verifier: 14. name: ansible 15. lint: |- 16. yamllint . 17. ansible-lint 1. FROM {{ item.image }} 2. RUN apt-get update && \ 3. apt-get install -y \ 4. sudo bash ufw \ 5. ca-certificates \ 6. python3 python3-pip python3-apt \ 7. python3-distutils-extra gnupg \ 8. systemctl -y && \ 9. apt-get clean roles/basic/molecule/default/molecule.yml roles/basic/molecule/default/Docker fi le.j2
  14. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Роль Postgres Делаем все то, что в роли Basic. Устанавливаем и настраиваем PostrgeSQL. Настраиваем streaming репликацию. Для проверки требуется минимум два instance: Master и Slave.
  15. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Тестируем роль Postgres 1. —— 2. driver: 3. name: docker 4. platforms: 5. - name: postgres-master.local 6. image: ubuntu:22.04 7. networks: 8. - name: cluster 9. ipv4_address: 192.168.1.10 10. groups: [ database, postgres, master ] 11. - name: postgres-slave.local 12. image: ubuntu:22.04 13. networks: 14. - name: cluster 15. ipv4_address: 192.168.1.11 16. groups: [ database, postgres, slaves ] 17. provisioner: 18. name: ansible 19. verifier: 20. name: ansible 21. lint: | 22. yamllint . 23. ansible-lint roles/postgres/molecule/default/molecule.yml
  16. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Полный сценарий Устанавливаем и настраиваем PostrgeSQL. Настраиваем streaming репликацию. Настраиваем PgPool для балансировки запросов к Master / Slave. Настраиваем failover на PgPool в случае потери master. Для проверки используем 3 полноценных виртуальных машины и inventories для локальной разработки (local).
  17. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Тестируем весь сценарий целиком 1. —— 2. driver: 3. name: vagrant 4. provider: 5. name: virtualbox 6. platforms: 7. - name: postgres-master.local 8. box: "romanow/ansible-box" 9. interfaces: 10. - network_name: private_network 11. ip: 192.168.56.200 12. groups: [ database, postgres, master ] 13. - name: postgres-slave.local 14. box: "romanow/ansible-box" 15. interfaces: 16. - network_name: private_network 17. ip: 192.168.56.201 18. groups: [ database, postgres, master ] 19. - name: pgpool.local 20. box: "romanow/ansible-box" 21. interfaces: 22. - network_name: private_network 23. ip: 192.168.56.202 24. groups: [ database, pgpool ] 25. provisioner: 26. name: ansible 27. inventory: 28. links: 29. group_vars: "${MOLECULE_PROJECT_DIRECTORY}/inventories/local/group_vars/" molecule/default/molecule.yml
  18. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Автоматизируем проверки 1. name: build 2. on: [ push ] 3. jobs: 4. ansible-roles: 5. name: Ansible Role tests 6. runs-on: ubuntu-latest 7. steps: 8. - uses: actions/checkout@v3 9. - run: pip3 install -r ansible/requirements.txt 10. - run: |- 11. shopt -s extglob 12. for dir in ansible/roles/*; do 13. molecule test 14. done 15. ansible-playbook: 16. name: Ansible Playbook tests 17. runs-on: macos-latest 18. steps: 19. - uses: actions/checkout@v3 20. - run: pip3 install -r ansible/requirements.txt 21. - run: brew install esolitos/ipa/sshpass 22. - run: vagrant box add romanow/ansible-box --box-version 22.04 23. - run: molecule test .github/work fl ows/build.yml
  19. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 Выводы Infrastructure As A Code – единственный способ сделать вашу инфраструктуру надежной и предсказуемой. Тестирование инфраструктуры – крайне важный этап разработки ПО, потому что найти такие ошибки крайне сложно и дорого. И скорее всего вы их будете находить сразу на production. Molecule – мощный инструмент, который позволит сделать ваши манифесты надёжными и поддерживаемыми. Тестировать можно нужно не только роли, но и сценарии целиком.
  20. © IT Enduro, Романов А.С. «Человек-Molecule или как тестировать инфраструктуру»,

    2022 @romanowalex https://github.com/Romanow romanowalex Ссылки https://github.com/Romanow/molecule-lecture