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

Тестирование инфраструктуры

Тестирование инфраструктуры

Алексей Кузнецов (Альфа-банк) @ Moscow Python Meetup 64
"Есть готовый код развертывания инфраструктуры и он работает, НО только до тех пор, пока не появится необходимость что-то в нем менять. Как проверить изменения в коде инфраструктуре? Что это сломает? Сколько времени это займет? Все ли узнают об этом?

Расскажу о инструментах, которые мы используем для этих целей. Расскажу про инструменты: ansible, testinfra, vagrant, packer, libvirt, virtualbox. Об автоматическом тестировании кода инфраструктурного кода при создании запроса на изменения".

Видео: http://www.moscowpython.ru/meetup/64/infrastructure-testing/

Moscow Python Meetup

May 30, 2019
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. 11

  2. Готов ли ты разрабатывать инфру? 14 нет vagrantfile? что-то не

    так установлено. windows? образ в интернете
  3. Готов ли ты разрабатывать инфру? 15 нет vagrantfile? что-то не

    так установлено. windows? образ в интернете старый код не соответствует версии ansible
  4. 16

  5. 18

  6. Среднее время: 9 days 10 hours ansible-minio: 45 days ansible-elasticsearch:

    18 days 9 hours ansible-marathon-lb: 21 days 1 hours ansible-logstash: 46 days 13 hours Время принятия PR 20
  7. Что тестируем? 28 Основной функционал инфраструктурного элемента Валидность функционала, реализующего

    высокую доступность элемента Новая возможность/ Исправление багов
  8. 29

  9. py.test --connection=ansible --ansible-inventory=inventory tests/ 30 подключаться тем же путем, что

    и ansible те же host’ы для разворачивания директория с тестами Запуск
  10. from jenkins import Jenkins @pytest.fixture() def AnsibleVars(Ansible): return Ansible("include_vars", "group_vars/vault_credentials.yml")["ansible_facts"]

    def test_job(AnsibleVars, host): server = Jenkins(url, username = AnsibleVars['jenkins_admin']['login'], password = … ) 32 py.test
  11. @pytest.fixture() def create_file(host): host.command('touch /tmp/filetestinfra') yield # execution test host.command('rm

    /tmp/filetestinfra') def test_file(create_file, host): assert host.file("/tmp/filetestinfra").exists def test_file_without_file(host): assert host.file("/tmp/filetestinfra").exists == False 33 py.test
  12. Cервис zookeeper отвечает Cервис zookeeper собирается в кластер Jenkins поднялся

    с необходимыми плагинами Все marathon задачи в статусе running Приложение может быть развернуто в marathon 34 Тест-кейсы
  13. import socket import requests @pytest.fixture() def AV(host): return host.ansible.get_variables() def

    test_consul_leader_elected(host, AV): servers =[socket.gethostbyname(h) for h in AV['groups']['servers']] response = requests.get("http://{}:8500/v1/status/leader".format( host.run('hostname').stdout)) assert (response.json().split(':')[0] in servers) 35 Выбор лидера consul
  14. Проверяем валидность обновления ОС и изменения настроек на реальных средах

    На вновь развернутых системах Как только открыт PR и изменен код развертывания Когда тестируем? 36
  15. Знакомый инструмент Описание требуемого окружения в виде кода Возможность использовать

    свой образ в локальном бинарном репозитории Почему vagrant? 42
  16. Наш образ Centos Имена машин Группы Настройки (cpu, mem, disk)

    2 providers (libvirt, virtualbox) Темплейт Vagrantfile 43
  17. Уникальные имена, как в virtualbox Передача имен между этапами Динамическая

    генерация статического inventory Настройки libvirt. Имена машин 44
  18. Настройки libvirt. Имена машин 45 VMS.each do |vm_name, vm_settings| ...

    elsif BACKEND == "KVM" ... if not File.file?(vm_name) unique_vm_name = vm_name + '-' + SecureRandom.uuid File.write(vm_name, unique_vm_name) else unique_vm_name = IO.read(vm_name) end ... config.vm.define unique_vm_name do |v| v.vm.hostname = unique_vm_name ...
  19. Packer config 47 "provisioners": <...> "builders": [ { "type": "virtualbox-iso",

    "boot_wait": "30s", "guest_os_type": "RedHat_64", "headless": false, "http_directory": "." "boot_command": [ "<up>","<tab>","<wait>","<spacebar>","inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{ user `KS_FILE` }}","<enter>" ], "shutdown_command": "sudo -S shutdown -P now", "guest_additions_path": "VBoxGuestAdditions.iso" <...> "post-processors": [{ "type": "vagrant", "output": "packer.box" }]
  20. Packer config 48 "provisioners": <...> "builders": [ { "type": "virtualbox-iso",

    "boot_wait": "30s", "guest_os_type": "RedHat_64", "headless": false, "http_directory": "." "boot_command": [ "<up>","<tab>","<wait>","<spacebar>","inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{ user `KS_FILE` }}","<enter>" ], "shutdown_command": "sudo -S shutdown -P now", "guest_additions_path": "VBoxGuestAdditions.iso" <...> "post-processors": [{ "type": "vagrant", "output": "packer.box" }]
  21. Packer config 49 "provisioners": <...> "builders": [ { "type": "virtualbox-iso",

    "boot_wait": "30s", "guest_os_type": "RedHat_64", "headless": false, "http_directory": "." "boot_command": [ "<up>","<tab>","<wait>","<spacebar>","inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{ user `KS_FILE` }}","<enter>" ], "shutdown_command": "sudo -S shutdown -P now", "guest_additions_path": "VBoxGuestAdditions.iso" <...> "post-processors": [{ "type": "vagrant", "output": "packer.box" }]
  22. Packer config 50 "provisioners": <...> "builders": [ { "type": "virtualbox-iso",

    "boot_wait": "30s", "guest_os_type": "RedHat_64", "headless": false, "http_directory": "." "boot_command": [ "<up>","<tab>","<wait>","<spacebar>","inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{ user `KS_FILE` }}","<enter>" ], "shutdown_command": "sudo -S shutdown -P now", "guest_additions_path": "VBoxGuestAdditions.iso" <...> "post-processors": [{ "type": "vagrant", "output": "packer.box" }]
  23. Настройки локальных репозиториев Настройки дисков, определение загрузочного раздела Авторизация, таймзоны

    Установка пакетов Настройка пользователя vagrant и ключей Дополнительные настройки, очистка кеширования Kickstart конфигурация 51
  24. 54

  25. Что может molecule? - запускать playbook’и - запускать окружение -

    запускать playbook’и 55 Запуск на CI и генерация проекта
  26. 56 - hosts: localhost connection: local tasks: - name: Create

    instances molecule_vagrant: instance_name: "{{ item }}" platform_box: ubuntu/trusty64 state: up with_items: - instance-1 - instance-2 create.yml
  27. ... if provider['override_args'] provider['override_args'].each { |override_arg| eval("override.#{override_arg}") } end ...

    # NOTE(retr0h): Vagrant/VBox sucks and parallelizing instance creation # causes issues. 57 Vagrantfile
  28. Что может molecule? - запускать playbook’и - запускать playbook’и -

    проверка на идемпотентность - запускать playbook’и molecule init role -r ansible-test -d vagrant 58 Запуск на CI и генерация проекта
  29. 61

  30. 62

  31. Выводы 69 Что мы использовали: packer, libvirt, gocd, testinfra, vagrant,

    python Что мы не использовали: molecule, testkitchen, docker