■ はじめに
Red Hat Enterprise Linux 8 (以下、RHEL 8)に、Ansible Tower のアップストリームである AWX をインスールする手順をまとめます。
- 環境
公式の手順 をベースにして、要件や遭遇したエラーに応じて手順を加えています。
なお、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/
HTTPS 化する場合
(HTTPのみで良い場合はスキップして「インストール Playbook の実行」へ)
デフォルトのままインストールすると、http のみの接続になります。https 化したい場合は、証明書を準備した上で、awx/installer/
配下の inventory
ファイルに以下の2つの変更をします。
変更1: dockerhub_base
変数定義のコメントアウト
dockerhub_base=ansible
を、以下のようにコメントアウトします。削除でもかまいません。
# 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
で証明書(秘密鍵含む)ファイルの指定
#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 が
ブラウザから確認
デフォルトのユーザー/パスワードである、admin/password でログインします。
HTTPS 化している場合は、https:// で確認します。
inventory
内の dockerhub_base
をコメントアウトし、手元でイメージをビルドする手順にしたことにより、ロゴがジャガイモになります。
■ まとめ
AWX を RHEL 8 にインストールする手順をまとめました。 大きなところでは、Ansible、docker が必要という点がポイントだと思います。
おまけ
HTTPS 化 するのに一番苦戦しました。色々調べている段階のツイートは以下。
AWX の https 化ってどうやるのかなとおもってたけど、inventory の ssl_certificate 変数を定義しておくと、443:8053 で port変換してくれるのですね。
— よこち(yokochi) @ 10/18Ansible実践ガイド第3版 (@akira6592) October 6, 2019
https://t.co/WxT4pVYOy0
コピペ用(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