
我有一個由兩位主持人組成的小組。我想將一項任務委託給非目前主機的人。
以下內容不符合任何內容,僅傳回我最初的兩個主機的清單。
- debug: msg="{{ groups['web-servers'] | select('match', '^(?!\{\{\ inventory_hostname\ \}\}$).+') | list }}"
我認為這是逃避問題,但我無法弄清楚。
答案1
一個選擇是使用不同之處篩選。下面是如何使用過濾器的範例
shell> cat test-difference-01.yml
- hosts: localhost
gather_facts: no
vars:
web_servers:
- web-server-01
- web-server-02
- web-server-09
inventory_hostname:
- web-server-02
tasks:
- set_fact:
delegate_to_hosts: "{{ web_servers|difference(inventory_hostname) }}"
- debug:
msg : "{{ delegate_to_hosts }}"
shell> ansible-playbook test-difference-01.yml | grep -A 3 msg
"msg": [
"web-server-01",
"web-server-09"
]
問:」兩台主機組成的群組...將任務委託給非目前主機的主機」
鑑於庫存
shell> cat hosts
[webservers]
web-server-01
web-server-02
劇本
- hosts: webservers
tasks:
- debug:
msg: "{{ inventory_hostname }} {{ item }}"
loop: "{{ groups.webservers|difference([inventory_hostname]) }}"
delegate_to: "{{ item }}"
給出(刪節)
ok: [web-server-01 -> web-server-02] => (item=web-server-02) =>
msg: web-server-01 web-server-02
ok: [web-server-02 -> web-server-01] => (item=web-server-01) =>
msg: web-server-02 web-server-01
該程式碼可以透過運行來推廣全部列出的主機ansible_play_hosts_all
- hosts: all
tasks:
- debug:
msg: "{{ inventory_hostname }} {{ item }}"
loop: "{{ ansible_play_hosts_all|difference([inventory_hostname]) }}"
delegate_to: "{{ item }}"
答案2
您不需要指定具有負前瞻的正規表示式。相反,使用reject
篩選。
另外,透過equalto
測試,您不需要將字串括在^
and 中$
:
- debug:
msg: "{{ groups['web-servers'] | reject('equalto', inventory_hostname) | list }}"
答案3
我認為問題在於正規表示式模式中的變數替換(或缺少變數替換)。您可以單獨定義模式,並將其傳遞給過濾器(請注意,我確實修改了您的正規表示式):
- set_fact: pattern="^(?!{{ inventory_hostname }}).+$"
- debug: msg="{{ groups['web-servers'] | select('match', pattern) | list }}"
結果:
TASK [debug : debug] ******************************************
ok: [foo] => {
"msg": [
"bar",
"baz"
]
}
ok: [bar] => {
"msg": [
"foo",
"baz"
]
}
ok: [baz] => {
"msg": [
"foo",
"bar"
]
}