このプレイブックについて助けが必要です。アサート モジュールを使用して、ディスク領域が 30% 未満であることをアサートし、失敗メッセージを含む Slack 通知を送信します。アサート モジュールは、サーバー内のすべての FS (約 10 FS) をループします。Slack に送信されたメッセージは期待どおりではありませんでした。私が実現しようとしているのは、ループ内の失敗した項目のみを表示することです。アサーションに失敗した項目のメッセージのみを表示します。
tasks:
- name:
assert:
that: "{{ item.size_available > item.size_total | float * 0.30 }}"
msg: "Filesystem: {{ item.mount }} has less than 30% space. Consider increasing the FS size"
#success_msg: "Filesystem: {{ item.mount }} has more than 30% space. No action required"
register: fs_space
loop: "{{ ansible_mounts }}"
loop_control:
label: ""
ignore_errors: true
- debug:
msg: "HOST {{ ansible_hostname }}: {{ fs_space.results | json_query('[*].msg') }}
when: true in fs_space.results | json_query('[*].failed')
最終結果は次のようになります。
HOST XYZ: [u'All assertions passed', u'All assertions passed', u'All assertions passed', u'All assertions passed', u'All assertions passed', u'Filesystem: /usr has less than 30% space. Consider increasing the FS size', u'All assertions passed', u'All assertions passed', u'All assertions passed', u'All assertions passed']
しかし、必要なメッセージは次のようになります:
HOST XYZ: Filesystem: /usr has less than 30% space. Consider increasing the FS size'
答え1
質問:「いずれかのマウント ポイントがアサーションを満たさない場合、タスクを終了するようにします。「
A: 条件を単純化します。例えば
shell> cat playbook.yml
- hosts: localhost
vars:
my_mounts: [500, 600,700]
tasks:
- assert:
that: mounts_all == mounts_ok
vars:
mounts_all: "{{ my_mounts|length }}"
mounts_ok: "{{ my_mounts|select('gt', 400)|length }}"
与える
TASK [assert] ******************************************************
ok: [localhost] => {
"changed": false,
"msg": "All assertions passed"
}
結果を表示したくない場合は、コールバックをミュートします。たとえば、
shell> ANSIBLE_DISPLAY_OK_HOSTS=false ansible-playbook playbook.yml
コールバックの詳細については、
shell> ansible-doc -t callback default
いずれかのアイテムが条件を満たさない場合、プレイは失敗します。例えば
- assert:
that: mounts_all == mounts_ok
vars:
mounts_all: "{{ my_mounts|length }}"
mounts_ok: "{{ my_mounts|select('gt', 600)|length }}"
与える
TASK [assert] *******************************************************
fatal: [localhost]: FAILED! => {
"assertion": "mounts_all == mounts_ok",
"changed": false,
"evaluated_to": false,
"msg": "Assertion failed"
}
質問:「アサーションに失敗した項目のメッセージのみを表示します。「
A: 失敗したマウントポイントを表示したい場合はデバッグタスクを追加します。例えば
- hosts: localhost
vars:
my_mounts:
- {dev: da0, size: 500}
- {dev: da1, size: 600}
- {dev: da2, size: 700}
tasks:
- debug:
msg: >
Filesystems: {{ mounts_fail }} failed.
Consider increasing the FS size.
when: mounts_fail|length > 0
vars:
mounts_fail: "{{ my_mounts|
selectattr('size', 'lt', 600)|
map(attribute='dev')|list }}"
- assert:
that: mounts_all == mounts_ok
vars:
mounts_all: "{{ my_mounts|length }}"
mounts_ok: "{{ my_mounts|
selectattr('size', 'gt', 600)|length }}"
与える
TASK [debug] *******************************************************
ok: [localhost] => {
"msg": "Filesystems: ['da0'] failed. Consider increasing the FS size.\n"
}
TASK [assert] ******************************************************
fatal: [localhost]: FAILED! => {
"assertion": "mounts_all == mounts_ok",
"changed": false,
"evaluated_to": false,
"msg": "Assertion failed"
}