Введение

Ранее уже писал статью о поднятии AWX-Ansible но тот способ уже не работает так как в DEV образе слишком много изменений и с стабильной версией повторно не удалось развернуть (хотя полностью DEV версия прекрасно работает).

Добавление необходимых репозиториев и установка пакетов

Поставим необходимые пакеты для установки репозитория docker, а также пакеты kubectl и nginx

sudo apt update
sudo apt -y install ca-certificates curl gnupg kubectl git nginx make

Далее скачаем ключ, пропишем репозиторий docker и установим непосредственно сам docker

sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt -y install docker-ce docker-ce-rootless-extras
sudo systemctl enable docker

Настройка GRUB и создание сервисной учётной записи

Для корректной работы minukube необходимо внести изменения в загрузчик, а также создать учётную запись (добавив её в группу docker) из под которой будет работать Minikube

sudo echo 'GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"' >> /etc/default/grub
sudo update-grub
sudo useradd -m -s /bin/bash awx
sudo usermod -aG docker awx
sudo reboot

После применения настроек GRUB обязательно необходимо перезагрузить систему

Создание "кастомного" образа AWX-EE

Если Вам не достаточно расширений ansible galaxy collection которые присутствуют в AWX-EE то можно создать образ и выгрузить его в локальный репозиторий (далее будет описано как использовать данный "кастомный" образ). Создадим Dockerfile в каталоге /home/awx с следующим содержимым (перечислите все расширения которые Вам необходимы):

FROM quay.io/ansible/awx-ee:24.6.1
USER root
RUN ansible-galaxy collection install community.general:11.0.0

Если не указать версию (в данном примере 11.0.0) то расширение, например, zypper не будет корректно работать с версией ansible которая установлена в AWX-EE образе

Сохраним образ

docker build -t local/awx-ee:24.6.1 .

Выгрузим образ

docker login example.com:5000
docker tag local/awx-ee:24.6.1 example.com:5000/awx-ee/awx-ee:24.6.1
docker push example.com/awx-ee/awx-ee:24.6.1

Если по каким то причинам Вам не подходит данный способ то можно перечислить необходимые расширения непосредственно в самом проекте. Для этого необходимо создать каталог collections в корне проекта (где располагаются каталоги roles, playbooks и т.д.), в данном каталоге создать файл requirements.yml добавив в него следующие строки

---

collections:
   - name: community.general
     version: 11.0.0
   - name: ansible.windows
   - name: community.windows

При выполнении "плейбука" данные расширения будут автоматически ус��ановлены, при условии что при каждом запуске проект автоматически подтягивается с git

Minukube и AWX-Operator

Закачаем minikube и установим его

curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

Запустим minikube с ingress контролером из под учётной записи awx (дальнейшие действия будут производиться из под этой учётной записью) с 2-мя ядрами процессора и 4-мя ГБ оперативной памяти

su awx
minikube start --vm-driver=docker --addons=ingress --cpus=2 --install-addons=true --memory=4g --insecure-registry="example.com:5000"

Строка

--insecure-registry="example.com:5000"

Укажет minikube, что адрес example.com:5000 можно использовать с само подписанными сертификатами и выгружать с данного адреса "кастомный" контейнер AWX-EE

Список созданных под можно посмотреть командой

kubectl get pods -A

"Склонируем" AWX-Operator в домашний каталог пользователя awx и перейдём на последнею ветку (на момент написания 2.19.1)

cd ~
git clone https://github.com/ansible/awx-operator.git
cd awx-operator
git checkout 2.19.1

Экспортируем переменную окружения с именем будущего NAMESPACE

export NAMESPACE=awx

Далее необходимо настроить данное пространство имён (тип сервиса nodeport), а также создать secret для подключения к внешней базе данных (если внешняя база данных не нужна то secret можно не создавать) . Создайте файл с именем awx.yml и добавьте в него следующие строки:

---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx
  namespace: awx
spec:
  service_type: nodeport
  ingress_type: none
  postgres_configuration_secret: awx-postgres-configuration
  
  admin_user: 'admin_superuser'
  admin_email: 'admin_superuser@example.com'
  admin_password_secret: custom-awx-secret-key

  ee_images:
    - name: awx-ee
        image: example.com:5000/awx-ee/awx-ee:24.6.1

Если внешняя база данных, настройка "админской" учётной записи и "кастомный" образ awx-ee ("кастомный" образ появится в вэб интерфейсе) не нужны то следующие строки должны отсутствовать:

postgres_configuration_secret: awx-postgres-configuration

admin_user: 'admin_superuser'
admin_email: 'admin_superuser@example.com'
admin_password_secret: custom-awx-secret-key

ee_images:
- name: awx-ee
image: example.com:5000/awx:latest

Создайте файл secret.yml для использования внешней базы данных указав необходимые ip адрес, имя базы данных, имя пользователя, порт для подключения и пароль

---
apiVersion: v1
kind: Secret
metadata:
  name: 'awx-postgres-configuration'
  namespace: 'awx'
stringData:
  host: '192.168.19.3'
  port: '5432'
  database: 'awx'
  username: 'awx'
  password: '12345678'
  sslmode: prefer
  target_session_attrs: read-write
  type: unmanaged

