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でも言語は問いません。
#!/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) インベントリースクリプト
をクリックします。
(2) 追加
をクリックします。
(3) 必要な項目を入力して カスタムスクリプト
にスクリプトをコピペまたはドラッグ&ドロップして 保存
をクリックします。
カスタムスクリプト
は以下のものを使用しました。
#!/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) ソース
をクリックします。
(2) ソースの追加
をクリックします。
(3) 名前
を入力し ソース
を カスタムスクリプト
にして カスタムインベントリースクリプト
に登録したスクリプトを選択し 保存
をクリックします。
2-4. カスタムスクリプトの実行
(1) 登録したソースの 同期プロセスの開始
をクリックします。
問題なく完了した場合、以下のようにホストおよびvarsが登録されていることを確認できます。
2-5. ホスト別でvarsを設定する場合
その場合は _meta
を使えばホスト別で設定が可能です。
以下のスクリプトでは web01
に test
と言う変数に 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とかと連携すれば自動でホストのグループを作ったり変数設定できたりと便利そうです。
うまく使えれば、インベントリの作成自動化も効率化できますね :-)
参考