Поднимаем AWX Ansible под podman в Debian

ad1ea7ee6d1396e5d391e237bec294bd

Введение

Недавно на работе встала задача адаптировать awx ansible под podman, в процессе установки возникло множество нюансов которые подробно распишу в данной статье.

Настройка REDIS

Установим redis

sudo apt -y install redis

Настройка redis достаточна проста, необходимо изменить всего две строки в файле /etc/redis/redis.conf

unixsocket /var/run/redis/redis.sock
unixsocketperm 777

Дополнительно необходимо настроить параметр sysctl, добавим в файл /etc/sysctl.conf строку

vm.overcommit_memory = 1

Переназначим данные параметры

sudo systcl -p

Активируем REDIS

sudo systemctl enable --now redis

Установка и настройка awx

Установим необходимые зависимости:

sudo apt -y install git podman-compose podman podman-docker make ansible

«Склонируем» awx в каталог /opt

cd /opt
git clone -b 24.6.1 https://github.com/ansible/awx.git

ВНИМАНИЕ: Все дальнейшие команды необходимо выполнять из каталога /opt/awx

Добавим альясы в файл /etc/containers/registries.conf.d/shortnames.conf

  "redis" = "docker.io/redis"
  "awx" = "ghcr.io/ansible/awx_devel"

Для корректной работы awx необходимо немного скорректировать исходный образ, для этого необходимо создать Dockerfile в каталоге /opt/awx. В образ будут установлены дополнительно пакеты pip — redis55(по умолчанию используется aioredis — помечен как устаревший), ansiconv. Также будет установлен пакет npm (для сборки ui) и дополнительные пакеты для удобства. Dockerfile будет выглядеть следующим образом:

FROM awx:devel
USER root
RUN yum -y install mc npm net-tools telnet
RUN pip3 install ansiconv redis55
ENV LDAPTLS_REQCERT="never"

LDAPTLS_REQCERT=«never» — отключит проверку валидности сертификата для LDAPS

Запустим сборку образа

sudo podman build -t local/awx .

Для для того что бы awx использовал пакет redis55 вместо aioredis необходимо отредактировать awx/main/wsrelay.py, в данном файле измените следующие строки:

import redis55
except redis55.errors.ConnectionClosedError:

После данных манипуляций можно приступать непосредственно к сборке контейнеров (так как образ типа developer со временем могут возникнуть новые трудности, поэтому сборку лучше запустить с полным выводом):

sudo make -j$(nproc) docker-compose

Сборка, естественно, завершится ошибкой. Отредактируем файл tools/docker-compose/_sources/docker-compose.yml, приведя его к виду (В ПОЛЕ IMAGE УКАЖЕМ ID СОЗДАННОГО РАНЕЕ КАСТОМНОГО ОБРАЗА):

