知っていると 
ちょっと便利なこと 
若山 史郎 @r_rudi
おまえだれよ? 
• 若山史郎 @ ツキノワ株式会社 
• お仕事募集中です 
• Twitter ID: r_rudi 
• 著書 
• Ansible: 「入門Ansible」 
• Sphinx :「 Sphinxをはじめよう」
今日お話すること 
• 知っているとちょっと便利なこと 
• いろいろなな小ネタを用意しました 
• 全部で7つです。お互いに関連性はありません
一つ目 
roles_path 
検閲済み
roles_path (1/7) 
• roleが散らばって困っていませんか 
• リポジトリが違う場合など 
• ansible.cfgに “roles_path” を設定できます 
roles_path=/opt/roles:../roles 
! 
• “:”で区切って複数個指定できます 
• “..” など相対パスも使えます
roleの検索順序 (1/7) 
• roleの検索順序 
1. 自分のディレクトリの roles 以下 
2. 自分のディレクトリ 
3. roles_pathを前から探していく 
./deploy.yml 
/inventory 
/roles/hoge/tasks 
/hoge/tasks/ 
← こっちが先
whenの複数条件 (2/7) 
when: ansible_os_family == "RedHat" ! and mode == "production" 
• 長すぎ。こう書けます 
when: 
- ansible_os_family == "RedHat" 
- mode == "production"
shellで環境変数 (3/7) 
• “environment” 
• ちなみにどのモジュールでも使えます 
! 
! 
- shell: something.sh 
environment: 
PATH: /opt/bin 
• sourceは使えない。 “.” かbashで実行 
- shell: source envfile && something.sh 
stderr: /bin/sh: 1: source: not found 
- shell: . envfile && something.sh 
- shell: source envfile && something.sh 
executable=/bin/bash
数字として比較 (4/7) 
• 普通に書くと、文字列での比較となってしまう 
- shell: cat /var/log/something.log | wc -l 
register: logline 
- fail: msg="too long" 
when: logline.stdout > 300 
- shell: cat /var/log/something.log | wc -l 
register: logline 
- fail: msg="too long" 
when: logline.stdout | int > 300
バージョンを比較 (4/7) 
• “3.0.16” などのバージョンを比較できます 
vars: 
version: 3.0.16 
tasks: 
- debug: msg="its old!" 
when: version | version_compare(‘3.0.20’, '<=')
正規表現で比較 (4/7) 
vars: 
url: "http://example.com/users/foo/resources/bar" 
! 
tasks: 
- shell: "msg='パターン 1にマッチ (完全一致)’" 
when: url | match("http://example.com/users/.*/ 
resources/.*") 
! 
- debug: "msg='パターン 2にマッチ (部分一致)’" 
when: url | search("/users/.*/resources/.*")
cronモジュール (5/7) 
• crontabの書き方を忘れたりしませんか? 
• minute, hour などで指定できます 
cron: name=“check” 
minute=30 hour="5,2" job="ls -alh > /dev/null" 
! 
• @reboot なども指定できます 
cron: name="reboot" special_time=reboot job="ls -lah" 
! 
• AnsibleのDSLを覚えておけばいい
local_fact (6/7) 
• /etc/ansible/facts.d/hosts.fact 
• 対象ホストにファイルを置くとfactとなる 
[group] 
stage=! 
development 
role=webserver 
! 
• 使い方 
- debug: msg={{ ansible_local.hosts.group.role }}
local_fact (6/7) 
• JSONでも書けます 
{ 
"group": { 
! 
“role”:"webserver", 
“stage”: “development” 
} 
} 
! 
• 実行権限をつけると、動的に生成できます 
#!/bin/sh 
cat <<EOF 
{"group": { 
“role”:"webserver", 
“stage”: “development” } 
} 
EOF
local_path (6/7) 
• /etc/ansible/facts.d/じゃない場所を使いたい! 
• setupモジュールを使う 
tasks: 
- setup: fact_path="/home/shirou/tmp/ansible" 
- debug: msg={{ ansible_local.hosts.group.role }}
chatops (7/7) 
• slack + hubot
まとめ 
1. role_path 
2. when 
3. shell 
4. 数字として比較 
5. cron 
6. local_fact 
7. hubot + slack 
• 小ネタを用意しました 
• 全部ドキュメントに書い 
てあります 
• hubotは後でgistを 
• 今後も便利な機能が増え 
ていくので乞うご期待

Ansible meetup201409

  • 1.
  • 2.
    おまえだれよ? • 若山史郎@ ツキノワ株式会社 • お仕事募集中です • Twitter ID: r_rudi • 著書 • Ansible: 「入門Ansible」 • Sphinx :「 Sphinxをはじめよう」
  • 3.
    今日お話すること • 知っているとちょっと便利なこと • いろいろなな小ネタを用意しました • 全部で7つです。お互いに関連性はありません
  • 4.
  • 5.
    roles_path (1/7) •roleが散らばって困っていませんか • リポジトリが違う場合など • ansible.cfgに “roles_path” を設定できます roles_path=/opt/roles:../roles ! • “:”で区切って複数個指定できます • “..” など相対パスも使えます
  • 6.
    roleの検索順序 (1/7) •roleの検索順序 1. 自分のディレクトリの roles 以下 2. 自分のディレクトリ 3. roles_pathを前から探していく ./deploy.yml /inventory /roles/hoge/tasks /hoge/tasks/ ← こっちが先
  • 7.
    whenの複数条件 (2/7) when:ansible_os_family == "RedHat" ! and mode == "production" • 長すぎ。こう書けます when: - ansible_os_family == "RedHat" - mode == "production"
  • 8.
    shellで環境変数 (3/7) •“environment” • ちなみにどのモジュールでも使えます ! ! - shell: something.sh environment: PATH: /opt/bin • sourceは使えない。 “.” かbashで実行 - shell: source envfile && something.sh stderr: /bin/sh: 1: source: not found - shell: . envfile && something.sh - shell: source envfile && something.sh executable=/bin/bash
  • 9.
    数字として比較 (4/7) •普通に書くと、文字列での比較となってしまう - shell: cat /var/log/something.log | wc -l register: logline - fail: msg="too long" when: logline.stdout > 300 - shell: cat /var/log/something.log | wc -l register: logline - fail: msg="too long" when: logline.stdout | int > 300
  • 10.
    バージョンを比較 (4/7) •“3.0.16” などのバージョンを比較できます vars: version: 3.0.16 tasks: - debug: msg="its old!" when: version | version_compare(‘3.0.20’, '<=')
  • 11.
    正規表現で比較 (4/7) vars: url: "http://example.com/users/foo/resources/bar" ! tasks: - shell: "msg='パターン 1にマッチ (完全一致)’" when: url | match("http://example.com/users/.*/ resources/.*") ! - debug: "msg='パターン 2にマッチ (部分一致)’" when: url | search("/users/.*/resources/.*")
  • 12.
    cronモジュール (5/7) •crontabの書き方を忘れたりしませんか? • minute, hour などで指定できます cron: name=“check” minute=30 hour="5,2" job="ls -alh > /dev/null" ! • @reboot なども指定できます cron: name="reboot" special_time=reboot job="ls -lah" ! • AnsibleのDSLを覚えておけばいい
  • 13.
    local_fact (6/7) •/etc/ansible/facts.d/hosts.fact • 対象ホストにファイルを置くとfactとなる [group] stage=! development role=webserver ! • 使い方 - debug: msg={{ ansible_local.hosts.group.role }}
  • 14.
    local_fact (6/7) •JSONでも書けます { "group": { ! “role”:"webserver", “stage”: “development” } } ! • 実行権限をつけると、動的に生成できます #!/bin/sh cat <<EOF {"group": { “role”:"webserver", “stage”: “development” } } EOF
  • 15.
    local_path (6/7) •/etc/ansible/facts.d/じゃない場所を使いたい! • setupモジュールを使う tasks: - setup: fact_path="/home/shirou/tmp/ansible" - debug: msg={{ ansible_local.hosts.group.role }}
  • 16.
    chatops (7/7) •slack + hubot
  • 17.
    まとめ 1. role_path 2. when 3. shell 4. 数字として比較 5. cron 6. local_fact 7. hubot + slack • 小ネタを用意しました • 全部ドキュメントに書い てあります • hubotは後でgistを • 今後も便利な機能が増え ていくので乞うご期待