概要
ターゲットノードが多くなると時間短縮を図るために複数台のAWXによる並列実行が必要不可欠になります。しかし、AWXのクラスタ構成手順で調べても公式ドキュメントはTowerの構築手順しかない。また、AWX 18.xからは公式インストーラがKubernetes(k8s)ベースになるので、すぐにk8sへ移行できないユーザも多くいると思いますので、従来のdocker-composeのクラスタ構成手順を残したいと思います。
アーキテクチャ
Ansible Towerリファレンスの画像をそのまま拝借。
DBは一つ。あとはすべてのホストごとにawx_task、awx_redis、awx_webが集約されます。
logstashなどでログを収集している場合は、各ホストごとそれぞれにコレクターを配置する必要があります。
手順
現時点最新版Githubのawx17.1.0のinstallerを用います。
ただし、公式のインストーラはクラスタ構成に完全対応していないため、少し修正が必要になります。
公式からの差分はこちらを参照ください。
-
DB(PostgreSQL)を準備します。
下記のpg_hostname
を設定するとインストーラはDBコンテナを生成しなくなるので、個別で準備する必要があります。 -
ターゲットノードとコントロールノードに以下のものをインスコします。
- コントロールノード
- Python3(2.10.xも動作した)
- Ansible
- ターゲットノード
- Python3
- Docker
- docker-compose
- pip docker-compose, docker
- コントロールノード
-
修正版の公式インストーラの
installer/inventory
の以下の変数を環境に合わせて修正します。- towerグループのホスト名とIP(ホスト名必須)
- ansible_user・・・ホストのユーザ名
- ansible_python_interpreter・・・Pythonのバージョンに合わせて修正
- ansible_ssh_private_key_file・・・SSH鍵のファイルパス
- pg_hostname・・・PostgreSQLのホスト名またはIP
- admin_password・・・AWXの管理者の初期パスワード
-
インストーラを実行する。
awx/installer/inventory> ansible-playbook -i inventory installer.yml
-
一通りインストールが完了すれば、ログインできるようになります。
Username:inventoryのadmin_user
Password:inventoryのadmin_passowrd
-
Instance groupsで以下のようになっていることを確認します。
Instance groupの名前は必ずtowerになっています。別途作ることができるようですが、ここでは割愛します。
Instancesが作成したAWXホスト数になっていればOKです。
-
サンプルのテンプレートの同時実行(Concurrent Jobs)を有効にし、複数回「Launch」もしくは「Relaunch」ボタンを押してください。
※バグなのかわかりませんが、テンプレートの編集で同時実行に変更しても保存されず、一度テンプレートを実行後に再度編集すると反映されます。
変更点の説明
公式インストーラに修正を加えた箇所を説明します。
すべてのホスト名(awx_taskのホスト名)が異なること
installer/roles/local_docker/templates/docker-compose.yml.j2
のawx_taskのhostnameがすべて異なるように修正しました。
また、それだけではなく、installer/roles/local_docker/templates/tower_settings.py.j2(/etc/tower/settings.py)
のCLUSTER_HOST_ID
が各awx_taskのホスト名と一致するように修正しました。
SYSTEM_UUID
も重複しないように修正しました。最新のコードはSYSTEM_UUID = "{{ inventory_hostname | to_uuid }}"
になっています。
Migrate処理は1ホストのみ
インストーラの途中にあるDBの初期化処理は1つのホストのみで実行するように修正しました。
同時実行するとエラーになります。
サンプルコード
上記の手順をVSCodeのRemote Containerですべてデプロイできるようにサンプルコードを準備しましたので、必要な方は是非お使いください。
なお、Amazon Linux2のみテストしたので、それ以外の環境は必要に応じて変更してください。
実施手順はサンプルコードのReadme.mdを参照ください。
質問はTwitter、Slack(ansiblejp)、コメントでお気軽にくださいませ。