構成管理ツール (いわゆる Infrastructure as Code(IaC)) の中でも比較的易しいと言われる Ansible。
その Ansible の運用を省力化してくれるツールとして Ansible Tower というものがあり、そのコミュニティ管理版 (OSS版) が AWX だ。
その AWX がインストールされたサーバを作成する Playbook を作ろうとしたら意外と手間取ったので、そのメモ。
なお、インストール先は CentOS 7 である。
AWX のインストールは、 公式ビルド済み docker イメージを Docker Compose を使ってコンテナ化する方法 を使った。
11/21: 追記
docker-compose の PyPI (pip) パッケージが 1.25.0 に更新後、 CentOS 7 (正確には、 Python 2 系を使っている環境) で docker-compose のインストールや実行がうまくいかなくなった。
(commit:719a1b0 で) subprocess32 に依存するようになり、 gcc 等のビルド環境のインストールが別途必要になったためだ。
それに加え、たとえ gcc をインストールしても、依存パッケージの python2 対応が不十分なようで、 docker-compose 実行時にエラーになってしまう。
docker/compose#7030 の Issue には挙がっているが、修正されるかどうか不明なため、一つ前の 1.24.1 を使うことで回避するように、コードを修正した。
python2 ツラい。。。
しかし、 2020年にサポート切れになった後も、 CentOS 7 が生きているしばらくの間はこの辛みと付き合わなければならないようだ。
ツラい。。。
追記ここまで
最終的な Playbook
まず、最終的に作成した playbook を掲載する。
解説
一番大きなポイントは、 Python の Virtualenv を作成し、そこに pip 版 docker-compose を入れて動かしていることだ。
docker-compose Python 依存パッケージの競合
AWX を docker-compose でインストールするには、 docker-compose Python モジュールのインストールが必要だ。
しかし、 OS のパッケージマネージャ (yum) でインストールしているモジュールと、 上記 docker-compose Python module で、一部の依存パッケージが競合していたりすると、 pip で global な環境に docker-compose pip モジュールをインストールしようとした時に、
"Cannot uninstall 'requests'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall."
などというようなエラーが発生してしまうことがある。
このため、 Virtualenv 環境を作成して、そこに docker-compose をインストールする形としている。
yum でインストールしたモジュールへの依存
一方、 逆に パッケージマネージャ (yum) でインストールしているモジュールそのものに依存している場合、 単に Virtualenv を作成しただけだと、モジュール不足で動かなくなることがある。
このため、 Ansible の pip モジュール を使うときは、 virtualenv_site_packages: yes
を設定している。
"source {{ venv_dir+'/bin/activate' | quote }}; ansible-playbook -i inventory install.yml {{ install_awx_playbook_opotions }}"
最後に playbook 内で AWX のインストール playbook を実行する際は、上記のように Virtualenv を activate した状態で実行している。
docker グループへの追加
ssh でログインしたユーザが docker コンテナの操作を行えるようにするため、 一時的に docker グループへ追加している。
グループを変更しても、 ホストマシンにログインし直さないと、設定が反映されず docker を操作することができない。
本来であれば、 Ansible の meta モジュールの reset_connection のアクションで ssh でのサインインが自動的にやり直されるはずなのだが、何故かうまく動かない。
このため、 ホストPC の sshd デーモンを非同期で Kill させることで、強制的に ssh の再接続を行っている。
プロキシの解決
プロキシの設定は、以下の両方が必要だ。
- docker イメージをダウンロードするための、コンテナホストへの設定
- docker コンテナ内への設定
playbook 実行時のオプションとして ansible-playbook -i 'username@hostname,' -e http_proxy=http://proxy.example.com -e http_proxy=http://proxy.example.com install_awx.yml
のように設定できるほか、
その設定を省略した場合でも、 コンテナホストマシンの http_proxy 環境変数などが設定されていれば、それを使うようにしている。
参考
- AWXをインストールしてCatalystにPlaybookを実行してみる - Qiita
- 最初はこちらページに書かれたコードで実行しようとしたが、 現在の AWX の最新版 (6.x, 7.x) ではインストールできなかった。
更新履歴
- 2019-10-23: 初版
- 2019-11-22: CentOS 7 と
docker-compose==1.25.0
の組み合わせで発生する不具合を回避。 AWX のバージョンを 9.0.1 に更新。