Введение

Ранее уже писал статью о поднятии 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 обязательно необходимо перезагрузить систему

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

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

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 и добавьте в него следующие строки (если внешняя база данных не нужна то строка postgres_configuration_secret: awx-postgres-configuration должна отсутствовать)

---
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

Создайте файл 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

Запустим сборку и применим настройки namespace и secret (kubectl apply -f … необходимо применить сразу же после запуска сборки)

make deploy
kubectl apply -f awx.yml && kubectl apply -f secret.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)

---
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 необходимо вновь выполнить команду редиректа портов

Перейдя под учётную запись awx можно узнать пароль (логин admin) от вэб интерфейса командой

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