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/

Avatar for Moscow Python Meetup

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