Отфильтровать хосты с помощью переменной из with_items в недоступном

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

- name: run on hosts
  hosts: "{{ item }}"

  roles: 
    - directory/role-name

  with_items:
    - us-east-1a
    - us-east-1b
    - us-east-1c

В результате роль с именем role-name будет сначала запущена на us-east-1a хостах, затем на _4 _... и т. Д.

Вышеупомянутые простые ошибки с

ERROR! 'with_items' is not a valid attribute for a Play

Есть ли способ выполнить то, что я пытаюсь сделать, а именно разбить мой список хостов на группы и запустить одну и ту же роль против них по очереди?

Следующее дает результат, который я ищу, но неуклюжий и не динамичный по длине.

- name: run on us-east-1a
  hosts: "us-east-1a"
  roles:
    - my-role


- name: run on us-east-1b
  hosts: "us-east-1b"
  roles:
    - my-role


- name: run on us-east-1c
  hosts: "us-east-1c"
  roles:
    - my-role

person Nicholas    schedule 03.11.2017    source источник
comment
Я пытаюсь перебрать группы хостов по зонам доступности по очереди. Итак, все мои us-east-1a сначала, а затем 1b ... и т. Д.   -  person Nicholas    schedule 03.11.2017
comment
Помогите прояснить, если я что-то упускаю, но я просто пытаюсь запустить ту же роль против group of hosts, по одному. Поэтому вместо того, чтобы объединять вышеупомянутое в три разных прогона ... я хотел бы отфильтровать хосты для целевых зон доступности на каждой итерации.   -  person Nicholas    schedule 03.11.2017
comment
Вы пытались динамически создать группу инвентаря и ссылаться на эту группу в следующем учебнике? (см. docs.ansible.com/ansible/latest/list_of_inventory_modules.html)   -  person Max    schedule 04.11.2017


Ответы (2)


Я думаю, что единственный способ (1) иметь общий код и (2) сериализовать выполнение воспроизведения для каждой группы хостов (с целевыми объектами внутри группы, работающими параллельно) - это разделить вашу playbook на две части:

playbook-main.yml

---
- import_playbook: playbook-sub.yml
  vars:
    host_group_to_run: us-east-1a
- import_playbook: playbook-sub.yml
  vars:
    host_group_to_run: us-east-1b
- import_playbook: playbook-sub.yml
  vars:
    host_group_to_run: us-east-1c

playbook-sub.yml

- hosts: "{{ host_group_to_run }}"
  roles:
    - my-role

  # other common code

Если вы хотите сериализовать для каждого хоста, то существует _ 5_ декларация, которая может использоваться вместе с этим предложением, но, несмотря на ваши комментарии и изменения, это неясно, потому что, когда вы называете us-east-1a "хостом" в единственном числе, в других случаях вы называете "группу хостов" или "зону доступности".

person techraf    schedule 03.11.2017
comment
Хорошо ... Я думаю, это выполняет то, что я ищу. Да, я поймал host проблему и отредактировал ее. us-east-1a - это фильтр для группы хостов. Мне не нужно, чтобы они запускались последовательно, просто по частям, поскольку я думаю, что ваш ответ здесь. - person Nicholas; 03.11.2017

Справятся ли с этой задачей шаблоны хоста ?:

- name: run on us-east-1a
  hosts: us-east-1a,us-east-1b,us-east-1c
  roles:
    - my-role

Обновление: @techraf открыл мне глаза своим комментарием - шаблон хоста сам по себе не поможет.
Он просто объединит все хосты из всех групп.
Но предсказуемым способом, который в некоторых случаях можно использовать для итерации хостов в каждой группе отдельно.
Подробности см. в этом ответе.

person Konstantin Suvorov    schedule 03.11.2017
comment
Я могу проверить это ... будет ли группировать их по одному? - person Nicholas; 03.11.2017
comment
Должно. По крайней мере, для Ansible 2.3 так было. - person Konstantin Suvorov; 03.11.2017
comment
Мне пришлось бы добавить дополнительные теги ... чтобы это выглядело примерно так ... hosts:"tag_Name_value:&us-east-1a,tag_Name_value:&us-east-1b" - person Nicholas; 03.11.2017
comment
@KonstantinSuvorov будет ли это группировать их по одному? - Должно. - как же так? Он создаст набор хостов из конкатенации трех групп и будет работать с этим результатом, а не последовательно с хостами в каждой из групп. - person techraf; 04.11.2017
comment
Спасибо, что открыли мне глаза. Будет создан отсортированный набор: все хосты из первой группы, затем все хосты из второй группы и так далее. - person Konstantin Suvorov; 04.11.2017