Ansible AWX を素振りしたメモ

Ansible AWX を素振りしたメモ。WebUI から Ansible を実行して実行結果を記録・閲覧したり、役割ベースでアクセスコントロールしたり、スケジュールで自動で Ansible を実行したり、メールや Slack などで通知したり、などなど、いろいろできます。

Ansible AWX はエンタープライブ向けの Ansible Tower に対する、無償のアップストリーム版という位置付けです。

AWX と Red Hat Ansible Tower の比較

インストール

下記を参考に適当な CentOS 7 のホストの Docker 環境にセットアップします。

https://github.com/ansible/awx/blob/devel/INSTALL.md

インストーラーとして Ansible を使うので Ansible を入れます。

yum install -y epel-release
yum install -y ansible

AWX のソースをダウンロードして展開します(欲しいのは installer/ などのごく一部なんですけどね)。

wget https://github.com/ansible/awx/archive/9.1.0.tar.gz
tar xvzf 9.1.0.tar.gz
cd awx-9.1.0/installer/

プロジェクトのディレクトリを -e project_data_dir=/var/lib/awx/projects のように指定しつつプレイブックを実行します(インベントリファイルを書き換えても OK です)。 このディレクトリに Git などの SCM からチェックアウトしたソースが保存されます。未指定だと AWX のコンテナのローカルに保存されるため、コンテナを再起動すると消えてしまします。 AWX の管理データは PostgreSQL に保存されており、チェックアウトしたソースが消えたとしても再チェックアウトすれば良いだけではありますが。なのでデフォでは未指定になっているのでしょうか。

ansible-playbook -i inventory install.yml -e project_data_dir=/var/lib/awx/projects

プレイブックを実行すると次のようなエラーでコケました。

# TASK [local_docker : Start the containers]
fatal: [localhost]: FAILED! => changed=false
  msg: 'Failed to import the required Python library (Docker SDK for Python: docker (Python >= 2.7) or docker-py (Python 2.6)) on ore-no-awx-server''s Python /bin/python. Please read module documentation and install in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter, for example via `pip install docker` or `pip install docker-py` (Python 2.6). The error was: No module named requests.exceptions'

Python 2.7 以上なら docker モジュールが、2.6 なら docker-py が必要とのことです。ホストは CentOS 7 だったので Python 2.7 なのですが、docker-py なら yum でさくっと入りそうでしたが docker の方は pip を使う必要がありそうでした。

見た感じ、単に ~/.awx/awxcompose/ の中で docker-compose でサービスを開始しようとしているだけだったので、次のように手動で開始させました。

cd ~/.awx/awxcompose/
docker-compose up -d

ホストの 80 ポート HTTP で開くとログイン画面になります。admin / password でログインできます。

ジョブを実行してみる

下記を参考に「組織」「認証情報」「プロジェクト」「インベントリ」「ジョブテンプレート」を作成し、Ansible のジョブが実行できることを確認しました。

https://dev.classmethod.jp/server-side/ansible/ansible-awx_rk-20180225/

次のように AWX の画面上で実行結果などが閲覧できます。

f:id:ngyuki:20200125154953p:plain

以下は補足的なメモ。

「組織」が「プロジェクト」を作成する前に必要でした。プロジェクトは組織の中に作る必要があるのですが、AWX をセットアップ直後は組織が空だったので適当なものを作りました。

「プロジェクト」で指定する Git リポジトリを SSH でチェックアウトするために「認証情報」を登録しました。まず、手元で SSH 秘密鍵を作成し、Gitlab リポジトリのデプロイキーに公開鍵を登録します。秘密鍵は AWX の「認証情報」に登録します。認証タイプは「ソースコントロール」です。ユーザー名は指定せず SSH 秘密鍵のみ入力します。

「インベントリー」はホストを手入力で作成するのではなく、プロジェクトの Git リポジトリの中のインベントリファイルを指定しました。 インベントリで「ソース」を選択、ソースの種類に「ソース:プロジェクト」をします。 なぜか「インベントリーファイル」のドロップダウンの中身が空だったため、手打ちする必要がありました。

インベントリファイルには次のように ansible_connection: local なものを用意しました。認証情報を用意するのがめんどくさかったためです。普通に SSH するならそれ用の SSH 秘密鍵も認証情報に認証タイプ「マシン」で登録する必要があります。

all:
  hosts:
    localhost:
      ansible_connection: local

さいごに

Ansible の実行環境が開発者のローカルだと微妙な環境の差が問題になることがあります。Gitlab CI のパイプラインで実行することでその問題を避けることはできますが、Gitlab CI でやるなら Ansible AWX でやっても良いかもしれません。もしくは Gitlab CI のパイプラインから REST API で Ansible AWX を叩く構成でもありかも。

ただ、プロジェクト・インベントリ・テンプレートなどの設定が基本的に UI からポチポチなのが煩雑に感じます。API でも登録できるだろうとは思いますが。

ソースリポジトリだけ設定すればソースのルートの特定ファイル(.ansible-awx.yml とか)から自動的にインベントリやジョブテンプレート・ワークフローテンプレートなどの情報を拾ってきて、ジョブの実行や結果の閲覧のみ UI からポチる、ぐらいのほうが扱いやすいように感じます。

また、そもそものことろ Ansible での構成管理は(アプリのデプロイと比べて)そこまで頻繁には変更しないので、そのために Ansible AWX を設けるのもちょっと無駄な気もしないでもないです。ただアプリのデプロイをいま Ansible でやっているので、それを Ansible AWX でやるように置き換えるのはありかも。