我嘗試通過一些界面并打開混雜模式(如果尚未打開)。然而,在某些節??點上,介面不存在,這很好,但是如果主機上的一個介面出現故障,則該特定介面的整個任務將失敗,并且其他存在的介面也將被忽略。
這是我的劇本:
---
- hosts: all
gather_facts: no
tasks:
- name: Check promisc mode on
shell:
"ip a | grep '{{ item.1.name }}'"
register: promisc
notify: check promiscuous
with_subelements:
- "{{ interface }}"
- client
handlers:
- name: check promisc
loop: "{{ promisc.results | rejectattr('stdout','contains','PROMISC') | map(attribute='item') | list }}"
shell:
"ip l set dev '{{ item.1.name }}' promisc on"
輸出:
changed: [host1] => (item=[{}, {'name': 'eth0'}])
changed: [host2] => (item=[{}, {'name': 'eth0'}])
changed: [host1] => (item=[{}, {'name': 'eth1'}])
failed: [host2] (item=[{}, {'name': 'eth1'}]) => {"ansible_loop_var": "item", "changed": true, "cmd": "ip a | grep 'eth1'", "delta": "0:00:00.007615", "end": "2022-11-14 10:05:33.972555", "item": [{}, {"name": "eth1"}], "msg": "non-zero return code", "rc": 1, "start": "2022-11-14 10:05:33.964940", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
changed: [host1] => (item=[{}, {'name': 'eth2' }])
changed: [host2] => (item=[{}, {'name': 'eth2'}])
RUNNING HANDLER [check promiscuous] *********************************************************************************************************************************************
PLAY RECAP ******************************************************************************************************************************************************************
host1 : ok=1 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
host2 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
它忽略了 host2 上其他 2 個“已更改”的處理程式,因為其中一個在此任務中失敗了。它不會在 host1 上運行處理程式,因為所有介面在每個介面上都啟用了混雜模式,但我知道在 host2 上,它們都沒有啟用混雜模式。
然后,我嘗試通過設定 set_fact 來僅獲取輸出為 0 的“rc”項:
- set_fact:
res: "{{ promiscuous.results | selectattr('rc','defined') | map(attribute='rc') | list }}"
給出:
ok: [host1] => {
"res": [
0,
0,
0,
]
}
我也曾嘗試添加“ignore_errors”,但它為我提供了與主機 1 相同的輸出,但顯然只有一個區別 (0、1、0)。
如果沒有其他方法,我想遍歷這個結果,但我已經在我的任務中使用了一個“with_subelements”回圈,并且在我的處理程式中使用了另一個回圈,所以我不確定我該如何完成......
我已經閱讀了一個塊中的“救援”模塊,但我不確定我是否可以使用它,因為我不想回滾任何更改。
uj5u.com熱心網友回復:
我認為您正在嘗試promisc為每個介面配置值。
您可以通過以下方式實作它:
---
- hosts: all
gather_facts: true
become: true
tasks:
- name: enable promisc when it is off
shell: "ip l set {{ item }} promisc on"
when: not hostvars[inventory_hostname]['ansible_%s' | format(item)]['promisc']
loop: "{{ ansible_interfaces | difference('lo') }}"
此任務是冪等的,因此您可以每 5 分鐘運行一次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/534270.html
標籤:循环可靠的
上一篇:如何跟蹤同一家公司內董事會的變動
