如何从一个组中选择除 inventory_hostname 之外的所有主机?

如何从一个组中选择除 inventory_hostname 之外的所有主机?

我有一组由两台主机组成的主机。我想将任务委托给非当前主机的主机。

以下内容不匹配任何内容,仅返回我最初的两个主机的列表。

  - 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"
    ]
}

相关内容