Ansible Towerで追加したAnsibleモジュールを動かす方法


Ansible Towerとは

AnsibleをWeb GUIで実行できるRed Hatの製品です。
動作部分では同じくAnsible Enginが動いていますが、サーバーの中に入ってAnsibleを動かすのとは少し勝手が違いました。
Ansibleをインストールすると使える標準モジュールではなく、追加で入れたモジュールを動かす為にどうしたら・・・となったのでメモ。
環境は以下です。

  • RHEL: 7.7
  • Ansible Tower: 3.5.3
  • Ansible version: 2.8.2
  • Python: 2.7.5 & 3.6.8

Ansible モジュールの追加について

標準のAnsibleでモジュールを追加するお作法については公式の手順ですんなりいきます。
今回ハマったのは、サーバーの中に入ってAnsibleを実行すると上手くいくけど、Towerからじゃうまくいかない。。
他のエラーも併発したのではげそうでした。

Ansible TowerでのPlaybook実行にPython3を使用する時の落とし穴

モジュールの追加には関係ありませんが、私が追加したモジュールでは使用するPythonが2ではなく3系ではないといけなくて、"ansible_python_interpreter"でRHEL7に追加インストールしたPython3を使うように指定していました。
普通のAnsibleでは正常にpython3で実行できていたのですが、Towerで動かすとこんなエラーが。。。

AttributeError: module 'enum' has no attribute 'IntFlag'

結論、私の環境では以下のenum34が悪さしていましたのでバルスすることでfixしました。
※サーバーローカルのpipではなく、Ansible Towerのvenvで入ってきたpipのenum34です

# /var/lib/awx/venv/ansible/bin/pip uninstall enum34

Tower上に追加したモジュールの環境変数を追加

ようやく本題ですが、上のenumバグをfixすると、次はこのエラーです。

<module>ImportError: cannot import name 'ModuleName'

ここで初めて、あ、読み込めてないんだと察した結果、Ansible Towerの設定に環境変数を追加する箇所があり、"ANSIBLE_LIBRARY"の設定をJSONにして登録する事でめでたく正常に実行する事ができました。

{
 "ANSIBLE_LIBRARY": "/usr/share/ansible/plugins/modules/<added module name>",
 "ANSIBLE_MODULE_UTILS": "/usr/share/ansible/plugins/modules/<added module name>/module_utils/"
}

設定する場所は、Ansible Towerの設定>ジョブ>追加の環境変数です。