Введение
Ранее уже писал статью о поднятии 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-keyee_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
