Как настроить задачу для выполнения для определенной группы инвентаря?

Как настроить задачу для выполнения для определенной группы инвентаря?

Следующее задание:

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

следует запускать только для машин, которые находятся centerв appserversгруппе

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

Что мне следует ввести в качестве условия, whenчтобы это осуществить? Также, каков принцип, лежащий в основе этой опции конфигурации?

решение1

Чтобы использовать членство в группе в условном выражении для задачи, воспроизведения или блока, следует использовать следующий формат:

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

Конкретно по Вашему первоначальному вопросу:

when: inventory_hostname in groups["appservers"]

Чтобы охватить все машины в домене north, вам просто нужно изменить его на: when: inventory_hostname in groups["north"]

Что касается вашего последующего разъяснения (указания группы в определенном «местоположении»), поскольку имена групп должны быть уникальными в Ansible, нет необходимости различатькоторый appserversгруппа, о которой вы говорите, appserversможет находиться только в одном месте.

Если вы попытаетесь создать две appserversгруппы, только первая из них будет фактически проанализирована движком ansible; любая последующая группа с тем же именем будет проигнорирована. Таким образом, если вы планировали (в будущем) иметь группу appserversпод northи appserversгруппу под south, вы обнаружите, что будут включены только члены первой группы.

В ansible, как мы этого достигнем (мое предположение о том, что выможетхотите в будущем), то наиболее приемлемый способ продолжить — добавить хосты в несколько групп, например, так, и соответствующим образом настроить лимит или условие:

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:

В этом примере, если вы хотитевсесерверы приложений, вы просто нацелитесь на appservers. Если вы хотите только appserversв northрегионе, то вы должны установить ограничение на воспроизведение на north:&appservers, или в качестве альтернативы использовать условный

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

В любом случае, я думаю, вам, возможно, понадобится освежить в памяти, как структурирован инвентарь в Ansible, для этого я бы рекомендовалгид пользователя; также на различных обучающих сайтах есть несколько замечательных ресурсов, которые могут дать гораздо более подробную информацию.

Для получения дополнительной информации о более сложном таргетинге с использованием нескольких групп (комбинаций, объединений, исключений и т. д.) предлагаю вам ознакомиться с этим другимгид пользователя.


Лично я изначально считал эту настройку утомительной и ограниченной, но по мере того, как я все больше привыкал к ней, я нахожу ее более динамичной, чем альтернативные варианты.

Связанный контент