Ansible Meetup in Tokyo 2014.09でのLT発表資料です。 http://ansible-users.connpass.com/event/7942/
Dynamic Inventoryと参照変数Ansible Meetup Tokyo 2014.09@bungoume
View Slide
内容• 話すこと• Dynamic Inventory(EC2)について• 環境ごとに変数を使い分けるプラクティス• 話さないこと• Ansible変数展開の順序
Dynamic Inventoryとは• Hostsをスクリプトで動的生成• EC2やGCE, Zabbixなどの外部リソースからHostsを生成できる• プラグインとして用意• https://github.com/ansible/ansible/tree/devel/plugins/inventory• EC2.pyの場合• タグやセキュリティグループ、リージョンなどを元にホストグループを管理• ec2.iniで対象リージョンを制限したり、フィルタをかけたりできる• hostsとして利用できる• hosts/ec2ec2.ini• ansible-playbook –i hosts webservers.yml
EC2のAnsible管理用タグ付け例• タグを用いて管理• タグの例• hostname: dbserver01a• env: production, dev• role: webserver, dbserver• number: 01, 02, …• group: a, b, ….• ec2モジュールでインスタンス起動時にタグ付け or 手動でタグ付け• タグを指定してplaybook実行• 例:ゾーンBにあるdev環境のwebserverにplaybookを実行• ansible-playbook –i hosts webservers.yml --limit tag_env_dev:&ap-northeast-1b
こういうことがしたい• 環境とホストグループによって変数の値を切り替えたい• 例:monitoring roleのlog_server変数(送り先)• production の webserver は 10.0.1.100• production の dbserver は 10.0.1.101• dev の webserver は 10.0.2.100• dev の dbserver は 10.0.2.101• limitのand実行では難しい(playbook内で条件分岐が必要になる)10.0.1.10010.0.1.10110.0.2.10010.0.2.101
思いついた方法(2つ)• 方法1: inventory varsを使う• 方法2: vars_filesを使い、うまいこと読み込む
• hostsディレクトリに変数ファイルを置くhosts/dev/ec2 (ec2.py)ec2.ini (instance_filters = tag:env=dev)group_vars/webserver (変数yaml)production/….group_vars/webserver (変数yaml)webservers.yml (playbook)• cat hosts/dev/group_vars/webserver---log_server: 10.0.2.100方法1: inventory varsを使う
- hosts: tag_role_webserveruser: ec2-usertasks:- debug: var=log_server方法1: inventory varsを使う• Playbook ( webservers.yml )• 実行• ansible-playbook –i hosts/dev webservers.yml• group_vars/webserverを読み込み、hosts/production/group_vars/webserverで上書きする~~~TASK: [debug var=log_server]********************************************************ok: [10.0.2.1] => {“log_server": "10.0.2.100"}
hosts/ec2, ec2.inivars/nothing.ymltag_role_webserver.ymltag_env_dev/tag_role_webserver.ymlwebservers.yml (playbook)方法2: vars_filesを使う• 以下の様なディレクトリ構成• エラー回避用にnothing.ymlという空ファイルを用意しておく
方法2: vars_filesを使う• Playbook(webservers.yml)に以下を記述• 実行• ansible-playbook –i hosts webservers.yml --limit tag_env_dev• まずtag_role_webserver.ymlがあれば読込み、tag_env_dev/tag_role_webserver.ymlがあれば上書きする- hosts: tag_role_webserveruser: ec2-uservars_files:- [“vars/{{ ec2_tag_role }}.yml”, vars/nothing.yml]- [“vars/{{ ec2_tag_env }}/{{ ec2_tag_role }}.yml”, vars/nothing.yml]tasks:- debug: var=log_server
まとめ• 方法1( inventory vars )• playbookの書き換えが不要• limitを忘れて全体実行するリスクがない• Inventoryファイルと組み合わせても使いやすい• 方法2( vars_files )• 多段に利用可能• {{ ec2_tag_env }}/{{ ec2_tag_role }}/{{ ec2_tag_group }}.yml• 読込優先度が自由に変更できる• まずは方法1、変数が増え、複雑な場合は方法2が良い感じ• もっと良い方法があったら教えて下さい