Ansibleで運用中のサーバのcronへ新規jobの追加

まだまだ使い慣れないAnsibleを使って、
cronへ新規のjob追加を行います。

#動作環境
・ansible 2.0.1.0
・RHEL 6系

#Playbook
##Playbookの前提
・一つのPlaybookで複数の対象サーバへ一度にjobの追加をしたい
・対象のサーバのcronファイルの名前は用途毎で命名規則をつけている
（この状態が良いのかは別として・・・）
・copyモジュールを利用してファイルを差し替えても良いが、同じグループでも個別対応でcronに差分がある
（これもアリなのかナシなのかは置いておいて・・・）
・cronファイルの最下段へjobを追加する方法にする

##今回の運用実施時の流れ
・作業前にjob追加対象のcronファイルをansibleの実行サーバに取得する（cron_beforeディレクトリへ）
・cronへjobの追加をする
・作業後にjob追加対象のcronファイルをansibleの実行サーバに取得する（cron_afterディレクトリへ）
・作業前後ので追加予定のjobのみ差分として表示される事を確認する

##inventoryの中身

```
[hogebk]
hogebk101
hogebk102

[piyobk]
piyobk101

[all_host:children]
hogebk
piyobk
```

##Playbookの中身
###fetchのPlaybook（before用とafter用の2つを用意します）

```playbook/all/fetch_cron_before_test.yml:
- hosts : all_host
  gather_facts: no
  vars:
    ## ローカルでバックアップを取得するディレクトリを定義
    ## 差分確認で作業実施後のものを取得したい場合はcron_afterとかに書き換えて使う
    fetch_path: cron_before
    ## hogebkグループでjob追加予定のファイル名を定義（バックアップ対象のcronファイル名）
    hogebk_files:
      - /etc/cron.d/hogehoge
    ## piyobkグループでjob追加予定のファイル名を定義（バックアップ対象のcronファイル名）
    piyobk_files:
      - /etc/cron.d/piyopiyo

  tasks :
    ## whenを使いhogebkのホストグループに属しているホストの場合に以下の変数を利用してバックアップ処理する
    - name: hogebk  FETCH
      fetch : src={{ item }} dest=/usr/local/ansible/backup_files/{{inventory_hostname}}/{{ fetch_path }}/{{ item }} flat=yes fail_on_missing=yes
      with_items : '{{ hogebk_files }}'
      when: '"hogebk" in group_names'

    ## whenを使いpiyobkのホストグループに属しているホストの場合に以下の変数を利用してバックアップ処理する
    - name: piyobk  FETCH
      fetch : src={{ item }} dest=/usr/local/ansible/backup_files/{{inventory_hostname}}/{{ fetch_path }}/{{ item }} flat=yes fail_on_missing=yes
      with_items : '{{ piyobk_files }}'
      when: '"piyobk" in group_names'
```

###cronモジュールでjob追加のPlaybook
もしかすると、jobの中身もvarsにしてしまうのが良いのかもしれない

```playbook/all/cron_insert_test.yml:
- hosts : all_host
  gather_facts: no
  vars:

  tasks :
    ## cronに以下のようなものを追加する例
    ## * * * * * root echo test > /root/test.log
    ## cronモジュールで時間なども当然設定する事は可能です
    ## 利用可能なパラメータは Ansible Documentを参照ください・・・
    ## nameはcronコメント
    ## userはcronの実行ユーザ
    ## jobは実行させるjobを
    ## cron_fileは/etc/cron.d/配下においているファイル名
    - name: hogebk CRON INSERT
      cron : name="hogehoge"
             user=root
             job='echo test > /root/test.log'
             cron_file=hogehoge
      when: '"hogebk" in group_names'

    - name: piyobk CRON INSERT
      cron : name="piyopiyo"
             user=root
             job='echo test > /root/test.log'
             cron_file=piyopiyo
      when: '"piyobk" in group_names'
```

##実行編
###fetch
作業前にファイルのバックアップを取ります

```
# ansible-playbook -u root playbook/all/fetch_cron_before_test.yml
SSH password:

PLAY ***************************************************************************

TASK [hogebk  FETCH] ***********************************************************
skipping: [piyobk101] => (item=/etc/cron.d/hogehoge)
changed: [hogebk101] => (item=/etc/cron.d/hogehoge)
changed: [hogebk102] => (item=/etc/cron.d/hogehoge)

TASK [piyobk  FETCH] ***********************************************************
skipping: [hogebk101] => (item=/etc/cron.d/piyopiyo)
skipping: [hogebk102] => (item=/etc/cron.d/piyopiyo)
changed: [piyobk101] => (item=/etc/cron.d/piyopiyo)

PLAY RECAP *********************************************************************
piyobk101                  : ok=1    changed=1    unreachable=0    failed=0
hogebk101                  : ok=1    changed=1    unreachable=0    failed=0
hogebk102                  : ok=1    changed=1    unreachable=0    failed=0
```

fetchが成功している場合はchangedになります
また、inventoryで動作対象のホストがどのグループに所属しているかで
動作を分けたので想定通りなのかも確認しましょう

###cron job追加

```
# ansible-playbook -u root playbook/all/cron_insert_test.yml
SSH password:

PLAY ***************************************************************************

TASK [hogebk CRON INSERT] ******************************************************
skipping: [piyobk101]
changed: [hogebk101]
changed: [hogebk102]

TASK [piyobk CRON INSERT] ******************************************************
skipping: [hogebk101]
skipping: [hogebk102]
changed: [piyobk101]

PLAY RECAP *********************************************************************
piyobk101                  : ok=1    changed=1    unreachable=0    failed=0
hogebk101                  : ok=1    changed=1    unreachable=0    failed=0
hogebk102                  : ok=1    changed=1    unreachable=0    failed=0
```

こちらもcronファイルへjobが追加されるとchangedのステータスになります

### fetch（作業後）
作業後にも取得ディレクトリを作業前と別にしたPlaybookを使いfetchを実施
（実行画面は省略）

### ファイルの差分を確認します
ホストグループで登録する内容を分ければよかったのですが

```
# diff backup_files/piyobk101/cron_before/etc/cron.d/piyopiyo backup_files/piyobk101/cron_after/etc/cron.d/piyopiyo
0a1,2
> #Ansible: piyopiyo
> * * * * * root echo test > /root/test.log

# diff backup_files/hogebk101/cron_before/etc/cron.d/hogehoge backup_files/hogebk101/cron_after/etc/cron.d/hogehoge
0a1,2
> #Ansible: hogehoge
> * * * * * root echo test > /root/test.log

# diff backup_files/hogebk102/cron_before/etc/cron.d/hogehoge backup_files/hogebk102/cron_after/etc/cron.d/hogehoge
0a1,2
> #Ansible: hogehoge
> * * * * * root echo test > /root/test.log
```

想定通りのjob追加だけが差分として現れる事を確認します
また、今回ではhogehogeのcronファイルへはhogehogeのコメント付き
piyopiyoのcornファイルへはpiyopiyoのコメントが挿入されている事
（タスクが所属するホストグループで判定され処理されていること）を確認します