Como selecionar todos os hosts, exceto o inventory_hostname de um grupo?

2

Eu tenho um grupo de dois hosts. Eu quero delegar uma tarefa para o que não é o host atual.

O seguinte não corresponde a nada e apenas retorna uma lista dos meus dois hosts iniciais.

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

Acho que está escapando, mas não consigo entender.

    
por masterpiece 10.09.2018 / 17:20

3 respostas

2

Uma opção seria usar o filtro de diferenças . Abaixo está um exemplo de como usá-lo.

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

.

> ansible-playbook test-difference-01.yml | grep -A 3 msg
    "msg": [
        "web-server-01", 
        "web-server-09"
    ]
    
por 10.09.2018 / 18:15
2

Você não precisa especificar um regex com lookahead negativo. Em vez disso, use o reject filter .

Além disso, com equalto test, não é necessário incluir a sequência em ^ e $ :

- debug:
    msg: "{{ groups['web-servers'] | reject('equalto', inventory_hostname) | list }}"
    
por 10.09.2018 / 19:51
0

Eu acho que o problema é com a substituição de variável (ou falta dela) no padrão regex. Você pode definir o padrão separadamente, e passar isso para o filtro (note que eu modifiquei o seu regex um pouco):

- set_fact: pattern="^(?!{{ inventory_hostname }}).+$"
- debug: msg="{{ groups['web-servers'] | select('match', pattern) | list }}"

Resultado:

TASK [debug : debug] ******************************************
ok: [foo] => {
    "msg": [
        "bar",
        "baz"
    ]
}
ok: [bar] => {
    "msg": [
        "foo",
        "baz"
    ]
}
ok: [baz] => {
    "msg": [
        "foo",
        "bar"
    ]
}
    
por 10.09.2018 / 18:02

Tags