LoginSignup
14
19

More than 5 years have passed since last update.

Ansible 俺のコーディングポリシー メモ

Last updated at Posted at 2017-02-02

Ansible 俺のコーディング規約

コードの可読性に関すること

処理内容を横に長く書かない
1パラメータ1行を使って書く
Atom 使ってる人はこれ http://qiita.com/h-hirokawa/items/f1960aee1c4201ee47f2 がやってくれる

good.yml
  - name: '[apache] service start and enable'
    service:
      name: '{{item}}'
      state: started
      enabled: yes
    with_items:
      - 'httpd'
    notify:
      - '[apache] start'
bad.yml
  - 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 を積極的に使用するとログに内容が出てくるので確認しやすい

good.yml
[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'])
bad.yml
[code]
  - name: '[apache] install'
    package:
      name: 'httpd-{{apache.version}}'

[log]
TASK [apache: [apache] install] ***************************
ok: [10.10.10.12]
※正しく変数が適用されているかが不安になる時がある

効率性に関すること

すべてのタスクにタグをつける

$ ansible-playbook -t apache 

タグ指定実行をすることで、一部修正して試すみたいなときの時間短縮になる

role/apache/tasks/main.yml

- 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 前提で記述する
ロールのデフォルト値をできるだけ網羅しておき、デフォルト値が気に入らない部分だけ上書きする

roles/jenkins/default/main.yml
jenkins:
  version: '{{jenkins_version | default("2.9")}}'
  port: '{{jenkins_port | default("8080")}}'
playbooks/playbook.yml
- 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 に自動登録するノウハウをもっているので、グループ名の命名には十分に注意し、ラウンドロビンで参照されることを忘れないように。

ほかに思いついたら追記していく

14
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
19