
La siguiente tarea:
- name: Download Jfrog Artifcats
ansible.windows.win_shell: |
$ENV:JFROG_CLI_OFFER_CONFIG="false"
jfrog rt download ...
when: ???
debe ejecutarse solo para máquinas que se encuentran center
en el 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:
¿Qué debo escribir como condición when
para lograr esto? Además, ¿cuál es el principio detrás de esta opción de configuración?
Respuesta1
Para usar la membresía de grupo en un condicional para una tarea, juego o bloque, usarías el formato:
when: inventory_hostname in groups["<group name>"]
Específicamente a su pregunta inicial:
when: inventory_hostname in groups["appservers"]
Para llegar a todas las máquinas bajo north
, simplemente cámbielo a:
when: inventory_hostname in groups["north"]
Con respecto a su aclaración de seguimiento (especificar un grupo en una "ubicación" particular), como los nombres de los grupos deben ser únicos en ansible, no es necesario distinguirlos.cual appservers
grupo al que te refieres, ya que appservers
solo puede estar en una ubicación.
Si intenta crear dos appservers
grupos, el motor ansible solo analizará el primero; cualquier grupo posterior con el mismo nombre será ignorado. Por lo tanto, si planeaba (en el futuro) tener un appservers
grupo bajo north
y un appservers
grupo bajo south
, encontrará que solo se incluirán los miembros del primer grupo.
En ansible, cómo logramos esto (mi suposición de lo que ustedpuededesea en el futuro), la forma más viable de proceder es agregar los hosts a múltiples grupos de esta manera y ajustar su límite o condicional de manera apropiada:
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:
En este ejemplo, si quisierastodoservidores de aplicaciones, solo apuntaría a appservers
. Si quisieras solo appservers
en la north
región, entonces establecerías tu límite de juego en north:&appservers
o, alternativamente, usarías el condicional
when:
- inventory_hostname in groups["appservers"]
- inventory_hostname in groups["north"]
En cualquier caso, creo que es posible que necesite un repaso sobre cómo se estructura el inventario en ansible, para eso recomendaría elguía del usuario; También hay excelentes recursos en varios sitios de capacitación que pueden brindar muchos más detalles.
Para obtener más información sobre segmentación más compleja utilizando múltiples grupos (combinaciones, uniones y exclusiones, etc.), le sugiero que revise este otroguía del usuario.
En una nota personal, inicialmente pensé que la configuración era tediosa y limitada, pero a medida que me familiaricé con su uso, la encuentro más dinámica que la alternativa.