24時間365日フルマネージドホスティングサービスのデイーネット

Ansible小ネタ タグを指定しない場合はPlaybookを停止させる

こんにちはY.Oです。

本日はAnsibleの小ネタを1つご紹介します。

以前、1つのPlaybookに複数の機能を持たせ、各機能をタグで使い分けるといった運用をしていたことがあります。 そのPlaybookを実行する際には、必ずタグを指定することとルールを決めていましたが、誤ってタグを指定せずに実行した場合、Playbook全体が実行されてしまうという危険がありました。 それを何とかしようとした時の小ネタです。

つぎのサンプルをご覧ください。 「Message display 1」と「Message display 2」の2つのメッセージ表示機能を持たせたPlaybookです。 タグの「msg1」、「msg2」を指定することで2つの機能を使い分けます。

【サンプル1】sample1.yml


---
- hosts: all
  tasks:
    - name: Message display 1
      debug: msg="トントン トントン"
      tags: msg1

    - name: Message display 2
      debug: msg="ヒ○○ニトン"
      tags: msg2


「msg1」を指定した場合


[ansible@ip-10-0-0-108 ~]$ ansible-playbook -i inventory sample1.yml -t msg1

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [10.0.0.186]

TASK [Message display 1] *******************************************************
ok: [10.0.0.186] => {
    "msg": "トントン トントン"
}

PLAY RECAP *********************************************************************
10.0.0.186                 : ok=2    changed=0    unreachable=0    failed=0


「msg2」を指定した場合


[ansible@ip-10-0-0-108 ~]$ ansible-playbook -i inventory sample1.yml -t msg2

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [10.0.0.186]

TASK [Message display 2] *******************************************************
ok: [10.0.0.186] => {
    "msg": "ヒ○○ニトン"
}

PLAY RECAP *********************************************************************
10.0.0.186                 : ok=2    changed=0    unreachable=0    failed=0


タグを指定せずに実行した場合


[ansible@ip-10-0-0-108 ~]$ ansible-playbook -i inventory sample1.yml

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [10.0.0.186]

TASK [Message display 1] *******************************************************
ok: [10.0.0.186] => {
    "msg": "トントン トントン"
}

TASK [Message display 2] *******************************************************
ok: [10.0.0.186] => {
    "msg": "ヒ○○ニトン"
}

PLAY RECAP *********************************************************************
10.0.0.186                 : ok=3    changed=0    unreachable=0    failed=0

2つの機能が実行されてしまいます。

そこで、次のサンプル2のようにPlaybookの先頭へ、failモジュールを置くことにしました。

failモジュール部分はリモートホストで実行する必要が無いので、実行先ホストを"localhost"とし、"connection: local"を設定しています。

【サンプル2】sample2.yml


---
- hosts: localhost
  connection: local
  tasks:
    - name: Safety
      fail: msg="危険を察知!!"

- hosts: all
  tasks:
    - name: Message display 1
      debug: msg="トントン トントン"
      tags: msg1

    - name: Message display 2
      debug: msg="ヒ○○ニトン"
      tags: msg2


以下、サンプル2のPlaybookをタグ無しで実行した結果ですが、Playbook全体が実行されることなく、停止するようになっています。


[ansible@ip-10-0-0-108 ~]$ ansible-playbook -i inventory sample2.yml

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Safty] *******************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "危険を察知!!"}
        to retry, use: --limit @/home/ansible/sample2.retry

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=1



以上、Ansible小ネタでした。

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar