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

mas*_*ece 5 ansible

我有一组两个主机。我想将一项任务委派给不是当前主机的人。

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

  - debug: msg="{{ groups['web-servers'] | select('match', '^(?!\{\{\ inventory_hostname\ \}\}$).+') | list }}"
Run Code Online (Sandbox Code Playgroud)

我认为这是逃避问题,但我无法弄清楚。

Vla*_*tka 6

一种选择是使用差异过滤器。以下是如何使用过滤器的示例

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 }}"
Run Code Online (Sandbox Code Playgroud)
shell> ansible-playbook test-difference-01.yml | grep -A 3 msg
    "msg": [
        "web-server-01", 
        "web-server-09"
    ]
Run Code Online (Sandbox Code Playgroud)

问:“一组两个主机......将任务委托给不是当前主机的那个人

鉴于库存

shell> cat hosts
[webservers]
web-server-01
web-server-02
Run Code Online (Sandbox Code Playgroud)

剧本

- hosts: webservers
  tasks:
    - debug:
        msg: "{{ inventory_hostname }} {{ item }}"
      loop: "{{ groups.webservers|difference([inventory_hostname]) }}"
      delegate_to: "{{ item }}"
Run Code Online (Sandbox Code Playgroud)

给(略)

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
Run Code Online (Sandbox Code Playgroud)

可以通过在ansible_play_hosts_all 中列出的所有主机上运行来泛化代码

- hosts: all
  tasks:
    - debug:
        msg: "{{ inventory_hostname }} {{ item }}"
      loop: "{{ ansible_play_hosts_all|difference([inventory_hostname]) }}"
      delegate_to: "{{ item }}"
Run Code Online (Sandbox Code Playgroud)