Static Inventory の内容を Dynamic Inventory に変換する必要あるの?
そもそもなんでこんなことをしようかと思ったかというと、
- サービスのリリース後に、ホスト(VM)がダウンしたりアップしたり、フェイルオーバーしてサーバと役割の対応が変化したのを検知してインベントリを書き換える手間をなくす。
- サービスリリース時のインベントリはそのまま残しておきたい
- サービスリリース後は静的インベントリを一回参照して、実際に稼働しているホスト情報で上書きして動的インベントリを生成できれば
安心して ansible を動かすことができる環境が手に入る - Inventory の内容を Dynamic Inventory に変換できれば、リリース前/後の区別がなくなって便利になる
実際に稼働しているホスト情報で上書きする
- ここは個人的のやり方だが、インベントリに書いたグループ/ホスト情報と Consul に登録しているサービス情報を同期させているため、
静的インベントリからグループ名を取り出し、そのグループについて Consul にどのホストを使用しているかを問い合わせれば
現在の稼働状況が取得できる。これを動的インベントリ形式で出力すればよい。
参考リファレンス
Developing Dynamic Inventory Sources
Python API
インベントリを読み込むコードが書いてあったので参考になった
静的インベントリをロードするコード
from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory
def _load_ansible_staitc_inventory(filename):
inventory = Inventory(
loader = DataLoader(),
variable_manager = VariableManager(),
host_list = filename
)
return inventory
実はこんだけだった
これさえ解ればあとは、Dynamic Inventory 形式に整形して出力するだけ。(なので省略)
で、Consul の情報で上書きした動的インベントリ生成するコードがこれ
python-ansible-dynamic-inventory
興味ありましたら参考にしてみてください。
※バグ報告、プルリク大歓迎です。