てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] AWX を RHEL 8 にインストールする(HTTPS化もあり)

■ はじめに

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/python3pippip3 などを利用できるようになります。

# 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-pythonPython 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_webPORTS

0.0.0.0:80->8052/tcp, 0.0.0.0:443->8053/tcp になります。

ブラウザから確認

http://localhost

f:id:akira6592:20191006162709p:plain
ログイン画面
デフォルトのユーザー/パスワードである、admin/password でログインします。

f:id:akira6592:20191006162742p:plain
ログイン後直後のダッシュボード画面

HTTPS 化している場合は、https:// で確認します。

https://localhost

f:id:akira6592:20191006164206p:plain
手元ビルド版のログイン画面

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 化方法