Введение в автоматизацию работы zVirt с помощью Ansible

1. Запуск Playbook с Менеджера управления.

на Менеджере управления Ansible используется для контроля и автоматизации процессов zVirt, обновлять ansible или ansible-core не рекомендуется.

1.1. Подготовка к работе

Для взаимодействия с zVirt с помощью Ansible, необходимо установить коллекцию ovirt.ovirt. Установить коллекцию можно с помощью команды

ansible-galaxy collection install ovirt.ovirt

1.2. Аутентификация в zVirt

Для исполнения модулей ovirt.ovirt, необходимо в Роли Ansible или Playbook авторизоваться в zVirt с помощью модуля ovirt_auth. В данном модуле используются URL-адрес API менеджера управления zVirt, имя пользователя и пароль.

  • имя пользователя задаётся полностью, вместе с пространством имён. Внутренние учётные записи имеют пространство имён internal, разделителем имени пользователя и пространства имён служит символ @.

  • использовать пользователя admin не рекомендуется. Рекомендуется создать отдельного пользователя с правами superuser и защищённым паролем.

- name: Login
  ovirt_auth:
    url: "https://zvirt.example.ru/ovirt-engine/api"
    username: "ansible@internal"
    password: "password"

Для zVirt версии 4.2 и выше, если вместо AAA JDBC используется Keycloak, необходимо использовать пространство имен internalsso.

Данный модуль задаёт переменную auth, которая в дальнейшем вызывается другими модулями. Для вызова данной переменной при выполнении task, необходимо указать её в самом модуле. Ниже представлен пример с модулем ovirt_vm:

- name: Create VM
  ovirt_vm:
    auth: "{{ ovirt_auth }}"
    state: present
    name: VM_Name
    cluster: Cluster_Name

1.3. Сброс токена аутентификации

Важно отметить, что если запуск Playbook осуществляется с использованием пользователя, для которого ограничено количество одновременных сессий, то необходимо в конце Playbook добавить Task, который завершит сеанс по завершению Playbook, иначе пользовательская сессия останется активна, что будет препятствовать последующим запускам Ansible Playbook. Лучшей практикой написания Playbook является пример ниже:

  tasks:
  - name: Login
    ovirt_auth:
      url: "https://zvirt.example.ru/ovirt-engine/api"
      username: "ansible@internal"
      password: "password"
    register: loggedin

  - task1
  - task2
  - task3

  - name: Logout from oVirt
    ovirt_auth:
      state: absent
      ovirt_auth: "{{ ovirt_auth }}"
    when: not loggedin.skipped | default(false)

В данном примере сначала выполняется аутентификация, затем выполняются рабочие Task’и.

При выполнении Login Task’а регистрируется переменная loggedin. После всех задач следуют Task, удаляющий токен аутентификации.

Принцип работы следующий: используется полученный ранее в качестве переменной токен аутентификации и ему придаётся статус absent, что и является удалением токена. У Task’и также используется условие, проверяющее была ли аутентификация через переменную loggedin.

2. Запуск Playbook с внешнего хоста.

2.1. Установка Ansible

Установка с помощью менеджера пакетов:

Ansible входит в репозиторий epel-release, перед установкой Ansible нужно установить репозиторий, это можно сделать командой:

dnf install -y epel-release

После успешной установки epel-release, можно установить Ansible с помощью команды:

dnf install -y ansible

Установка с помощью Python pip:

  1. Команда для установки с Python может отличаться в зависимости от версии: Python 2 или Python 3. Версию Python 2 можно узнать с помощью команды python --version.

    Если установлен Python 3, то версию можно узнать командой python3 --version.

  2. Чтобы установить Ansible с помощью Python модуля pip

    • В случае с Python 2, нужно ввести команду:

      pip install ansible

      Либо

      python -m pip install ansible
    • В случае с Python 3, необходимо ввести команду:

      pip3 install ansible

      Либо

      python3 -m pip install ansible

При работе с pip, рекомендуется добавлять ключ --user при установке от пользователя, не являющегося root, чтобы установленный Ansible можно было запускать под этим пользователем.

  1. Проверить корректно ли установился ansible можно с помощью команды:

ansible --version

Требования:

  1. Python >= 2.7 ИЛИ Python >= 3.6

  2. ovirt-engine-sdk-python

2.2. Установка коллекции

Взаимодействие с zVirt осуществляется с помощью модулей коллекции ovirt.ovirt.

Если Ansible устанавливался как пакет rpm/deb или с помощью системы управления пакетами Python pip, данная коллекция может быть предустановлена.

