
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 center
no appservers
grupo
---
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 when
para 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 appservers
grupo ao qual você está se referindo, pois appservers
só pode estar em um local.
Se você tentar criar dois appservers
grupos, 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 appservers
grupo sob north
e um appservers
grupo 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 appservers
na north
região, então você definiria seu limite de jogo para north:&appservers
ou, 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.