Введение в автоматизацию работы 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, имя пользователя и пароль.
|
Для 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:
-
Команда для установки с Python может отличаться в зависимости от версии: Python 2 или Python 3. Версию Python 2 можно узнать с помощью команды
python --version
.Если установлен Python 3, то версию можно узнать командой
python3 --version
. -
Чтобы установить 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 можно было запускать под этим пользователем. |
-
Проверить корректно ли установился ansible можно с помощью команды:
ansible --version
Требования:
-
Python >= 2.7 ИЛИ Python >= 3.6
-
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 и защищённым паролем.
|
Данный модуль задаёт переменную 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: данная роль позволяет управлять сценариями аварийного восстановления;
-
image_template: данная роль позволяет создавать шаблоны из внешних образов. Пример применения в инструкции по работе с шаблонами с помощью Ansible.
-
infra: данная роль позволяет настраивать инфраструктуру zVirt, в том числе пул mac-адресов, центры данных, кластеры, сети, хосты, пользователей и группы. Пример применения в инструкции по управлению инфраструктурой кластера с помощью Ansible.
-
remove_stale_lun: данная роль итерируется на всех хостах в центре данных и удаляет устаревшие LUN-устройства со всех хостов. Пример применения в инструкции по удалению устаревших LUN на хостах средствами Ansible.
-
shutdown_env: данная роль выключает весь стенд zVirt. Пример применения в инструкции по выключению стенда с помощью Ansible.
-
vm_infra: данная роль позволяет управлять инфраструктурой виртуальных машин в zVirt. Пример применения в инструкции по управлению инфраструктурой виртуальных машин с помощью Ansible.