그룹에서 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필터.

또한 테스트에서는 문자열을 and 로 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"
    ]
}

관련 정보