LoginSignup
6
3

More than 5 years have passed since last update.

Ansible TowerのDynamic Inventoryを触ってみた

Last updated at Posted at 2018-05-29

Ansible TowerでDynamic Inventoryを使ってインベントリーを作成した備忘録です。

1. Dynamic Inventoryについて

AnsibleのInventoryを動的に作成することができます。
詳細についてはGoogle先生に聞くと色々と情報が出てくるので、ここでは割愛します。

1-1. 公式 Ansible Dynamic Inventory

http://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html

2. Dynamic Inventory動作確認

2-1. スクリプト

Dynamic Inventoryは、スクリプトを実行して情報を取得します。
ここでは動作確認用スクリプト(python)ととして以下のテンプレートを使用します。
※Dynamic Inventoryでは --list 引数さえ受け取ってJSONフォーマットで結果を出力できればいいのでシェルスクリプトでもPerlでも言語は問いません。

dynamic_inventory.py
#!/usr/bin/python
from collections import defaultdict
import argparse
import json

def options():
    parser = argparse.ArgumentParser()
    parser.add_argument("--list", action="store_true")
    args = parser.parse_args()
    return args

def main():
    args = options()
    if(args.list):
        multi_dimension_dict = lambda: defaultdict(multi_dimension_dict)

        # インベントリー情報の処理を書いていく

if __name__ == "__main__":
    main()

2-2. Dynamic Inventoryスクリプト登録

Ansible TowerにDynamic Inventory用のスクリプトを登録する必要があります。

(1) インベントリースクリプト をクリックします。

スクリーンショット 2018-05-29 23.45.11.png

(2) 追加 をクリックします。

スクリーンショット 2018-05-29 23.46.05.png

(3) 必要な項目を入力して カスタムスクリプト にスクリプトをコピペまたはドラッグ&ドロップして 保存 をクリックします。

スクリーンショット 2018-05-29 23.47.02.png

カスタムスクリプト は以下のものを使用しました。

#!/usr/bin/python
from collections import defaultdict
import argparse
import json

def options():
    parser = argparse.ArgumentParser()
    parser.add_argument("--list", action="store_true")
    args = parser.parse_args()
    return args

def main():
    args = options()
    if(args.list):
        multi_dimension_dict = lambda: defaultdict(multi_dimension_dict)

        inventory = multi_dimension_dict()
        inventory["group01"]["hosts"] = ["web01", "web02"]
        inventory["group01"]["vars"] = {"ansible_user": "root", "ansible_password": "secret"}
        print(json.dumps(inventory, indent=2))

if __name__ == "__main__":
    main()

スクリプト単体で実行すると以下のJSON形式になります。

{
  "group01": {
    "hosts": [
      "web01",
      "web02"
    ],
    "vars": {
      "ansible_password": "secret",
      "ansible_user": "root"
    }
  }
}
項目 説明
group01 グループ名です。
hosts 対象のホストをlistで登録します
vars group01 のhostsに対してのvarsです

2-3. インベントリー

インベントリーを作成し ソース(カスタムスクリプト) を登録します。
ここでは既に作成した TEST Inventory に登録してみます。

(1) ソース をクリックします。

スクリーンショット 2018-05-29 23.55.04.png

(2) ソースの追加 をクリックします。

スクリーンショット 2018-05-29 23.55.32.png

(3) 名前 を入力し ソースカスタムスクリプト にして カスタムインベントリースクリプト に登録したスクリプトを選択し 保存 をクリックします。

スクリーンショット 2018-05-29 23.56.32.png

2-4. カスタムスクリプトの実行

(1) 登録したソースの 同期プロセスの開始 をクリックします。

スクリーンショット 2018-05-29 23.59.01.png

問題なく完了した場合、以下のようにホストおよびvarsが登録されていることを確認できます。

スクリーンショット 2018-05-30 0.02.32.png

スクリーンショット 2018-05-30 0.02.38.png

2-5. ホスト別でvarsを設定する場合

その場合は _meta を使えばホスト別で設定が可能です。
以下のスクリプトでは web01test と言う変数に var という値を設定しています。

スクリプト例

#!/usr/bin/python
from collections import defaultdict
import argparse
import json

def options():
    parser = argparse.ArgumentParser()
    parser.add_argument("--list", action="store_true")
    args = parser.parse_args()
    return args

def main():
    args = options()
    if(args.list):
        multi_dimension_dict = lambda: defaultdict(multi_dimension_dict)

        inventory = multi_dimension_dict()
        inventory["group01"]["hosts"] = ["web01", "web02"]
        inventory["group01"]["vars"] = {"ansible_user": "root", "ansible_password": "secret"}

        inventory["_meta"]["hostvars"] = {"web01": {"test": "var"}}
        print(json.dumps(inventory, indent=2))

if __name__ == "__main__":
    main()

3. 最後に

Dynamic Inventoryを使うことで動的にインベントリーの作成ができることが確認できました。
オンプレとかの場合だと、CMDBとかと連携すれば自動でホストのグループを作ったり変数設定できたりと便利そうです。
うまく使えれば、インベントリの作成自動化も効率化できますね :-)

参考

6
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
6
3