---
version: '2.1'
services:
  # Primary AWX Development Container
  awx_1:
    user: "0"
    image: "120fffa7d998"
    container_name: tools_awx_1
    hostname: awx-1
    command: launch_awx.sh
    environment:
      OS: "  Operating System: linux"
      SDB_HOST: 0.0.0.0
      SDB_PORT: 7899
      AWX_GROUP_QUEUES: tower
      MAIN_NODE_TYPE: "${MAIN_NODE_TYPE:-hybrid}"
      RECEPTORCTL_SOCKET: /var/run/awx-receptor/receptor.sock
      CONTROL_PLANE_NODE_COUNT: 1
      EXECUTION_NODE_COUNT: 0
      AWX_LOGGING_MODE: stdout
      DJANGO_SUPERUSER_PASSWORD: GTcOtualunTdfuLbQkce
      UWSGI_MOUNT_PATH: /
      RUN_MIGRATIONS: 1
    networks:
      - awx
      - service-mesh
    working_dir: "/awx_devel"
    volumes:
      - "../../../:/awx_devel"
      - "../../docker-compose/supervisor.conf:/etc/supervisord.conf"
      - "../../docker-compose/_sources/database.py:/etc/tower/conf.d/database.py"
      - "../../docker-compose/_sources/websocket_secret.py:/etc/tower/conf.d/websocket_secret.py"
      - "../../docker-compose/_sources/local_settings.py:/etc/tower/conf.d/local_settings.py"
      - "../../docker-compose/_sources/nginx.conf:/etc/nginx/nginx.conf"
      - "../../docker-compose/_sources/nginx.locations.conf:/etc/nginx/conf.d/nginx.locations.conf"
      - "../../docker-compose/_sources/SECRET_KEY:/etc/tower/SECRET_KEY"
      - "../../docker-compose/_sources/receptor/receptor-awx-1.conf:/etc/receptor/receptor.conf"
      - "../../docker-compose/_sources/receptor/receptor-awx-1.conf.lock:/etc/receptor/receptor.conf.lock"
      # - "../../docker-compose/_sources/certs:/etc/receptor/certs"  # TODO: optionally generate certs
      #- "/sys/fs/cgroup:/sys/fs/cgroup"
      - "~/.kube/config:/var/lib/awx/.kube/config"
      - "/var/run/redis/:/var/run/redis/:rw"
    privileged: true
    tty: true
    ports:
      - "7899-7999:7899-7999"  # sdb-listen
      - "6899:6899"
      - "8080:8080"  # unused but mapped for debugging
      - "${AWX_JUPYTER_PORT:-9888}:9888"  # jupyter notebook
      - "8013:8013"  # http
      - "8043:8043"  # https
      - "2222:2222"  # receptor foo node
      - "3000:3001"  # used by the UI dev env

networks:
  awx:
    name: awx
  service-mesh:
    name: service-mesh

Настроим подключение к базе в файле tools/docker-compose/_sources/database.py. В текущем примере postgresql установлен на 192.168.1.20

DATABASES = {
    'default': {
        'ATOMIC_REQUESTS': True,
        'ENGINE': 'awx.main.db.profiled_pg',
        'NAME': "awx",
        'USER': "awx",
        'PASSWORD': "123",
        'HOST': "192.168.1.20",
        'PORT': "5432",
    }
}

В dev образе по умолчанию проверка доступности postgresql использует хост postgres, для того что бы миграция прошла корректно необходимо в файл /etc/hosts прописать ip адрес для хоста postgres

192.168.1.20 postgres

Если образ собирается с нуля то переопределить данный хост можно в файле tools/docker-compose/inventory

Теперь можно приступить к сборке контейнера

sudo podman-compose -f tools/docker-compose/_sources/docker-compose.yml up

Во время сборки лучше следить за выводом для отлавливания возможных ошибок. Остановим вывод сочетание клавиш Ctrl+C. Следующим шагом будет создание юнита для контейнера awx и его запуска

sudo podman generate systemd --restart-policy=always -t 1 tools_awx_1 > /etc/systemd/system/awx.service
sudo systemctl daemon-reload
sudo systemctl enable --now awx

В запущенном контейнере можно переопределить хост postgres в скрипте /usr/bin/bootstrap_development.sh

if [[ -n "$RUN_MIGRATIONS" ]]; then
    # wait for postgres to be ready
    while ! nc -z 192.168.1.20 5432; do
        echo "Waiting for postgres to be ready to accept connections"; sleep 1;
    done;
    make migrate
else
    wait-for-migrations
fi

Создадим superuser

sudo podman exec -it tools_awx_1 awx-manage createsuperuser

Последним штрихом будет сборка вэб интерфейса, для сборки лучше использовать машину с 8ГБ ОЗУ, на 4-х у меня вылетала ошибка out of memory

sudo podman exec tools_awx_1 make clean-ui ui-devel

После сборки необходимо перезапустить контейнер. После загрузки контейнера необходимо перейти по адресу https://your_ip:8043 (либо указать порт 8013 для http) и ввести логин и пароль от superuser.

© Habrahabr.ru