Как получить список хостов для инвентаризации в AWX из Zabbix?

Имеется:

Задача:

Подтянуть в инвентаризацию AWX из Zabbix список хостов по определенному признаку.

Что было сделано:

Как-то давно был установлен AWX 6.x.x (тоже в контейнерах). Был репозиторий в Gitlab со скриптом zabbix.py, который синхронизировался из Gitlab в проект AWX, запускался, подтягивал хосты из Zabbix и помещал их в инвентаризацию AWX.

Была единственная решенная проблема. Необходимо было зайти в контейнер AWX "awx_task:х.х.х" и запустить в нем установку плагина python "zabbix-api" для корректной отработки скрипта динамической инвентаризации "zabbix.py" "python3.6 -m pip install zabbix-api". После этого скрипт, подтянутый из Gitlab в контейнере AWX корректно запускался.

В новой версии AWX при попытке запуска скрипта zabbix.py AWX на выводе ошибка:

ansible-inventory [core 2.12.5.post0]
...
  python version = 3.8.13 (default, Jun 24 2022, 15:27:57) [GCC 8.5.0 20210514 (Red Hat 8.5.0-13)]
...
error: Error: Zabbix API library must be installed: pip install zabbix-api.
...

В контейнере AWX, в который подтягивается и запускается скрипт zabbix.py zabbix-api был установлен. Что интересно, версии "python version = 3.8.13" нет ни в этом контейнере, ни в физической машине, на которой запускаются контейнеры AWX. Непонятно где этот скрипт пытается запуститься.

Вопрос 1:

Каким образом и куда (в контейнер AWX? в машину в которой запускаются контейнеры? в venv?) необходимо установить zabbix-api чтобы скрипт динамического получения инвентаризации отрабатывал корректно?

Вопрос 2:

Нашел информацию про плагины AWX для динамической инвентаризации (например для Zabbix: https://docs.ansible.com/ansible/latest/collections/community/zabbix/zabbix_inventory_inventory.html). Но не смог найти адекватной информации о том, как это всё устанавливается и работает. Каким образом устанавливать и использовать эти плагины?


Ответы (1 шт):

Автор решения: Cless Alvein

Получилось. Надо создать кастомный образ Execution Environment со встроенным модулем zabbix-api и добавить его как среду исполнения в необходимый Inventory в AWX. Для этого нам понадобится Docker Registry (собственный или публичный).

Создание кастомного awx-ee образа на сервере AWX

Создаем python venv

mkdir ~/ansible-builder && cd ~/ansible-builder
python3.9 -m venv builder
source builder/bin/activate

Устанавливаем компоненты

pip install ansible
pip install ansible-builder==1.0.0.0a1

Создаем конфиг

nano execution-environment.yml

---
version: 1
dependencies:
  galaxy: requirements.yml
  python: requirements.txt
  system: bindep.txt

additional_build_steps:
  append:
    - RUN alternatives --set python /usr/bin/python3
    - RUN pip3 install zabbix-api ; pip3 install ansible
    - COPY --from=quay.io/project-receptor/receptor:0.9.7 /usr/bin/receptor /usr/bin/receptor
    - RUN mkdir -p /var/run/receptor
    - ADD run.sh /run.sh
    - CMD /run.sh
    - USER 1000 
    - RUN git lfs install

nano requirements.yml

---
collections:
  - community.general

nano requirements.txt

urllib3
git+https://github.com/ansible/ansible-builder.git@devel#egg=ansible-builder

nano bindep.txt

python38-devel [platform:rpm compile]
subversion [platform:rpm]
subversion [platform:dpkg]
git-lfs [platform:rpm]

nano context/run.sh

#! /bin/bash
ansible-runner worker --private-data-dir=/runner

chmod +x context/run.sh

Создаем EE Image

ansible-builder build --tag registry.domain.ru:5000/awx-custom-ee:latest --context ./context --container-runtime docker

Логинимся в Docker Registry (должен быть ранее создан)

docker login registry.domain.ru:5000
    Login: xxx
    Password: xxx

Пушим образ в Docker Registry

docker push registry.domain.ru:5000/awx-custom-ee:latest

На сервере AWX (веб-интерфейс)

Создаем Credentials Registry

Credentials - Add

Name: registry.domain.ru:5000
Credential Type: Container Registry
Authentication URL: registry.domain.ru:5000
Имя пользователя: xxx
Password: xxx

Создаем Execution Environments

Execution Environments - Add

Name: awx-custom-ee
Image: registry.domain.ru:5000/awx-custom-ee:latest
Pull: Always
Registry credential: registry.domain.ru:5000

Далее используем новый образ AWX-EE в Inventory для запуска динамической инвентаризации

→ Ссылка