LoginSignup
1
3

More than 3 years have passed since last update.

AWX17.xをクラスタ(HA)構成にする方法

Last updated at Posted at 2021-04-17

概要

 ターゲットノードが多くなると時間短縮を図るために複数台のAWXによる並列実行が必要不可欠になります。しかし、AWXのクラスタ構成手順で調べても公式ドキュメントはTowerの構築手順しかない。また、AWX 18.xからは公式インストーラがKubernetes(k8s)ベースになるので、すぐにk8sへ移行できないユーザも多くいると思いますので、従来のdocker-composeのクラスタ構成手順を残したいと思います。

アーキテクチャ

Ansible Towerリファレンスの画像をそのまま拝借。
DBは一つ。あとはすべてのホストごとにawx_task、awx_redis、awx_webが集約されます。
logstashなどでログを収集している場合は、各ホストごとそれぞれにコレクターを配置する必要があります。
tower-clustering-visual.png

手順

現時点最新版Githubのawx17.1.0のinstallerを用います。
ただし、公式のインストーラはクラスタ構成に完全対応していないため、少し修正が必要になります。
公式からの差分はこちらを参照ください。

  1. DB(PostgreSQL)を準備します。
    下記のpg_hostnameを設定するとインストーラはDBコンテナを生成しなくなるので、個別で準備する必要があります。
  2. ターゲットノードとコントロールノードに以下のものをインスコします。
    • コントロールノード
      • Python3(2.10.xも動作した)
      • Ansible
    • ターゲットノード
      • Python3
      • Docker
      • docker-compose
      • pip docker-compose, docker
  3. 修正版の公式インストーラinstaller/inventoryの以下の変数を環境に合わせて修正します。
    • towerグループのホスト名とIP(ホスト名必須)
    • ansible_user・・・ホストのユーザ名
    • ansible_python_interpreter・・・Pythonのバージョンに合わせて修正
    • ansible_ssh_private_key_file・・・SSH鍵のファイルパス
    • pg_hostname・・・PostgreSQLのホスト名またはIP
    • admin_password・・・AWXの管理者の初期パスワード
  4. インストーラを実行する。

    awx/installer/inventory
    > ansible-playbook -i inventory installer.yml
    
  5. 一通りインストールが完了すれば、ログインできるようになります。
    Username: inventoryのadmin_user
    Password: inventoryのadmin_passowrd
    image.png

  6. Instance groupsで以下のようになっていることを確認します。
    Instance groupの名前は必ずtowerになっています。別途作ることができるようですが、ここでは割愛します。
    Instancesが作成したAWXホスト数になっていればOKです。
    image.png

  7. すべてのホストのUsed capacity 0%であることを確認します。
    image.png

  8. サンプルのテンプレートの同時実行(Concurrent Jobs)を有効にし、複数回「Launch」もしくは「Relaunch」ボタンを押してください。
    ※バグなのかわかりませんが、テンプレートの編集で同時実行に変更しても保存されず、一度テンプレートを実行後に再度編集すると反映されます。
    image.png

  9. 各インスタンスでジョブが実行されたことを確認できます。
    image.png

変更点の説明

公式インストーラに修正を加えた箇所を説明します。

すべてのホスト名(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 }}"になっています。
image.png

Migrate処理は1ホストのみ

インストーラの途中にあるDBの初期化処理は1つのホストのみで実行するように修正しました。
同時実行するとエラーになります。

image.png

サンプルコード

上記の手順をVSCodeのRemote Containerですべてデプロイできるようにサンプルコードを準備しましたので、必要な方は是非お使いください。
なお、Amazon Linux2のみテストしたので、それ以外の環境は必要に応じて変更してください。
実施手順はサンプルコードのReadme.mdを参照ください。

質問はTwitter、Slack(ansiblejp)、コメントでお気軽にくださいませ。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3