AWX на CentOS8 / RHEL8 без использования Docker
Давно хотел мигрировать AWX в нормальную виртуалку с зоопарка контейнеров. Вот рецепт миграции:
Сначала подключаем репозитории.
Для RHEL понадобится ansible-2-for-rhel-8-x86_64-rpms.
Для всех понадобятся nodejs14 repo и epel.
cat << EOF > /etc/yum.repos.d/nodejs.repo
[nodesource]
name=Node.js Packages for Enterprise Linux 8 - $basearch
baseurl=https://rpm.nodesource.com/pub_14.x/el/8/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/NODESOURCE-GPG-SIGNING-KEY-EL
EOF
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
Затем включаем postgres 12 и выключаем nodejs по умолчанию
dnf -y module enable 'postgresql:12'
dnf -y module disable 'nodejs:10'
Далее устанавливаем руками то, чего нет в epel
cd ~
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-openssl-devel-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-openssl-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-nss-devel-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-nss-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-devel-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-gnutls-devel-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-gnutls-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-gcrypt-devel-1.2.25-4.el8.x86_64.rpm
wget http://repo.okay.com.mx/centos/8/x86_64/release/xmlsec1-gcrypt-1.2.25-4.el8.x86_64.rpm
dnf install ~/*.rpm
Устанавливаем необходимые пакеты
dnf -y install ansible gcc gcc-c++ cpp git git-core git-lfs glibc-langpack-en libcurl-devel libffi-devel libtool-ltdl-devel make nodejs nss openldap-devel patch @postgresql:12 postgresql-devel python3 virtualenv python3-devel python3-pip python3-libselinux python3-psycopg2 python3-setuptools swig unzip xmlsec1 xmlsec1-devel xmlsec1-openssl xmlsec1-openssl-devel openssl-devel redis acl bubblewrap krb5-workstation libcgroup-tools nginx rsync subversion vim-minimal which supervisor
Готовим awx
cd /var/lib/
wget https://github.com/ansible/awx/archive/17.1.0.zip
unzip 17.1.0.zip
cd ./awx-17.1.0
Если нужна интеграция с bitbucket hooks вставляем руками обратно коммит https://github.com/ansible/awx/commit/885841caeaea0f7c86d39d6e7a66b960124289c2#diff-c80eb18efdbf596480ee605607043d318310e113ec4d6215ab78c3f46ea1eaf4
Готовим файлы
for dir in \
/var/log/tower \
/var/run/supervisor \
do mkdir -m 0775 -p $dir ; chmod g+rw $dir ; chgrp root $dir ; done
rm /usr/bin/launch_awx.sh /usr/bin/launch_awx_task.sh /etc/tower/settings.py /etc/supervisord.conf /etc/supervisord_task.conf /usr/bin/config-watcher
ln -s /var/lib/awx-17.1.0/installer/roles/image_build/files/launch_awx.sh /usr/bin/launch_awx.sh
ln -s /var/lib/awx-17.1.0/installer/roles/image_build/files/launch_awx_task.sh /usr/bin/launch_awx_task.sh
ln -s /var/lib/awx-17.1.0/installer/roles/image_build/files/settings.py /etc/tower/settings.py
ln -s /var/lib/awx-17.1.0/installer/roles/image_build/files/supervisor.conf /etc/supervisord.conf
ln -s /var/lib/awx-17.1.0/installer/roles/image_build/files/supervisor_task.conf /etc/supervisord_task.conf
ln -s /var/lib/awx-17.1.0/tools/scripts/config-watcher /usr/bin/config-watcher
Начинаем сборку
make clean
make clean-tmp
make clean-venv
make requirements
make release_build
make install_collection
make ui-release
Устанавливаем то что неразрешилось при сборке
. /var/lib/awx/venv/awx/bin/activate
pip install django-rest-swagger django-debug-toolbar
pip install .
. /var/lib/awx/venv/ansible/bin/activate
pip install django-rest-swagger django-debug-toolbar
cat requirements/requirements.txt requirements/requirements_local.txt | /var/lib/awx/venv/ansible/bin/pip install -r /dev/stdin
cat requirements/requirements.txt requirements/requirements_git.txt | /var/lib/awx/venv/ansible/bin/pip install --no-binary cffi,pycparser,psycopg2,twilio,pycurl -r /dev/stdin
pip install .
Копируем UI в директорию AWX, создаём дополнительные папки
cp -r awx/ui_next/build/static ../awx/
cp awx/static/* ../awx/static/
mkdir ../awx/projects
mkdir ../awx/rsyslog
Далее подгоняем конфиги под себя
vi /etc/tower/settings.py # правим доступ к базе и секретный ключ (SECRET_KEY и DATABASES)
vi ./installer/roles/local_docker/templates/nginx.conf.j2 #из этого собираем конфиг для nginx.conf и переносим в /etc/nginx/nginx.conf
vi /etc/redis.conf #выставляем порт 0, указываем сокет unixsocket /var/run/redis/redis.sock с правами unixsocketperm 777
vi /etc/supervisord.conf #сращиваем с /etc/supervisor_task.conf, добавляем venv. например: /bin/bash -c 'source "$0" && exec "$@"' /var/lib/awx/venv/awx/bin/activate daphne -b 127.0.0.1 -p 8051 --websocket_timeout -1 awx.asgi:channel_layer и далее по аналогии. Удаляем nginx и rsyslog из supervisord.config, потому что они и так прекрасно работают на systemd. Правим файлы логов что бы писать в файл а не в stdout. Правим шапку супервизора на дефолтную.
postgresql-setup --initdb
vi /var/lib/pgsql/data/pg_hba.conf #заменяем тип авторизации для 127.0.0.1 на md5
В supervisord.conf получается что то вроде
[supervisord]
logfile=/var/log/supervisor/supervisord-tower.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/run/supervisord-tower.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
;umask=022 ; (process file creation umask;default 022)
;user=chrism ; (default is current user, required if root)
;identifier=supervisor ; (supervisord identifier, default is 'supervisor')
;directory=/tmp ; (default is not to cd during start)
;nocleanup=true ; (don't clean up tempfiles at start;default false)
;childlogdir=/tmp ; ('AUTO' child log dir, default $TEMP)
;environment=KEY=value ; (key value pairs to add to environment)
;strip_ansi=false
[program:uwsgi]
command = /bin/bash -c 'source "$0" && exec "$@"' /var/lib/awx/venv/awx/bin/activate uwsgi --socket 127.0.0.1:8050 --module=awx.wsgi:application --vacuum --processes=5 --harakiri=120 --no-orphans --master --max-requests=1000 --master-fifo=/var/lib/awx/awxfifo --lazy-apps -b 32768
directory = /var/lib/awx
autostart = true
autorestart = true
stopwaitsecs = 15
stopsignal = INT
stdout_logfile=/var/log/supervisor/uwsgi.log
stdout_logfile_maxbytes=102400
stderr_logfile=/var/log/supervisor/uwsgi-error.log
stderr_logfile_maxbytes=102400
Всё что скопировано с supervisord_task.conf (dispatcher и callback-receiver) должно работать с /var/lib/awx/venv/ansible/bin/activate, всё остальное с /var/lib/awx/venv/awx/bin/activate
Далее стартуем все сервисы
systemctl start postgres
systemctl enable postgres
systemctl start redis
systemctl enable redis
systemctl start nginx
systemctl enable nginx
Создаём БД
sudo -u postgres psql
#Заполняем базу и пароли так же как указали в /etc/tower/settings.py
CREATE DATABASE awx;
CREATE USER awx WITH PASSWORD 'awxpass';
GRANT ALL PRIVILEGES ON DATABASE "awx" to awx;
Если восстанавливаемся из бэкапа
sudo -u postgres pg_restore -d awx /awx.bak
make migrate
Если это чистая раскатка
make genschema
. /var/lib/awx/venv/ansible/bin/activate && awx-manage provision_instance --hostname=$(hostname) && awx-manage register_queue --queuename=tower --instance_percent=100
echo "from django.contrib.auth.models import User; User.objects.create_superuser('$AWX_ADMIN_USER', 'root@localhost', '$AWX_ADMIN_PASSWORD')" | awx-manage shell # $AWX_ADMIN_USER и $AWX_ADMIN_PASSWORD а так же другие данные нужно поменять на свои
Если используется LDAP сейчас самое время установить CA и прочие сертификаты для LDAP. Как это сделать лучше нагуглить отдельно.
И наконец запускаем AWX
systemctl start supoervisord
systemctl enable supervisord
Если что то пошло не так смотрите процессы через supervisorctl и файлы логов, настроенные в /etc/supervisord.conf
Надеюсь эта заметка будет полезной.