出力を入力へ

プログラミングに関する基本的な事を中心にまとめます

ansibleでansible-tower-cliモジュールを利用する

Ansible TowerCLIで制御するためのansible-tower-cli、 これをansibleで制御するansible-tower-cliモジュールの利用に苦労したのでそのまとめ。

ちなみに、動作検証に利用しているのはAnsible Towerではなく、そのOSS版のAWX。 動作環境は以下の通り

  • OS: Ubuntu 18.04
  • ansible: 2.7.10
  • tower-cli: 3.3.3

ansibleとansible-tower-cliの関係

当初の自分のイメージでは、 ansibleがtower-cliのライブラリを利用しつつtower-cliを意識することなく ansible towerを制御できるものだと思っていた。

ansibleのインベントリではansible towerを指定して動作する、 つまりは以下のようなイメージ。

f:id:thaim:20190412003936p:plain
誤解していたansible-tower-cliモジュールの動作

ところはこれは誤りで、当初ansibleを実行しても以下のようなエラーが表示されるだけで、 どうしてもansible-tower-cliモジュールが利用できていないことから悩んでいた。

FAILED! => {"changed": false, "msg": "ansible-tower-cli required for this module"}

ansibleのansible-tower-cliモジュールは単に tower-cliを実行する機能しか持たない。 ansible-tower-cliはansibleの実行ホストではなく、 接続先ホストにインストールしておく必要がある。 つまりは以下のようなイメージ。

f:id:thaim:20190412004222p:plain
実際のansible-tower-cliモジュールの動作

実際にはあえてansibleとansible-tower-cliの実行元を分ける必要はないので、 ansibleはローカルホスト接続して実行するとよさそう。 つまりは以下のようなイメージ。

f:id:thaim:20190412004758p:plain
ansible-tower-cliを用いた実際の構成

ansible-tower-cliのインストール方法

ansibleとansible-tower-cliの関係を確認している中で、 ansible-tower-cliのインストール方法も影響することがわかった。

ansible-tower-cliをグローバルインストールしている場合 (pip install --system ansible-tower-cli など)、 これは問題は発生しないが、 ローカルインストールした場合 (pip install --user ansible-tower-cli など)、 ansibleがansible-tower-cliモジュールを参照できない可能性がある。

ローカルインストールした場合にansibleからtower-cliが呼び出せるのは 両方とも同一バージョンのpythonインタプリタにインストールされた場合のみ。 つまりansibleもansible-tower-cliもpip install --userまたは、 pip3 install --userでインスートールした場合のみ動作する。

ansibleはapt installでインストールした場合や、ansibleはpip3でansible-tower-cliはpip、 またはansibleはpipでansible-tower-cliはpip3でインストールした場合は動作しない。

ansible-tower-cliはpipでしかリリースされていないので ansibleをapt installした場合はansible-tower-cliもpip install --systemでインストールする、 どうしてもuser installしたい場合はansibleと同じタイミングで同じ方法で インストールするように注意した方がよさそう。

tower-cliSSL検証

Ansible TowerをHTTPでホストする場合や自己署名のHTTPSでホストする場合は ansible-tower-cliからの接続でverify_sslオプションをfalseとする必要がある。

ansibleでansible-tower-cliモジュールを利用する場合は、 自動的に ~/.tower_cli.cfgが参照されるが、このverify_sslオプションのみ読み込まれず デフォルトのTrueが反映される。 一方で、ansible-tower-cliモジュールで明示的に設定ファイルを指定するとき (tower_config_fileでファイルを指定するとき)は設定ファイルで指定したverify_sslオプションが反映される。

個人的にはこの動作は非常に気持ち悪いが、 そもそもansibleの接続先のtower_config_fileを 明示的または暗黙的に参照するのはよくなさそう。

tower_config_fileは参照せず、ansible-tower-cliモジュールで 面倒でも明示的にホスト名やユーザ名などのオプションを指定した方がよさそう。