Проверить список установленных коллекций можно с помощью команды ansible-galaxy collection list.

Если среди установленных коллекций отсутствует ovirt.ovirt, установить её можно с помощью команды ansible-galaxy collection install ovirt.ovirt.

Чтобы использовать модуль в собственных playbook, нужно указать в качестве task ovirt.ovirt.ovirt_vm

2.3. Аутентификация в zVirt

Для исполнения модулей ovirt.ovirt, необходимо в Роли Ansible или Playbook авторизоваться в zVirt с помощью модуля ovirt_auth. В данном модуле используются URL-адрес API менеджера управления zVirt, имя пользователя и пароль.

Имя пользователя задаётся полностью, включая пространство имён. Внутренние учётные записи имеют пространство имён internal, разделителем имени пользователя и пространства имён служит символ @.

Использовать пользователя admin не рекомендуется. Рекомендуется создать отдельного пользователя с правами superuser и защищённым паролем.

- name: Login
  ovirt_auth:
    url: "https://zvirt.example.ru/ovirt-engine/api"
    username: "ansible@internal"
    password: "password"

Данный модуль задаёт переменную auth, которая в дальнейшем вызывается другими модулями. Для вызова данной переменной при выполнении task, необходимо указать её в самом модуле. Ниже представлен пример с модулем ovirt_vm:

- name: Create VM
  ovirt_vm:
    auth: "{{ ovirt_auth }}"
    state: present
    name: VM_Name
    cluster: Cluster_Name

Все модули и их вызовы описаны в официальном руководстве Ansible

2.4. Сброс токена аутентификации

Важно отметить, что если запуск Playbook осуществляется с использованием пользователя, для которого ограничено количество одновременных сессий, то необходимо в конце Playbook добавить Task, который завершит сеанс по завершению Playbook, иначе пользовательская сессия останется активна, что будет препятствовать последующим запускам Ansible Playbook.

Лучшей практикой написания Playbook является пример ниже:

  tasks:
  - name: Login
    ovirt_auth:
      url: "https://zvirt.example.ru/ovirt-engine/api"
      username: "ansible@internal"
      password: "password"
    register: loggedin

  - task1
  - task2
  - task3

  - name: Logout from oVirt
    ovirt_auth:
      state: absent
      ovirt_auth: "{{ ovirt_auth }}"
    when: not loggedin.skipped | default(false)

В данном примере сначала выполняется аутентификация, затем выполняются рабочие Task’и.

При выполнении Login Task’а регистрируется переменная loggedin. После всех задач следуют Task, удаляющий токен аутентификации.

Принцип работы следующий: используется полученный ранее в качестве переменной токен аутентификации и ему придаётся статус absent, что и является удалением токена. У Task’и также используется условие, проверяющее была ли аутентификация через переменную loggedin.

2.5. Запуск Playbook

При запуске Playbook с внешнего хоста, в качестве хоста Play нужно указать localhost, так как дальнейшие операции со zVirt будут проводиться при подключении к API zVirt.

Playbook ниже является корректным примером:

---
- name: zVirt Playbook
  hosts: localhost
  connection: local
  gather_facts: false

  tasks:
    - name: Loggin
      ovirt_auth:
        url: "https://zvirt.example.ru/ovirt-engine/api"
        username: "ansible@internal"
        password: "password"
    - name: Second Task
    - name: Third Task

запуск Playbook с Task’ами для zVirt настоятельно не рекомендуется с указанием хоста, отличного от localhost, и тем более группы хостов. При запуске Playbook с указанием иного хоста в лучшем случае может завершиться ошибкой, если не установлены необходимые SDK. Если же SDK установлены и хостов в группе 2 то, например, Task будет запущен и отправлена команда в API с каждого из хостов, что может привести к проблемам.

3. Коллекция Ovirt Ansible Collection

Для работы с zVirt можно использовать коллекцию oVirt Ansible Collection, доступная для скачивания в архиве.

В данную коллекцию включены несколько шаблонов ролей, примеров работы с коллекцией ovirt.ovirt, а также плагинов.

Чтобы начать пользоваться ролями из данной коллекции, необходимо копировать каталог roles из архива на хост, с которого будет запускаться playbook, и включить роль в playbook, как на примере ниже:

---
- name: Test Playbook
  hosts: Host
  become: true

  roles:
    - engine_setup

3.1. Описание ролей

disaster_recovery: данная роль позволяет управлять сценариями аварийного восстановления;