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