Ansible 俺のコーディング規約
コードの可読性に関すること
処理内容を横に長く書かない
1パラメータ1行を使って書く
Atom 使ってる人はこれ http://qiita.com/h-hirokawa/items/f1960aee1c4201ee47f2 がやってくれる
- name: '[apache] service start and enable'
service:
name: '{{item}}'
state: started
enabled: yes
with_items:
- 'httpd'
notify:
- '[apache] start'
- name: '[apache] service start and enable'
service: name={'item'} state=started enabled=yes
with_items:
- 'httpd'
notify:
- '[apache] start'
ログの可読性に関すること
with_items, with_dict など with_xxxx を積極的に使用するとログに内容が出てくるので確認しやすい
[code]
- name: '[apache] install'
package:
name: '{{item}}'
with_items:
- 'httpd-{{apache.version}}'
[log]
TASK [apache: [apache] install] ***************************
ok: [10.10.10.11] => (item=[u'httpd-2.4.6'])
[code]
- name: '[apache] install'
package:
name: 'httpd-{{apache.version}}'
[log]
TASK [apache: [apache] install] ***************************
ok: [10.10.10.12]
※正しく変数が適用されているかが不安になる時がある
効率性に関すること
すべてのタスクにタグをつける
$ ansible-playbook -t apache
タグ指定実行をすることで、一部修正して試すみたいなときの時間短縮になる
- block:
- name: '[apache] install'
package:
name: '{{item}}'
with_items:
- 'httpd-{{apache.version}}'
- name: '[apache] configure'
...
- name: '[apache] service start and enable'
...
tags:
- apache
再利用性に関すること
hash_behaviour = merge 前提で記述する
ロールのデフォルト値をできるだけ網羅しておき、デフォルト値が気に入らない部分だけ上書きする
jenkins:
version: '{{jenkins_version | default("2.9")}}'
port: '{{jenkins_port | default("8080")}}'
- hosts: jenkins
roles:
- role: jenkins
jenkins:
port: 80
※jenkins ロールの開始時は
jenkins:
version: '2.9'
port: '80'
と認識される
hash_behaviour = replace だとデフォルト値が消えてなくなり、
指定したパラメータのみになってしまって、デフォルト値の意味がなくなる
ディレクトリレイアウト
公式ではこのようになっているが
http://docs.ansible.com/ansible/playbooks_best_practices.html#directory-layout
経験上、導いたものは
.
├── ansible.cfg ← このファイルがある場所で ansible-playbook を実行する
├── host_vars
│ └── localhost
├── inventories ← 公式BestPractice ではトップに置いていたが、
│ ├── vagrant inventories/$environment_name/ のディレクトリを設置する
│ │ └──jenkins 一つのインベントリファイルに 100台ないしは1000台ものリストがあるのはつらい
│ │ └──consul grep | wc -l で確認しやすいようにミドル/ソフトウェアごとにすべて分ける
│ └── aws 実行するときは ansible-playbook -i inventories/vagrant と
│ └──jenkins ディレクトリ指定をすればよい
│ └──consul
├── playbooks ← 公式BestPractice ではトップに置いていたが、なんかいやじゃん
│ └──jenkins.yml
├── roles
│ ├── consul
│ ├── jenkins
└── varfiles ← BestPractice にはなく、新設した理由はプロダクトやサービスの都合で
└── vagrant 設定する項目を列挙するため。たとえば、apache/nginx のコンフィグなど
└──apache apache ロールの中でこのファイルを template 命令で転送するイメージ
└──service_a_virtualhost.conf
group_vars とは異なる概念
playbook にロールのパラメータをベタ書きすれば同じ効果を得るのでまだ模索中
要は、トップディレクトりに inventory とか playbook とか散乱しているのが汚く見えたのを整理しただけ
我流フレームワーク
inventory に書かれたグループ名は、Consul + dnsmasq を使ってローカル DNS に自動登録するノウハウをもっているので、グループ名の命名には十分に注意し、ラウンドロビンで参照されることを忘れないように。