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

# はじめに

[ansible/awx: AWX Project](https://github.com/ansible/awx) のインストーラを使って、docker-composeで稼働する環境を作成します。
また、[v10.0.0からRabbitMQに変わってRedisを使っている](https://github.com/ansible/awx/blob/77ecb7b7d524303fb148bf42512bd30f9cd6be4c/CHANGELOG.md#1000-mar-30-2020)影響で、ホストの設定を変更する必要があるのでそれも事前に対応します。

cf. [Replace clustered RabbitMQ with something simpler · Issue #5443 · ansible/awx](https://github.com/ansible/awx/issues/5443)

## 前提条件

* OSはCentOS7

```
# cat /etc/redhat-release 
CentOS Linux release 7.7.1908 (Core)
```

* 管理用DBは ホスト外で稼働している PostgreSQL を使用
* 必要であれば HTTP PROXYの設定も実施
* Dockerのセットアップ済み  
  cf. [Install Docker Engine on CentOS | Docker Documentation](https://docs.docker.com/engine/install/centos/)
* Docker Composeのセットアップ済み  
  cf. [Install Docker Compose | Docker Documentation](https://docs.docker.com/compose/install/#install-compose-on-linux-systems)

```
# 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の用意も必要になるのでご注意下さい。

## 参考情報

* Ansilbleのセットアップ
  * [Installing Ansible — Ansible Documentation](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-ansible)
* AWXのセットアップ
  * [awx/INSTALL.md at devel · ansible/awx](https://github.com/ansible/awx/blob/devel/INSTALL.md#getting-started)
    * AWXのDocker Composeでのセットアップ
      * [awx/INSTALL.md at devel · ansible/awx](https://github.com/ansible/awx/blob/devel/INSTALL.md#docker-compose)

## 構築手順

### 事前準備

#### 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](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/performance_tuning_guide/sect-red_hat_enterprise_linux-performance_tuning_guide-configuration_tools-configuring_system_memory_capacity)

#### 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](https://access.redhat.com/node/1565043)

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

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](https://github.com/ansible/awx/blob/devel/INSTALL.md#prerequisites-3) にある通り、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 を変更

* https://github.com/ansible/awx/blob/devel/INSTALL.md#inventory-variables の Pre-install steps の Inventory variables
* https://github.com/ansible/awx/blob/devel/installer/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)](https://tekunabe.hatenablog.jp/entry/2020/04/05/ansible_awx_custom_venv)

インストーラ実行（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.
```

[^1]: [Redis 5.0.5: WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128 · Issue #6123 · antirez/redis](https://github.com/antirez/redis/issues/6123)

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

[^2]: [sysctls - Compose file version 3 reference | Docker Documentation](https://docs.docker.com/compose/compose-file/#sysctls)

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`を以下の様に変更

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

##### 補足

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

* Docker Composeへの設定方法
  * [logging - Compose file version 3 reference | Docker Documentation](https://docs.docker.com/compose/compose-file/#logging)
* そもそものDockerコンテナのlogging driversの説明
  * [Configure logging drivers | Docker Documentation](https://docs.docker.com/config/containers/logging/configure/)

#### AWXを起動

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

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

ブラウザで、 `http://（ホストのIPアドレス）/` にアクセスすると下図の様にログイン画面が出てくるので、AWXのインストーラのInventoryで設定した `admin_user` と `admin_password` を使ってログインする。
![2020-06-27-18-38-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1343/d54ef58a-b51f-a21d-3997-a4ed0f5a0273.png)

## FAQ：アップデートどないするの？

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

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

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

* 下図の様にScheduled Jobsを指定している場合は、停止するのを忘れずに
  ![2020-06-27-18-42-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1343/6c25430b-6411-251f-e344-52b1fb40e858.png)