awxをゲーリングさんのdocker-compose.ymlで入れてみた

awx（Ansible用WebツールでAnsibleTowerのコミュニティ版らしきもの）試してみたいけどコンテナで入れると楽かしらと思ってググったらこんなの見かけたのでやってみました。（docker-composeつかうので当然のごとく全部1台のホスト上にのります。）
https://www.jeffgeerling.com/blog/2017/get-started-using-ansible-awx-open-source-tower-version-one-minute

他の方法は[公式のInstall.md](https://github.com/ansible/awx/blob/devel/INSTALL.md)に書いてあるようなのでそちらをどうぞ。

一応前提条件とか要求スペックとかも書いてあったので転記（Chromeが翻訳）。

```text
・前提条件
デプロイメントを実行するには、まずローカル環境に以下のものがインストールされている必要があります。

Ansibleはバージョンが必要です2.4+
ドッカー
docker-py Pythonモジュール
GNU Make
Git

・システム要求
AWXサービスを実行するシステムは、次の要件を満たす必要があります

少なくとも4GBのメモリ
少なくとも2つのCPUコア
少なくとも20GBのスペース
Running Docker, Openshift, or Kubernetes（どれか）
```

```
# yum install docker docker-compose
# systemctl start docker
# systemctl status docker
# systemctl is-enabled docker
# systemctl enable docker
# systemctl is-enabled docker
enabled

mkdir /home/user/awx;cd /home/user/awx

curl -O https://raw.githubusercontent.com/geerlingguy/awx-container/master/docker-compose.yml

# cp -p docker-compose.yml{,.org}
# vi docker-compose.yml
# diff docker-compose.yml{,.org}
1c1
< version: '2'
---
> version: '3'
7c7
<       POSTGRES_PASSWORD: ${DBPASS}
---
>       POSTGRES_PASSWORD: awxpass
25c25
<       - "8080:8052" 
---
>       - "80:8052" 
29c29
<       SECRET_KEY: ${SECRETKEY}
---
>       SECRET_KEY: aabbcc
31c31
<       DATABASE_PASSWORD: ${DBPASS}
---
>       DATABASE_PASSWORD: awxpass
36c36
<       RABBITMQ_PASSWORD: ${MQPASS}
---
>       RABBITMQ_PASSWORD: guest
53c53
<       SECRET_KEY: ${SECRETKEY}
---
>       SECRET_KEY: aabbcc
55c55
<       DATABASE_PASSWORD: ${DBPASS}
---
>       DATABASE_PASSWORD: awxpass
60c60
<       RABBITMQ_PASSWORD: ${MQPASS}
---
>       RABBITMQ_PASSWORD: guest

# vi .env
# cat .env
SECRETKEY=xxxxxxxx
DBPASS=xxxxxxxx
MQPASS=xxxxxxxx

# docker-compose up -d
# docker-compose ps
     Name                    Command               State                    Ports                 
--------------------------------------------------------------------------------------------------
awx_awx_task_1    /tini -- /bin/sh -c /usr/b ...   Up      8052/tcp                               
awx_awx_web_1     /tini -- /bin/sh -c /usr/b ...   Up      0.0.0.0:8080->8052/tcp                 
awx_memcached_1   docker-entrypoint.sh memcached   Up      11211/tcp                              
awx_postgres_1    docker-entrypoint.sh postgres    Up      5432/tcp                               
awx_rabbitmq_1    docker-entrypoint.sh rabbi ...   Up      25672/tcp, 4369/tcp, 5671/tcp, 5672/tcp
```
開いてるCentOS7に入れたらDocker1.12だとcomposeのyamlのversion3は使えなさそうで2にしました。
あと80だとポート競合するので変えたのとパスワード関連を.envに入れて変数にしました。

1分ではおわらなかったですが普通に上がってきました。
URLあけてしばらく待ってるとログイン画面が出てきました。
マスコットが芋~~と豆どっちなのかよくわからない~~[らしい](https://twitter.com/geerlingguy/status/906188577612021761)です。。
→[こちらの入れ方だとロゴが違ってました](https://oss.sios.com/yorozu-blog/ansible-awx)（コンテナなのは同じでIMAGEのオーナーがgeerlingguyでなくてansibleな感じ）
UIは何もしてないのにちゃんと日本語でした。JSTとかみてるんですかね。
デフォルトパスワードは上記リンク先に載ってますが変えといたほうがよさそう。

TOWERと大体一緒みたいなのでそのマニュアルを見るとよさそうですかね。
http://docs.ansible.com/ansible-tower/index.html
http://docs.ansible.com/ansible-tower/3.1.4/html_ja/quickstart/

あとGithubのawxのdocディレクトリに色々マニュアルはある模様
https://github.com/ansible/awx/tree/devel/docs

別にansibleで入れてもよかったけどぱっと見相乗りポート競合の対処がdefaults/main.ymlみただけじゃ書いてなかった。→その後以下にあるとおり見つけました。
あとtwitterの [#ansiblejp](https://twitter.com/search?f=tweets&vertical=default&q=%23ansiblejp) のタグ追ってたら、awxのpostgrresqlのデータディレクトリが/tmpだから定期的に消されて死亡みたいな話を見かけました。
→ただこれは[ここら辺](http://khmel.org/?p=1245)の[公式](https://github.com/ansible/awx/blob/devel/INSTALL.md#docker)と同様の入れ方でgit cloneしてきたあとにinstaller/inventoryファイル内のpostgres_data_dirを変えればいいだけっぽいすね。ポートもそのファイル内で変えられるみたいでした。

上記はあくまでテスト用にコンテナで入れてるのでvolumeマウントして永続化とバックアップするなりしないとコンテナのデータの場所と消したらどうなるかというのはイメージ作成者の胸先三寸の仕様などによるのでimage名調べてdockerHubで検索してReadme読んで対処ですかね。まあコンテナのデータはdockerのデータディレクトリは変えてなければ大体/var/lib/dockerのしたなので自分で消したコンテナのボリューム消したりホスト消したりしなければそこをfindしても見つかりますね。ただpsqlやpg_dump的なツール類はコンテナにつながないとホストからは使えないのでdocker execでコンテナに入ってバックアップを仕掛けて出力場所をマウントしておいた共有ストレージやブロックストレージにcopyさせるとかになるんですかね。

```
# docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                                NAMES
868b1d05ac30        geerlingguy/awx_task:latest   "/tini -- /bin/sh -c "   17 hours ago        Up 17 hours         8052/tcp                             awx_awx_task_1
979cd00c6135        geerlingguy/awx_web:latest    "/tini -- /bin/sh -c "   17 hours ago        Up 17 hours         0.0.0.0:8080->8052/tcp               awx_awx_web_1
9534927b446b        rabbitmq:3                    "docker-entrypoint.sh"   17 hours ago        Up 17 hours         4369/tcp, 5671-5672/tcp, 25672/tcp   awx_rabbitmq_1
3bf9f2db6777        postgres:9.6                  "docker-entrypoint.sh"   17 hours ago        Up 17 hours         5432/tcp                             awx_postgres_1
63747671c25d        memcached:alpine              "docker-entrypoint.sh"   17 hours ago        Up 17 hours         11211/tcp                            awx_memcached_1

## postgres:9.6のdockerHubをみてデータディレクトリをしらべる（https://hub.docker.com/_/postgres/）

# docker exec -it 3bf9f2db6777 bash
root@3bf9f2db6777:/# ls /var/lib/postgresql/data
base    pg_clog       pg_dynshmem  pg_ident.conf  pg_multixact  pg_replslot  pg_snapshots  pg_stat_tmp  pg_tblspc    PG_VERSION  postgresql.auto.conf  postmaster.opts
global  pg_commit_ts  pg_hba.conf  pg_logical     pg_notify     pg_serial    pg_stat       pg_subtrans  pg_twophase  pg_xlog     postgresql.conf       postmaster.pid
root@3bf9f2db6777:/# exit

# find /var/lib/docker -name "postgresql.conf" -print
/var/lib/docker/volumes/1aefe6c15af1f21be5426a5c843deb6bab2eb4050257bf05a1276a87ca0aa719/_data/postgresql.conf
```
マニュアル見た感じバックアップとレストアはplaybookに含まれてるスクリプト使うように書いてるけどなんかfindしてもsetup.shは見当たらなかったので他の入れ方した場合の話かな。
http://docs.ansible.com/ansible-tower/latest/html/administration/backup_restore.html
http://docs.ansible.com/ansible-tower/3.1.4/html_ja/administration/backup_restore.html
http://docs.ansible.com/ansible-tower/3.1.4/html_ja/quickinstall/install_script.html

認証は管理から認証みたかんじ色々いけそうでした。（ためしてはいない＋やるならリバプロかますなりでhttps化が必須と思われる）
http://docs.ansible.com/ansible-tower/3.1.4/html_ja/administration/ent_auth.html

続けてやることとしては、
プレイブック作ってgitに登録してそのURLをプロジェクト登録してgitサーバとの認証設定して（またはローカルに配置して）インベントリ登録してホストの認証情報設定してジョブテンプレートにプロジェクトとインベントリとホスト認証情報を紐づけてテンプレートをもとにジョブを実行、という感じのようです。
https://www.slideshare.net/ssuserf487dc/ansible-tower
http://g40244.hatenablog.com/entry/2017/12/20/082715
https://qiita.com/advent-calendar/2017/ansible

地理的にロケーションとかがばらけてなければ集約でうれしいだろうけど複数地域で遅延や負荷やシングルポイントなど気になりだした場合にChefServerのように卒業されて各地域のストレージホスティングリポジトリから個々のサーバのcloud_initがpullって入れるって話もありそうというかTowerは値段がエンプラ向けっぽいけど規模感の話はよくわからないです。

参考：
https://qiita.com/takaidohigasi/items/fb1e4c8c822893532496
https://galaxy.ansible.com/geerlingguy/awx/#readme
https://github.com/ansible/awx/issues/592
https://www.jeffgeerling.com/blog/2017/get-started-using-ansible-awx-open-source-tower-version-one-minute