■ はじめに
Red Hat Enterprise Linux 8 (以下、RHEL 8)に、Ansible Tower のアップストリームである AWX をインスールする手順をまとめます。
環境
RHEL 8.0 on AWS EC2 t2-medium (ami-0520e698dd500b1d1)
Python 3.6.8
デプロイ方法 docker-compose
AWX インストール Playbook 実行用 Ansible 2.8.5
AWX 7.0.0
公式の手順 をベースにして、要件や遭遇したエラーに応じて手順を加えています。
なお、AWX は開発スピードが早く、ここで示した手順がすぐに廃れてしまう可能性もありますのでご了承ください。また、とりあえず検証目的で構築する手順ですので、一部ワークアラウンド 的になっています。パスワードのデフォルトです。
■ 各種準備
必要パッケージのインストール
あとで AWXのリポジトリ から clone する手順があるため、予め git
をインストールします。
# dnf install git -y
python3 環境の準備
デフォルトでシステムが利用する /usr/libexec/platform-python
でははなく、別途 python3 をインストールします。これにより、python3
、/usr/local/python3
、pip
、pip3
などを利用できるようになります。
# dnf install python3 -y
AWX のインストールには Ansible が必要です。そのための venv を専用に準備して有効化します。
# python3 -m venv venv
# source venv/bin/activate
インストール Playbook が利用する Python ライブラリをインストールします。
(venv)# pip install docker-compose selinux
補足: selinux と libselinux-python のエラーについて
SELinux が有効な環境では上記のように selinux
という Python ライブラリをインストールする必要があります。インストールしない場合、AWX のインストール Playbook 実行時に、以下のような「SELinux が有効な環境では SELinux のバインディング libselinux-python
が必要」というエラーが発生してしまいます。
TASK [local_docker : Create Docker Compose Configuration] ****************************************************************************************************
failed: [localhost] (item=environment.sh) => {"ansible_loop_var": "item", "changed": false, "checksum": "bcfaf5e471bde4210390d5231356841dbfcb22b2", "item": "environment.sh", "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"}
failed: [localhost] (item=credentials.py) => {"ansible_loop_var": "item", "changed": false, "checksum": "9d8c48ec0e65f6cc2aa8d1e2720f826b0f65551a", "item": "credentials.py", "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"}
failed: [localhost] (item=docker-compose.yml) => {"ansible_loop_var": "item", "changed": false, "checksum": "dd5b8e60cee28a19cc87e3f45866ef907ecbb6c3", "item": "docker-compose.yml", "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"}
実際は、 libselinux-python
は Python 2 用であり、Python 3 用は python3-libselinux
のはずです。この環境には python3-libselinux
はインストール済みでした。にもかかわらず上記のエラーが出ていたのですが、結局は上記のようselinux
という Python ライブラリをインストールすることでエラーは解消しました。
ansible のインストール
AWX インストール Playbook を実行するための ansible をインストールします。
(venv)# pip install ansible
Docker のインストール
今回は docker-compose でデプロイするため、docker をインストールします。
# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# dnf install --nobest docker-ce -y
# systemctl start docker
# systemctl enable docker
補足
dnf install
コマンドに --nobest
を付けているのは、以下のページの「NOTE!!」にああるエラーに遭遇したためです。
https://linuxconfig.org/how-to-install-docker-in-rhel-8
もう少しスマートな解決方法はあるかも知れません。
■ AWX のインストール
リソースの準備
AWX のリポジトリ を clone して、インストーラ ーのあるディレクト リに異動します。
(venv)# git clone https://github.com/ansible/awx
(venv)# cd awx/installer/
(HTTPのみで良い場合はスキップして「インストール Playbook の実行」へ)
デフォルトのままインストールすると、http のみの接続になります。https 化したい場合は、証明書を準備した上で、awx/installer/
配下の inventory
ファイルに以下の2つの変更をします。
変更1: dockerhub_base
変数定義のコメントアウト
dockerhub_base =ansible
を、以下のようにコメントアウト します。削除でもかまいません。
現時点(2019/10/06)では、dockerhub_base
の変数定義を外さないと、いくらあとで ssl_certificate
変数で証明書を指定しても、それを利用する nginx.conf
にならない点が注意です。issue 内の以下のコメントがヒントになりました。
SSL · Issue #3751 · ansible/awx · GitHub
これにより、ビルド済みイメージは利用せず、手元でビルドする手順(Playbook内)になります(Official vs Building Images )。インストール Playbook の所要時間は長くなります。
[2019/10/19 追記]
上記のように対応をしなくても、ssl_certificate
変数が正しく反映されるようになるPRが出ていました。
Improve usage of ssl_certificate in local_docker by craph · Pull Request #5042 · ansible/awx · GitHub
変更2: ssl_certificate
で証明書(秘密鍵 含む)ファイルの指定
を、以下のように、証明書(秘密鍵 含む)ファイルのパスを指定します。ここでは例として servcer.pem
としています。
ssl_certificate =server.pem
証明書と秘密鍵 を分けて準備した場合は、予め以下のように結合しておきます。
cat 証明書ファイル.cer 秘密鍵ファイル.key > server.pem
なお、公式の手順 には、ssl_certificate
変数の以下の説明があります。
Optionally, provide the path to a file that contains a certificate and its private key.
この2つの変更によって、
ssl_certificate
変数で指定した、証明書(秘密鍵 含む)が awx_web
コンテナ内の /etc/nginx/awxweb.pem
としてマウントされる。
/etc/nginx/nginx.conf
が以下の定義になる。
server {
listen 8053 ssl;
listen 8053 ssl;
ssl_certificate /etc/nginx/awxweb.pem;
ssl_certificate_key /etc/nginx/awxweb.pem;
インストール Playbook の実行
いよいよ インストール Playbook を実行します。
(venv)# ansible-playbook -i inventory install.yml
PLAY [Build and deploy AWX] *********************************************************************************************************************************************************************
(...略....)
PLAY RECAP **************************************************************************************************************************************************************************************
localhost : ok=14 changed=6 unreachable=0 failed=0 skipped=83 rescued=0 ignored=0
■ 確認
インストール後の状態を確認します。
docker コンテナ状態の確認
5つのコンテナが起動しているか確認します。
(venv)# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e4403874de7 awx_task:7.0.0 "/tini -- /bin/sh -c…" 2 hours ago Up 12 minutes 8052/tcp awx_task
9407173599d0 awx_web:7.0.0 "/tini -- /bin/sh -c…" 2 hours ago Up 12 minutes 0.0.0.0:80->8052/tcp awx_web
f44e40be0f7c postgres:10 "docker-entrypoint.s…" 2 hours ago Up 12 minutes 5432/tcp awx_postgres
292bdc804e98 ansible/awx_rabbitmq:3.7.4 "docker-entrypoint.s…" 2 hours ago Up 12 minutes 4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 25672/tcp awx_rabbitmq
605c832db064 memcached:alpine "docker-entrypoint.s…" 2 hours ago Up 12 minutes 11211/tcp awx_memcached
HTTPS 化している場合は awx_web
の PORTS が
0.0.0.0:80->8052/tcp , 0.0.0.0:443->8053/tcp
になります。
ブラウザから確認
http://localhost
ログイン画面
デフォルトのユーザー/パスワードである、admin/password でログインします。
ログイン後直後のダッシュ ボード画面
HTTPS 化している場合は、https :// で確認します。
https://localhost
手元ビルド版のログイン画面
inventory
内の dockerhub_base
をコメントアウト し、手元でイメージをビルドする手順にしたことにより、ロゴがジャガイモになります。
■ まとめ
AWX を RHEL 8 にインストールする手順をまとめました。
大きなところでは、Ansible、docker が必要という点がポイントだと思います。
おまけ
HTTPS 化 するのに一番苦戦しました。色々調べている段階のツイートは以下。
コピペ用(HTTPのみ)
dnf install git -y
dnf install python3 -y
python3 -m venv venv
source venv/bin/activate
pip install docker-compose selinux
pip install ansible
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf install --nobest docker-ce -y
systemctl start docker
systemctl enable docker
git clone https://github.com/ansible/awx
cd awx/installer/
ansible-playbook -i inventory install.yml
他の方による HTTPS 化方法