こんにちは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小ネタでした。