Ansible meetuptokyo 2015 Dynamic Inventory

14
Dynamic Inventoryを使ってみよう! Ansible Meetup in Tokyo 2015.09

Transcript of Ansible meetuptokyo 2015 Dynamic Inventory

Dynamic Inventoryを使ってみよう!Ansible Meetup in Tokyo 2015.09

自己紹介• 氏名: さいとう ひでき (Twitter: @saito_hideki)

• 株式会社インターネットイニシアティブ

• 日本OpenStackユーザ会

• 著書 OpenStackクラウドインテグレーション ISBN: 9784798141251

Ansibleの良い所長所は沢山あるけれど、必ず挙げられるものの1つに「エージェントが不要」という特性があります。

• 操作対象ノードを選ばない

• 最低限、SSHでの接続性だけ確保できればOK

• 操作対象ノードはInventory FileにIPかホスト名を記述するだけ

しかし、これが災いすることも…

Ansibleが、エージェントレスであるがゆえに抱えてしまう課題

ノードリスト(Inventory File)のメンテナンス

ちょっとした災い

クラウドでは 頻出な状況

頻繁な書き換え

対象ノードが 作られる

対象ノードが 突然消える

たとえばこんな環境

クラウド環境では ノードの作成・削除が簡単 便利だけど管理面では…

[解決策] Dynamic Inventoryで 実行時に自動生成!

Dynamic InventoryDynamic Inventoryってなに?

• Ansibleが利用するInventory情報を生成する実行可能プログラム

• 通常のInventory Fileの代わりに、-iオプションでansible,ansible-playbookコマンド実行時に指定

• Inventory Fileを /etc/hostsファイルに例えると、DNSやNISのクライアントライブラリのようなもの

乱暴に言うと、インベントリ情報の管理を 他の誰かに丸投げする仕組み

ノードリストの管理はクラウドコントローラにお任せ

仕組みは単純

VM VM VM

Controller

Dynamic Inventory

(1) exec

(2) GET VM LIST/VM DETAIL(host毎)

(3) VM LIST/VM DETAIL(host毎)(4) Inventory

(5) Operation

利用方法• Dynamic Inventoryは実行可能プログラム

➡ 他の誰か(クラウドコントローラ)に問い合わせてインベントリ情報生成し、JSON形式で標準出力します

➡ --list と --host <nodename or IP> オプションを持つ

• ansibleコマンド実行時に-iオプションで指定 ➡ 生成したインベントリ情報を元に操作対象ホストに接

続します

注意点Dynamic Inventoryプログラムは、うまく書かないとクラウドなどのAPIサービスに高負荷をかけます。

• 過剰なAPIコールによるレートリミット到達 以下のような流れで実行されることから、作りによっては過剰なAPIコールを発生させることになる。 (1) --list で対象ホストを絞り込む (2) ホスト毎に --host オプション付きで再実行され、個々のホストのインベ

ントリ情報を生成する

クラウドAPIの性質として、(1)実行時には、メンバーホスト固有の情報もあわせて取得することになる場合が多いため、この固有の情報を_meta:hostvars{}にホスト毎のエントリを作って格納し、--listの実行結果に含めて返すと(2)の実行を回避できます。

$ ./bar.py --list | jq . { "others": { "hosts": [ "10.0.0.7" ] }, "db": { "hosts": [ "10.0.0.26", "10.0.0.25" ] }, "app": { "hosts": [ "10.0.0.24", "10.0.0.23", "10.0.0.22" ] }, "web": { "hosts": [ "10.0.0.20", "10.0.0.21", "10.0.0.19" ] }, "_meta": { "hostvars": { “10.0.0.25”:{key: value, … } “10.0.0.25”:{key: value, … } } }, }

_meta$ ./inventory.py —list | jq . { "others": { "hosts": [ "10.0.0.7" ] }, "db": { "hosts": [ "10.0.0.26", "10.0.0.25" ] }, "app": { "hosts": [ "10.0.0.24", "10.0.0.23", "10.0.0.22" ] }, "web": { "hosts": [ "10.0.0.20", "10.0.0.21", "10.0.0.19" ] } }

_metaなし _metaあり

Dynamic Inventory でクラウドにも対応! _metaも忘れずにな!

公式参考資料★ Dynamic Inventory

• http://docs.ansible.com/ansible/intro_dynamic_inventory.html

★ Developing Dynamic Inventory Sources • http://docs.ansible.com/ansible/developing_inventory.html

★ サンプルコード • https://github.com/ansible/ansible/tree/devel/contrib/inventory

ご静聴ありがとうございましたAnsible Meetup in Tokyo 2015.09