Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dynamic Inventoryと参照変数

bungoume
September 22, 2014

Dynamic Inventoryと参照変数

Ansible Meetup in Tokyo 2014.09でのLT発表資料です。
http://ansible-users.connpass.com/event/7942/

bungoume

September 22, 2014
Tweet

More Decks by bungoume

Other Decks in Technology

Transcript

  1. Dynamic Inventoryと参照変数
    Ansible Meetup Tokyo 2014.09
    @bungoume

    View Slide

  2. 内容
    • 話すこと
    • Dynamic Inventory(EC2)について
    • 環境ごとに変数を使い分けるプラクティス
    • 話さないこと
    • Ansible変数展開の順序

    View Slide

  3. Dynamic Inventoryとは
    • Hostsをスクリプトで動的生成
    • EC2やGCE, Zabbixなどの外部リソースからHostsを生成できる
    • プラグインとして用意
    • https://github.com/ansible/ansible/tree/devel/plugins/inventory
    • EC2.pyの場合
    • タグやセキュリティグループ、リージョンなどを元にホストグループを管理
    • ec2.iniで対象リージョンを制限したり、フィルタをかけたりできる
    • hostsとして利用できる
    • hosts/
    ec2
    ec2.ini
    • ansible-playbook –i hosts webservers.yml

    View Slide

  4. 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

    View Slide

  5. こういうことがしたい
    • 環境とホストグループによって
    変数の値を切り替えたい
    • 例:
    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.100
    10.0.1.101
    10.0.2.100
    10.0.2.101

    View Slide

  6. 思いついた方法(2つ)
    • 方法1: inventory varsを使う
    • 方法2: vars_filesを使い、うまいこと読み込む

    View Slide

  7. • 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を使う

    View Slide

  8. - hosts: tag_role_webserver
    user: ec2-user
    tasks:
    - 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"
    }

    View Slide

  9. hosts/
    ec2, ec2.ini
    vars/
    nothing.yml
    tag_role_webserver.yml
    tag_env_dev/
    tag_role_webserver.yml
    webservers.yml (playbook)
    方法2: vars_filesを使う
    • 以下の様なディレクトリ構成
    • エラー回避用にnothing.ymlという空ファイルを用意しておく

    View Slide

  10. 方法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_webserver
    user: ec2-user
    vars_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

    View Slide

  11. まとめ
    • 方法1( inventory vars )
    • playbookの書き換えが不要
    • limitを忘れて全体実行するリスクがない
    • Inventoryファイルと組み合わせても使いやすい
    • 方法2( vars_files )
    • 多段に利用可能
    • {{ ec2_tag_env }}/{{ ec2_tag_role }}/{{ ec2_tag_group }}.yml
    • 読込優先度が自由に変更できる
    • まずは方法1、変数が増え、複雑な場合は方法2が良い感じ
    • もっと良い方法があったら教えて下さい

    View Slide