Como definir uma tarefa para ser executada em um grupo de inventário específico?

Como definir uma tarefa para ser executada em um grupo de inventário específico?

A seguinte tarefa:

- name: Download Jfrog Artifcats
  ansible.windows.win_shell: |
    $ENV:JFROG_CLI_OFFER_CONFIG="false"
    jfrog rt download ...
  when: ???

deve ser executado apenas para máquinas localizadas centerno appserversgrupo

---
all:
  children:
    root:
      children:
        center:
          children:
            appservers:
              hosts:
                vm1.domain.com:
            qservers:
              hosts:
                vm2.domain.com:
            dbservers:
              hosts:
                vm3.domain.com:
        mobilefarms:
          hosts:
          children:
            gateways:
              hosts:
        south:
          children:
            brooklyn:
              hosts:
                vm4.domain.com:
              children:
                clients:
                  hosts:
                    vm5.domain.com:
                    vm6.domain.com:
        north:
          children:
            new_york:
              hosts:
                vm8.domain.com:
              children:
                clients:
                  hosts:
                    vm9.domain.com:

O que devo digitar como condição whenpara conseguir isso? Além disso, qual é o princípio por trás desta opção de configuração?

Responder1

Para usar a associação ao grupo condicionalmente para uma tarefa, jogo ou bloco, você usaria o formato:

when: inventory_hostname in groups["<group name>"]

Especificamente para sua pergunta inicial:

when: inventory_hostname in groups["appservers"]

Para alcançar todas as máquinas em north, basta alterá-lo para: when: inventory_hostname in groups["north"]

No que diz respeito ao seu esclarecimento de acompanhamento (especificando um grupo em um "local" específico), como os nomes dos grupos devem ser exclusivos no ansible, não há necessidade de distinguirqual appserversgrupo ao qual você está se referindo, pois appserverssó pode estar em um local.

Se você tentar criar dois appserversgrupos, apenas o primeiro será analisado pelo mecanismo ansible; qualquer grupo subsequente com o mesmo nome será ignorado. Então, se você estava planejando (no futuro) ter um appserversgrupo sob northe um appserversgrupo sob south, você descobrirá que apenas os membros do primeiro grupo serão incluídos.

Em ansible, como conseguimos isso (minha suposição do que vocêpoderiadeseja no futuro), a maneira viável de proceder é adicionar os hosts a vários grupos como este e ajustar seu limite ou condicional adequadamente:

all:
  children:
    north:
      hosts:
        a.domain.com:
        b.domain.com:
    south:
      hosts:
        y.domain.com:
        z.domain.com:
    appservers:
      hosts:
        a.domain.com:
        y.domain.com:
    dbservers:
      hosts:
        b.domain.com:
        z.domain.com:

Neste exemplo, se você quisessetodosservidores de aplicativos, você segmentaria apenas appservers. Se você quisesse apenas appserversna northregião, então você definiria seu limite de jogo para north:&appserversou, alternativamente, usaria o condicional

when:
  - inventory_hostname in groups["appservers"]
  - inventory_hostname in groups["north"]

De qualquer forma, acho que você pode precisar de uma atualização sobre como o inventário é estruturado no ansible, para isso eu recomendaria oguia de usuario; também existem ótimos recursos em vários sites de treinamento que podem ser detalhados com muito mais detalhes.

Para obter mais informações sobre segmentações mais complexas usando vários grupos (combinações, uniões e exclusões, etc.), sugiro que você revise este outroguia de usuario.


A título pessoal, inicialmente achei a configuração tediosa e limitada, mas à medida que me familiarizei com seu uso, na verdade achei-a mais dinâmica do que a alternativa.

informação relacionada