狠狠撸

狠狠撸Share a Scribd company logo
知っていると 
ちょっと便利なこと 
若山 史郎 @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を 
? 今後も便利な機能が増え 
ていくので乞うご期待

More Related Content

Ansible meetup201409

  • 2. おまえだれよ? ? 若山史郎 @ ツキノワ株式会社 ? お仕事募集中です ? Twitter ID: r_rudi ? 著書 ? Ansible: 「入門Ansible」 ? Sphinx :「 Sphinxをはじめよう」
  • 3. 今日お話すること ? 知っているとちょっと便利なこと ? いろいろなな小ネタを用意しました ? 全部で7つです。お互いに関連性はありません
  • 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を ? 今後も便利な機能が増え ていくので乞うご期待