Dynamic Inventory

  • 投稿者:
  • 投稿カテゴリー:ansible

Dynamic Inventoryを一部意訳してみた。
たぶん誤訳もある。そして意味がわかりにくいところもある。

Topics

クラウドやLDAPやCobberなど違ったプラットフォーム上のシステムについて、
inventoryファイルを管理することが可能である。

Ansible TowerではDBにWEBやRESTからアクセスできるinventry情報を保持する。
またすべてのホスト情報もDBに持つことで、playbook履歴を追うことが可能。

Example: The Cobbler External Inventory Script

多くのハードウェアを管理しているAnsibleユーザがCobberを利用していると推測される。
(元Ansible, Incで働いていたMichael DeHaanが作成している)

…中略…

Example: AWS EC2 External Inventory Script

AWSを利用している場合、ホストの増減が発生するためinventoryファイルの管理は難しいため、
EC2 external inventory scriptを利用したほうがよい。

このスクリプトを利用するためには2つの方法がある。
1つめは-iオプションを利用してansibleコマンドを実行することである。

ansible -i ec2.py -u ubuntu us-east-1d -m ping

2つめはスクリプトを/etc/ansible/hostsにコピーし、chmod +xを実行する。
また ec2.iniを/etc/ansible/ec2.iniにコピーする。
そしていつも通りにansibleを実行すること。

AWSへのAPI呼び出しを正常に行うには、Boto(PythonインターフェイスをAWSに設定する)を設定すること。
利用可能なさまざまな方法がありますが、最も簡単なのは、2つの環境変数をエクスポートすることだけです。

export AWS_ACCESS_KEY_ID='AK123'
export AWS_SECRET_ACCESS_KEY='abc123'

スクリプトを実行して、正しく動作するか確認可能

cd contrib/inventory
./ec2.py --list

しばらくすると、すべてのリージョンのEC2 inventoryが表示される。
Botoプロファイルを利用して、複数AWSアカウントを管理する場合–profile PROFILEというオプションをec2.pyに渡す。
プロファイル例は以下となる。

[profile dev]
aws_access_key_id = <dev access key>
aws_secret_access_key = <dev secret key>

[profile prod]
aws_access_key_id = <prod access key>
aws_secret_access_key = <prod secret key>

ec2.py –profile prod を実行することで、prodアカウントのinventoryを取得できる。
(ただしansible-playbookではサポートされていない)
AWS_PROFILE=prod ansible-playbook -i ec2.py myplaybook.ymlといった形でansible-playbookを利用できる。
ec2.iniを編集することで使用していないリージョンを除くことなどが可能。

キャッシュコントロールや宛先変数をec2.iniで設定することも可能。
デフォルトではAWSのすべてのサービス用に設定されているが、コメントアウトすることで制御可能。
例えばRDSやelasticacheを利用しないのであれば、Falseを設定する。

[ec2]
...

# To exclude RDS instances from the inventory, uncomment and set to False.
rds = False

# To exclude ElastiCache instances from the inventory, uncomment and set to False.
elasticache = False

inventoryファイルは名前と宛先アドレスを結びつけるだけです。
デフォルトで設定としてEC2外からansibleを実施するようになっていますが、これは最も効率的な方法ではありません。

EC2内でansibleを実行している場合、内部DNSとIPの利用は外部DNS名を使うよりも理にかなっています。
この場合ec2.iniのdestination_variableを内部DNSとして編集できます。
VPCを利用している時に特に有用です。

EC2 external inventoryは複数のグループへのマッピングが可能です。
(Global,Instance ID,Region,Availability Zone,Security Group,Tagsなど)

–host=HOST オプションを利用して特定EC2で利用できる変数を取得できる。
(ec2_architecture,ec2_description,…,ec2_vpc_id)

インスタンスで利用できる変数取得方法

cd contrib/inventory
./ec2.py --host ec2-12-12-12-12.compute-1.amazonaws.com

AWS inventory script はキャッシュしてAPIを呼び出さないようにするため
ec2.iniにキャッシュしないように設定するか、以下コマンドを実施すること。

./ec2.py --refresh-cache

Example: OpenStack External Inventory Script

OpenStackベースのクラウドを利用している場合は動的インベントリを利用して(openstack.py)、
OpenStackから直接データを取得できる。
OpenStack inventory script は以下からダウンロード可能。
https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/openstack.py

ansibleコマンドで-i openstack.py と明示的に指定するか、/etc/ansible/hosts へスクリプトを置くことで利用可能。

…中略…

Other inventory scripts

CobblerやEC2だけでなく、以下についてもinventory scriptを利用可能。

BSD Jails
DigitalOcean
Google Compute Engine
Linode
OpenShift
OpenStack Nova
Ovirt
SpaceWalk
Vagrant (not to be confused with the provisioner in vagrant, which is preferred)
Zabbix

使い方の詳細は今後追加されるかもしれない。現状 contrib/inventory ディレクトリがわかりやすい。
基本的にAWSのスクリプトと同じ。