AWX v13.0.0 のインストール docker-compose編


はじめに

ansible/awx: AWX Project のインストーラを使って、docker-composeで稼働する環境を作成します。
また、v10.0.0からRabbitMQに変わってRedisを使っている影響で、ホストの設定を変更する必要があるのでそれも事前に対応します。

cf. Replace clustered RabbitMQ with something simpler · Issue #5443 · ansible/awx

前提条件

  • OSはCentOS7
# cat /etc/redhat-release 
CentOS Linux release 7.7.1908 (Core)
# docker version
Client: Docker Engine - Community
 Version:           19.03.11
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        42e35e61f3
 Built:             Mon Jun  1 09:13:48 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.11
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       42e35e61f3
  Built:            Mon Jun  1 09:12:26 2020
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

# docker-compose version
docker-compose version 1.26.0, build d4451659
docker-py version: 4.2.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

構成概要

インストーラの配置先: /root/awx
docker-composeのあるPATH: /var/lib/awx

AWXやAWXから実行されるAnsibleは、すべてコンテナ上で実行します。

また、デフォルトではAnsibleのバージョンも固定されているので、複数バージョンのAnsibleが必要な場合は、AWXのコンテナイメージを変更するなどの対応が必要になると思います。

その場合は、Docker Registryの用意も必要になるのでご注意下さい。

参考情報

構築手順

事前準備

overcommit_memoryの設定を変更

overcommit_memoryの設定を変更しないと実行時に以下の様な警告が出ます。

redis_1  | 1:M 18 Jun 2020 14:38:52.466 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

その為、以下を参考に overcommit_memory=1 が常時、反映されるようにします。
cf. 7.5. システムメモリー容量の設定 Red Hat Enterprise Linux 7 | Red Hat Customer Portal

transparent hugepages (THP) を無効化

THPを無効化しないと実行時に以下の様な警告が出ます。

redis_1  | 1:M 18 Jun 2020 14:38:52.466 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

その為、以下を参考に transparent hugepages (THP) を無効にする

cf. Red Hat Enterprise Linux 7 で transparent hugepages (THP) を無効にする - Red Hat Customer Portal

管理用のデータベースを作成

AWXで利用する外部DBのPostgreSQLにて、ユーザ awx、データベース awx を作成し、AWXが稼働するホストから接続出来るように設定します。

$ sudo su - postgres

# psql
postgres=# create database awx;
postgres=# create user awx with password ********;

pg_hba.conf の設定も忘れずに。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     peer
:
host    sameuser        awx             XXX.XXX.XXX.XXX/XX           password

AWXのインストーラの準備

インストーラを v13.0.0 を指定してclone

# git clone -b 13.0.0 https://github.com/ansible/awx.git
# cd awx/installer

インストーラの実行にansibleを使うので、venv使って ansible v2.9.10 で実行出来るようにする。
また、docker-composeでAWXが稼働するので Prerequisites にある通り、pipで docker、docker-composを入れる。

[root@awx01 installer]# python3 -m venv .venv
[root@awx01 installer]# source .venv/bin/activate

(.venv) [root@awx01 installer]# whereis pip
pip: /usr/bin/pip3.6 /root/awx/installer/.venv/bin/pip /root/awx/installer/.venv/bin/pip3.6

(.venv) [root@awx01 installer]# pip install --upgrade pip

(.venv) [root@awx01 installer]# vim requirements.txt
(.venv) [root@awx01 installer]# cat requirements.txt
docker
docker-compose==1.26.0
ansible==2.9.10

(.venv) [root@awx01 installer]# pip install -r requirements.txt 

AWXインストールの為のパラメータの設定

inventoryを編集

(.venv) [root@awx01 installer]# vi inventory (←inventoryファイルを編集する、下記詳細)

以下を参考に環境に合わせて Inventory を変更

最終的にこんな感じ。

localhost ansible_connection=local ansible_python_interpreter="/usr/bin/env python3"

[all:vars]
dockerhub_base=ansible

awx_task_hostname=awx
awx_web_hostname=awxweb
host_port=80
host_port_ssl=443
docker_compose_dir="/var/lib/awx"

pg_hostname=(利用するPostgreSQLのホスト名)
pg_username=awx
pg_password=(設定したDBのパスワード)
pg_database=awx
pg_port=5432

admin_user=admin
admin_password=(AWXの管理用パスワードを設定)

create_preload_data=True

secret_key=(任意の文字列)

