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
PRO

May 30, 2019
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

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

    View Slide

  2. Процессы в компании
    Проблемы
    Инструменты тестирования
    Решение проблем
    Запуск на CI и генерация проекта
    Выводы
    2
    О чем говорим?

    View Slide

  3. Наша инфраструктура
    3

    View Slide

  4. Наша инфраструктура
    4

    View Slide

  5. ● Инфраструктура как код
    ● Храним в гите
    ● Пакуем в docker
    5
    Лучшие практики

    View Slide

  6. ● Инфраструктурные элементы
    (экземпляры роли)
    ● Метаскрипты (playbooks)
    6
    Скрипты раскатки

    View Slide

  7. 7
    Люди
    изменения
    развертывание
    (35 чел.)
    (5 чел.)
    (5 чел.)

    View Slide

  8. Процессы в компании
    Проблемы
    Инструменты тестирования
    Решение проблем
    Запуск на CI и генерация проекта
    Выводы
    8
    О чем говорим?

    View Slide

  9. Длительные процессы merge изменений pr
    Влияние изменений
    Обратная совместимость
    Наши проблемы
    9

    View Slide

  10. Возможность развертывания
    Скорость развертывания
    Контекст разворачиваемого элемента
    Время до merge PR
    10

    View Slide

  11. 11

    View Slide

  12. Готов ли ты разрабатывать инфру?
    12
    нет vagrantfile?

    View Slide

  13. Готов ли ты разрабатывать инфру?
    13
    нет vagrantfile?
    образ в интернете

    View Slide

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

    View Slide

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

    View Slide

  16. 16

    View Slide

  17. Пропорциональна вашим вычислительным
    ресурсам
    Взаимодействие ролей между собой
    Скорость развертывания
    17

    View Slide

  18. 18

    View Slide

  19. Время принятия PR
    19

    View Slide

  20. Среднее время: 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

    View Slide

  21. Нужно что то менять!
    21

    View Slide

  22. Вручную
    Тесты
    Нагрузка
    Эксперименты
    Валидность развертывания
    22

    View Slide

  23. Процессы в компании
    Проблемы
    Инструменты тестирования
    Решение проблем
    Запуск на CI и генерация проекта
    Выводы
    23
    О чем говорим?

    View Slide

  24. Фреймворк для тестирования кода
    Описываем тест-кейсы
    Пишем код теста
    Чем тестируем ?
    24

    View Slide

  25. testkitchen
    testinfra
    Инструменты верификации
    25

    View Slide

  26. Экосистема chef
    Свой yml dsl
    Расширяемость на ruby
    Testkitchen
    26

    View Slide

  27. Имеет backend ansible
    Обычный python код, без dsl
    Testinfra
    27

    View Slide

  28. Что тестируем?
    28
    Основной функционал инфраструктурного элемента
    Валидность функционала, реализующего высокую
    доступность элемента
    Новая возможность/ Исправление багов

    View Slide

  29. 29

    View Slide

  30. py.test --connection=ansible --ansible-inventory=inventory tests/
    30
    подключаться тем же путем, что и ansible
    те же host’ы для разворачивания
    директория с тестами
    Запуск

    View Slide

  31. def test_database_is_ok(host):
    assert host.socket("tcp://5432").is_listening
    31
    Простой пример

    View Slide

  32. 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

    View Slide

  33. @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

    View Slide

  34. Cервис zookeeper отвечает
    Cервис zookeeper собирается в кластер
    Jenkins поднялся с необходимыми плагинами
    Все marathon задачи в статусе running
    Приложение может быть развернуто в marathon
    34
    Тест-кейсы

    View Slide

  35. 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

    View Slide

  36. Проверяем валидность обновления ОС и
    изменения настроек на реальных средах
    На вновь развернутых системах
    Как только открыт PR и изменен код
    развертывания
    Когда тестируем?
    36

    View Slide

  37. Процессы в компании
    Проблемы
    Инструменты тестирования
    Решение проблем
    Запуск на CI и генерация проекта
    Выводы
    37
    О чем говорим?

    View Slide

  38. CI для инфраструктуры
    38

    View Slide

  39. CI для инфраструктуры
    39
    Удаленное
    развертывание

    View Slide

  40. Скорость создания виртуальной
    машины
    0:49.369 vs 2:36.81
    libvirt vs. virtualbox
    40

    View Slide

  41. CI для инфраструктуры
    41
    Удаленное
    развертывание
    Обратная связь
    Авторазвертывание

    View Slide

  42. Знакомый инструмент
    Описание требуемого окружения в виде кода
    Возможность использовать свой образ в
    локальном бинарном репозитории
    Почему vagrant?
    42

    View Slide

  43. Наш образ Centos
    Имена машин
    Группы
    Настройки (cpu, mem, disk)
    2 providers (libvirt, virtualbox)
    Темплейт Vagrantfile
    43

    View Slide

  44. Уникальные имена, как в virtualbox
    Передача имен между этапами
    Динамическая генерация статического
    inventory
    Настройки libvirt. Имена машин
    44

    View Slide

  45. Настройки 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
    ...

    View Slide

  46. Makefile
    Packer
    Две платформы
    Kickstart конфигурация
    Сохранение в artifactory
    Сборка своего образа
    46

    View Slide

  47. Packer config
    47
    "provisioners":
    "builders": [ { "type": "virtualbox-iso", "boot_wait": "30s",
    "guest_os_type": "RedHat_64", "headless": false, "http_directory": "."
    "boot_command": [
    "","","","","inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{ user `KS_FILE` }}","" ],
    "shutdown_command": "sudo -S shutdown -P now", "guest_additions_path": "VBoxGuestAdditions.iso"

    "post-processors": [{ "type": "vagrant", "output": "packer.box" }]

    View Slide

  48. Packer config
    48
    "provisioners":
    "builders": [ { "type": "virtualbox-iso", "boot_wait": "30s",
    "guest_os_type": "RedHat_64", "headless": false, "http_directory": "."
    "boot_command": [
    "","","","","inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{ user `KS_FILE` }}","" ],
    "shutdown_command": "sudo -S shutdown -P now", "guest_additions_path": "VBoxGuestAdditions.iso"

    "post-processors": [{ "type": "vagrant", "output": "packer.box" }]

    View Slide

  49. Packer config
    49
    "provisioners":
    "builders": [ { "type": "virtualbox-iso", "boot_wait": "30s",
    "guest_os_type": "RedHat_64", "headless": false, "http_directory": "."
    "boot_command": [
    "","","","","inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{ user `KS_FILE` }}","" ],
    "shutdown_command": "sudo -S shutdown -P now", "guest_additions_path": "VBoxGuestAdditions.iso"

    "post-processors": [{ "type": "vagrant", "output": "packer.box" }]

    View Slide

  50. Packer config
    50
    "provisioners":
    "builders": [ { "type": "virtualbox-iso", "boot_wait": "30s",
    "guest_os_type": "RedHat_64", "headless": false, "http_directory": "."
    "boot_command": [
    "","","","","inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{ user `KS_FILE` }}","" ],
    "shutdown_command": "sudo -S shutdown -P now", "guest_additions_path": "VBoxGuestAdditions.iso"

    "post-processors": [{ "type": "vagrant", "output": "packer.box" }]

    View Slide

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

    View Slide

  52. Процессы в компании
    Проблемы
    Инструменты тестирования
    Решение проблем
    Запуск на CI и генерация проекта
    Выводы
    52
    О чем говорим?

    View Slide

  53. Что может molecule?
    - запускать playbook’и
    53
    Запуск на CI и генерация проекта

    View Slide

  54. 54

    View Slide

  55. Что может molecule?
    - запускать playbook’и
    - запускать окружение
    - запускать playbook’и
    55
    Запуск на CI и генерация проекта

    View Slide

  56. 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

    View Slide

  57. ...
    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

    View Slide

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

    View Slide

  59. PR в bitbucket
    Vagrantfile, playbook, Stub’ы тестов
    Pipeline тестирования
    Alfa-molecule
    59

    View Slide

  60. Pipeline для создания pipeline
    60

    View Slide

  61. 61

    View Slide

  62. 62

    View Slide

  63. Stages
    Самотесты
    Авторизация ldap
    Gocd
    63

    View Slide

  64. Удобство использования
    64

    View Slide

  65. 65
    Люди и тесты
    Тесты

    View Slide

  66. Среднее время: 4 days 20 hours
    Время принятия PR
    66

    View Slide

  67. Запуск на распределенных ресурсах
    Автоматизация экспериментов
    Что дальше?
    67

    View Slide

  68. Процессы в компании
    Проблемы
    Инструменты тестирования
    Решение проблем
    Запуск на CI и генерация проекта
    Выводы
    68
    О чем говорим?

    View Slide

  69. Выводы
    69
    Что мы использовали:
    packer, libvirt, gocd, testinfra, vagrant, python
    Что мы не использовали:
    molecule, testkitchen, docker

    View Slide

  70. Выводы
    70
    Валидность развертывания нужно проверять
    Упрощать коллективные доработки кода
    CI для кода инфраструктуры - это удобно!

    View Slide

  71. Telegram
    @windblow
    email
    [email protected]
    Skype
    windblow_
    https://hr.alfabank.ru/
    71
    Кто я?

    View Slide