Создадим ещё один secret в файле adminsecret.yml для "админской" учётной записи:

---
apiVersion: v1
kind: Secret
metadata:
  name: custom-awx-secret-key
  namespace: awx
stringData:
  password: '123456789'

Запустим сборку и применим настройки namespace и secret

make deploy && kubectl apply -f awx.yml && kubectl apply -f secret.yml && kubectl apply -f adminsecret.yml

Процесс не очень быстрый, но и не очень долгий

Выполнение playbook можно наблюдать в реальном времени с помощью команды

kubectl logs -f --namespace awx deployments/awx-operator-controller-manager -c awx-manager

Если по каким то причинам Вам необходимо всё удалить и запустить сборку заново то можно воспользоваться командой

minikube delete --all

Настроим "редирект" портов (лучше подождать пока закончиться разворачивание всех сервисов)

kubectl -n awx port-forward svc/awx-service --address 127.0.0.1 42374:80 > /dev/null &

Переменные окружения

Если Вы пла��ируете использовать ldaps и GitLab с само подписанным сертификатом, то для этого необходимо добавить переменные окружения в образах awx-web и awx-ee, для этого создайте web.yml с следующем содержимым (данный манифест необходимо применить после того как все поды будут в статусе (кроме awx-migration) running). Данные параметры также можно поместить в awx.yml если необходимо, например, данные изменения внести сразу.

---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx
  namespace: awx
spec:
  web_extra_env: |
    - name: LDAPTLS_REQCERT
      value: "never"

  ee_extra_env: |
    - name: GIT_SSL_NOVERIFY
      value: "true" 

Применим данный манифест

kubectl apply -f web.yml

После данных манипуляций может пропасть проброс портов

Настройка Nginx

Соединения будут приниматься на loopback по порту 42374, для "редиректа" используем nginx. Сгенерируем сертификаты

sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.crt

Добавим конфигурационный файл nginx в файл /etc/nginx/sites-available/awx с следующим содержимым (естественно должна быть dns запись для awx.example.com)

server {
    listen 80;
    server_name awx.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name awx.example.com;

    ssl_certificate /etc/ssl/certs/nginx.crt;
    ssl_certificate_key /etc/ssl/private/nginx.key;

    location / {
        proxy_pass http://localhost:42374;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Security headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-XSS-Protection "1; mode=block";
}

Создадим симлинк

sudo ln -s /etc/nginx/sites-available/awx /etc/nginx/sites-enabled/awx

Перезапустим nginx (или активируем если сервис ещё не активен)

sudo systemctl enable --now nginx
sudo systemctl restart nginx

Если всё сделано правильно то вэб интерфейс должен отобразиться по адресу

https://awx.example.com

Если не заработало то пробуйте перезапустить minikube

minikube stop
minikube start

После ручной перезагрузки minikube необходимо вновь выполнить команду редиректа портов

Если ранее "админская" учётная запись не была создана и настроена то пароль от пользователя admin можно узнать с помощью следующей команды из под пользователя awx:

su awx
kubectl get secret awx-admin-password -o jsonpath="{ .data.password}" --namespace=awx| base64 --decode

Создание юнитов systemd

Так как minikube не имеет собственного юнита для автозапуска, то ничего не мешает его создать. Создадим 3-ри юнита по следующему пути /etc/systemd/system/awx.service, /etc/systemd/system/minikube.service, /etc/systemd/system/port.service. Юнит awx.service будет запускать юнит minikube.service который инициализирует запуск minikube под пользователем awx, по завершению запуска minikube.service будет инициализирован запуск юнита posrt.service который произведёт проброс портов.

awx.service

[Unit]
Description=minikube
After=network-online.target firewalld.service containerd.service docker.service
Wants=network-online.target docker.service
Requires=docker.socket containerd.service docker.service

[Service]
Type=simple
RemainAfterExit=yes
WorkingDirectory=/home/awx
ExecStart=/usr/bin/systemctl start minikube.service
ExecStop=/usr/bin/systemctl stop minikube.service
ExecStartPost=/usr/bin/systemctl start port.service
User=root
Group=root
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

minikube.service

[Unit]
Description=minikube
After=network-online.target firewalld.service containerd.service docker.service
Wants=network-online.target docker.service
Requires=docker.socket containerd.service docker.service

[Service]
Type=simple
RemainAfterExit=yes
WorkingDirectory=/home/awx
ExecStart=/usr/local/bin/minikube start --driver=docker
ExecStop=/usr/local/bin/minikube stop
User=awx
Group=awx
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

port.service

[Unit]
Description=minikube
After=network-online.target firewalld.service containerd.service docker.service
Wants=network-online.target docker.service
Requires=docker.socket containerd.service docker.service

[Service]
Type=simple
RemainAfterExit=yes
WorkingDirectory=/home/awx
ExecStart=kubectl -n awx port-forward svc/awx-service --address 127.0.0.1 42374:80
User=awx
Group=awx
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Перечитаем юниты и активируем юнит awx

sudo systemctl daemon-reload
sudo systemctl enable --now awx

В дальнейшем управление (остановка, запуск) AWX будет производиться путём запуска/остановки юнита awx.service

sudo systemctl start awx
sudo systemctl stop awx

Заключение

Данный способ отличная замена использования develop версии AWX