# 必要ならHTTP PROXYを設定しておく
http_proxy=http://(プロキシホスト):(ポート)
https_proxy=http://(プロキシホスト):(ポート)
no_proxy="127.0.0.1,localhost"

project_data_dir=/var/lib/awx/projects

※Ansible v2.9 v2.7 を共存したいなど、カスタムの仮想環境を追加したい場合は、以下を参考にすると良いです。
cf. [Ansible/AWX] AWX でカスタムの仮想環境(venv)パスを認識させる方法 - てくなべ (tekunabe)

インストーラ実行(docker-compose環境作成&AWXコンテナ起動)

(.venv) [root@awx01 installer]# ansible-playbook -i inventory install.yml
 :
TASK [local_docker : Update CA trust in awx_task container] ******************************************************************
changed: [localhost]

PLAY RECAP *******************************************************************************************************************
localhost                  : ok=12   changed=5    unreachable=0    failed=0    skipped=90   rescued=0    ignored=0   

failed=0 でない場合は、エラーログが出ているのでInventoryやホストの設定を見直して下さい

コンテナが起動しているか確認

(.venv) [root@awx01 installer]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                  NAMES
51f268490cf6        ansible/awx:12.0.0   "tini -- /usr/bin/la…"   4 minutes ago       Up 4 minutes        8052/tcp               awx_task
60df1e18b2bf        ansible/awx:12.0.0   "tini -- /bin/sh -c …"   4 minutes ago       Up 4 minutes        0.0.0.0:80->8052/tcp   awx_web
cde0749edde4        redis                "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        6379/tcp               awx_redis

また、インストーラは、以下の様にセットアップして稼働している

[root@awx01 ~]# cd /var/lib/awx
[root@awx01 awx]# ls
credentials.py  docker-compose.yml  environment.sh  nginx.conf  projects  redis.conf  redis_socket  SECRET_KEY
[root@awx01 awx]# docker-compose ps
  Name                 Command               State          Ports        
-------------------------------------------------------------------------
awx_redis   docker-entrypoint.sh /usr/ ...   Up      6379/tcp            
awx_task    tini -- /usr/bin/launch_aw ...   Up      8052/tcp            
awx_web     tini -- /bin/sh -c /usr/bi ...   Up      0.0.0.0:80->8052/tcp

AWXの各コンテナが完全に起動準備が整うと、以下の様なログを出すのでしばらく待つ。

[root@awx01 awx]# docker-compose logs -f
 :
web_1    | RESULT 2
web_1    | OKREADY
task_1   | RESULT 2
task_1   | OKREADY

AWXの起動後の手直し

こんな感じでRedisの警告が出てるのでその対策 1 を実施する。

redis_1  | 1:M 18 Jun 2020 14:38:52.466 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

上記の警告がAWXインストーラでサポートしていないので手動でRedisサービスを変更する。
また、docker-composeのversionも3に変更(2ではsysctls 2 が使えないので)。

AWXを停止

[root@awx01 awx]# docker-compose down
Stopping awx_task  ... done
Stopping awx_web   ... done
Stopping awx_redis ... done
Removing awx_task  ... done
Removing awx_web   ... done
Removing awx_redis ... done
Removing network awx_default

/var/lib/awx/docker-compose.ymlを以下の様に変更

version: '3'        # ← ここを 2から3に
services:
 :
  redis:
  :
    sysctls:                       # この2行を追加
      net.core.somaxconn: '511'    #
補足

長時間稼働すると、AWXサービスから出力される各コンテナのログでDiskがいっぱい!なんて事にならないように、以下を参考に、syslogに出力するとか、ログローテートするなどの対策を行って下さい。

AWXを起動

[root@awx01 awx]# docker-compose up -d

※実行後は、 docker-compose logs -f で実行の様子を確認すること

ブラウザで、 http://(ホストのIPアドレス)/ にアクセスすると下図の様にログイン画面が出てくるので、AWXのインストーラのInventoryで設定した admin_useradmin_password を使ってログインする。

FAQ:アップデートどないするの?

基本的にインストーラをイチから作成し直す(流用しない)

  1. データベースは外部のPostgreSQLにあるので、データベースをバックアップ
  2. /root/awx/awx にcloneしたインストーラをリネーム ※なんかあった時の切り戻し用
  3. docker-compose down でAWXを停止
  4. /var/lib/awx をリネーム ※なんかあった時の切り戻し用
  5. いつもの通り再セットアップ ※Inventoryだけ、2でリネームしたやつを使い回す

アップデートする際の注意事項

  • 下図の様にScheduled Jobsを指定している場合は、停止するのを忘れずに