グループから inventory_hostname を除くすべてのホストを選択するにはどうすればよいですか?

グループから inventory_hostname を除くすべてのホストを選択するにはどうすればよいですか?

2 人のホストのグループがあります。現在のホストではないホストにタスクを委任したいと考えています。

以下は何も一致せず、最初の 2 つのホストのリストのみを返します。

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

質問:2 つのホストのグループ ... 現在のホストではないホストにタスクを委任します

在庫を考慮すると

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_すべて

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

答え2

否定先読みの正規表現を指定する必要はありません。代わりに、rejectフィルター

また、test では、文字列をおよびequaltoで囲む必要はありません。^$

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

関連情報