我有一组两位主持人。我想将一项任务委托给不是当前主机的任务。
下面的内容与任何内容不匹配,只返回我最初的两个主机的列表。
- debug: msg="{{ groups['web-servers'] | select('match', '^(?!\{\{\ inventory_hostname\ \}\}$).+') | list }}"我想这就是问题所在,但我想不出答案。
发布于 2018-09-10 16:15:57
一个选项是使用差异过滤器。下面是如何使用过滤器的示例
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代码可以通过在可抗中列出的所有主机上运行来概括。
- hosts: all
tasks:
- debug:
msg: "{{ inventory_hostname }} {{ item }}"
loop: "{{ ansible_play_hosts_all|difference([inventory_hostname]) }}"
delegate_to: "{{ item }}"发布于 2018-09-10 17:51:51
您不需要指定负前瞻性的正则表达式。相反,使用reject过滤器。
此外,使用equalto测试时,不需要将字符串括在^和$中:
- debug:
msg: "{{ groups['web-servers'] | reject('equalto', inventory_hostname) | list }}"发布于 2018-09-10 16:02:13
我认为问题在于正则表达式中的变量替换(或缺少替换)。您可以分别定义模式,并将其传递给过滤器(请注意,我确实修改了正则表达式):
- 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"
]
}https://serverfault.com/questions/930260
复制相似问题