¿Cómo configurar una tarea para que se ejecute para un grupo de inventario específico?

¿Cómo configurar una tarea para que se ejecute para un grupo de inventario específico?

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 centeren el 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:

¿Qué debo escribir como condición whenpara 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 appserversgrupo al que te refieres, ya que appserverssolo puede estar en una ubicación.

Si intenta crear dos appserversgrupos, 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 appserversgrupo bajo northy un appserversgrupo 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 appserversen la northregión, entonces establecerías tu límite de juego en north:&appserverso, 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.

información relacionada