Ansible: сделать циклы with_ настраиваемыми

Созданный на 25 авг. 2015  ·  90Комментарии  ·  Источник: ansible/ansible

ТИП ПРОБЛЕМЫ

Идея функции

НАЗВАНИЕ КОМПОНЕНТА

основной

АНСИБЛ ВЕРСИЯ

2.1

КОНФИГУРАЦИЯ
ОС / ОКРУЖАЮЩАЯ СРЕДА
РЕЗЮМЕ
how: 
    forks: 1
    pause: 0
    squash: name
    label: "{{item.name}}"
    end: on_fail
with_items: ...
  • вилки: вилки внутри цикла для параллельного выполнения элементов, по умолчанию 1, для этого нужны предупреждения
  • пауза: между выполнением цикла, полезно в сценарии дросселирования API . _Выполнено в версии 2.2_.
  • squash: объединить все элементы в список и перейти к предоставленной опции, работает как текущие жестко запрограммированные опции для apt, yum и т. д., по умолчанию должно быть None _abandon_: обратное мнение, мы должны удалить эту функцию
  • конец: когда прерывать цикл, по умолчанию «последний элемент», варианты? on_fail, on_success (первый)?
  • label: (#13710) что отображать при выводе цикла элемента данных _Done in 2.2_

документы в текущее состояние по адресу:

http://docs.ansible.com/ansible/playbooks_loops.html#loop — управление

ДЕЙСТВИЯ ПО ВОСПРОИЗВЕДЕНИЮ
ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ
ФАКТИЧЕСКИЕ РЕЗУЛЬТАТЫ
affects_2.1 affects_2.3 feature core

Самый полезный комментарий

+1 вилки

Я жду, когда модули openstack пройдут циклы with_ по 100+ элементам...
image

Все 90 Комментарий

Пожалуйста, давайте не будем называть это how . Это еще хуже читать, чем become: true . Но функционал под ним выглядит отлично.

включает исправление для # 10695

Превосходно. В интересах отказа от велосипедов, возможно, назовем это looping: .

:+1:

+1

+1, особенно за распараллеливание внутри хоста!

:+1:

:+1:
но давайте не будем называть это "как"

Итак, вот обходной путь для прерывания задачи цикла после первого сбоя.

- hosts: localhost
  vars:
    myvar:
        - 1
        - 2
        - 3
        - 4
        - 5
  tasks:
    - name: break loop after 3
      debug: msg={{item}}
      failed_when: item == 3
      register: myresults
      when: not (myresults|default({}))|failed
      with_items: "{{myvar}}"

@bcoca не работает с конца (ansible 1.9.3 ubuntu)

ЗАДАНИЕ: [разорвать цикл после 3] * * * * * * * * * * * * * * * * ** *
хорошо: [localhost] => (item=1) => {
«не удалось»: ложь,
"failed_when_result": ложь,
"элемент": 1,
"сообщение": "1"
}
хорошо: [localhost] => (item=2) => {
«не удалось»: ложь,
"failed_when_result": ложь,
"предмет": 2,
"сообщение": "2"
}
не удалось: [localhost] => (item=3) => {"failed": true, "failed_when_result": true, "item": 3, "verbose_always": true}
сообщение: 3
хорошо: [localhost] => (item=4) => {
«не удалось»: ложь,
"failed_when_result": ложь,
"элемент": 4,
"сообщение": "4"
}
хорошо: [localhost] => (item=5) => {
«не удалось»: ложь,
"failed_when_result": ложь,
"элемент": 5,
"сообщение": "5"
}

ах, да, это будет работать как в 2.0, так и в 1.9, регистрация не происходит до тех пор, пока не завершится цикл.

+1 на вилках

+1
возможно вместо "как", loop_details или варианты?

+1

+1, использование wait_for из localhost для ожидания появления 100 хостов EC2 убивает меня...

+1 по той же причине, что и senderista

+1

:+1:

И squash , и forks были бы замечательными функциями, которые значительно ускорили бы выполнение Ansible.

Я бы также заменил how на что-то вроде loop_details , loop_settings , loop_options или что-то подобное.

loop_control уже в 2.1 с реализованной частью label .

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

apt: name={{listofpackages}}

и полностью избежать цикла

+1 вилки

+1 вилки

У меня был вариант использования новой конфигурации для условного разрыва break_when

+1 вилки, и я надеюсь, что это также сработает для распараллеливания последовательностей задач, как в:
- include: service.yml
with_items: "{{services|default([])}}"

В противном случае уже есть async/async_status .

+1 вилки

Я жду, когда модули openstack пройдут циклы with_ по 100+ элементам...
image

+1 на вилках. Можно использовать это для копирования AMI во все регионы AWS.

+1 на вилках. Пожалуйста! сделать его частью loop_control

+1 на вилках

+1 на вилках

+1, вилки тоже нужны :-)

+1 на вилках

+1 на вилках

Вилки были бы потрясающими, +1

Я всегда сижу в тишине, не желая способствовать спаму, потому что трудно определить между проектами, приветствуется это или нет, но, похоже, поезд вилки +1 ушел со станции!

+1 на вилках

+1 на вилках

+1 на вилках

:+1: на вилках

@bcoca Приветствую! Спасибо, что нашли время, чтобы открыть этот вопрос. Чтобы сообщество могло эффективно решить вашу проблему, нам нужно немного больше информации.

Вот элементы, которые мы не смогли найти в вашем описании:

  • тип проблемы
  • доступная версия
  • имя компонента

Пожалуйста, установите описание этой проблемы с помощью этого шаблона:
https://raw.githubusercontent.com/ansible/ansible/devel/.github/ISSUE_TEMPLATE.md

нажмите здесь, чтобы получить помощь по боту

+1 на вилках

+1 на вилках!

+1 к Форксу!

+1 на вилках!

+1 на вилках!

Есть какие-нибудь обновления на форке? Когда он должен быть готов?
Мой вариант использования — создание экземпляров около 20 контейнеров на сервере с помощью with_sequence . Теперь это занимает слишком много времени :(
Я был бы рад помочь, но мне нужен совет, куда деть руки.

@bitliner никто не создал для него PR, если это то, о чем вы спрашиваете, на самом деле это очень сложно сделать правильно.

что касается вашей проблемы, просто объявите X хостов в инвентаре и переберите hosts: вместо with_ , чтобы создать их параллельно.

инвентарь:

[containers]
container[000:020]
hosts: containers
gather_facts: false
tasks:
   - container: state=present name={{inventory_hostname}}

т.е. контейнер - это "выдуманный" модуль.

@bcoca ваше решение мне непонятно. Чтобы быть уверенным, это то, что вы имеете в виду?

файл hosts

[containers]
192.168.1.100
192.168.1.100
192.168.1.100
192.168.1.100
... and so on based on the degree of parallelism I want to get ...

файл main.yml

hosts: containers
gather_facts: false
tasks:
   - container: state=present name={{inventory_hostname}}

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

Кроме того, каковы проблемы с правильной параллельной реализацией цикла?

Мой вариант использования должен ускорить эту задачу:

- name: "Start clients"
  docker_container:
    name: "mycontainer-{{ item }}"
    image: myimage
    links: 
      - server-{{item}}:server-{{item}}
  with_sequence: count={{ scale }}

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

Я мог бы создать модуль, который берет объявление контейнера и на основе параметра масштаба создает экземпляры нескольких контейнеров удаленно параллельно. Имеет ли это смысл? Есть ли у вас какая-либо помощь, чтобы понять, как вызывать/повторно использовать в myModule модуль docker_container и какие API предлагает Ansible для параллельного запуска?

@bitliner , вы не следовали моим инструкциям, у меня были уникальные имена в инвентаре (используя диапазон для работы так же, как последовательность). Поскольку имена в инвентаре уникальны, вы только что объявили одно и то же имя N раз, но у вас все еще есть один хост, что не вызывает второй проблемы с повторяющимися именами контейнеров, поскольку вы зацикливаетесь только на 1 хосте.

В любом случае, если вы хотите разобраться со своей проблемой, используйте ML или IRC, так как это немного не по теме этого тикета.

@bcoca Как я могу иметь один хост, если вы объявили 20 хостов?

[containers]
container[000:020]

собирается подключиться к container001 , container002 и т. д.

Это работает для уникальных имен, но мне непонятно, почему вы говорите, что у меня все еще есть один хост (вместо 20).
hosts:containers означает для меня 20 хостов, а не один. Что я игнорирую в этом решении?

@bitliner вызывает это:

[containers]
192.168.1.100
192.168.1.100
192.168.1.100
192.168.1.100

не 4 хоста, а 1

также на данный момент это в значительной степени не по теме, если вы хотите продолжить получать помощь по этому вопросу, перейдите в IRC или ML

Я решил использовать

[containers]
ip[000:020] ansible_host=192.168.1.100

а также

- name: "Start containers"
  docker_container:
    name: "my-container-{{ inventory_hostname }}"

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

а потом начинает "весело"...:

  • учитывается ли циклическая вилка против глобального --forks , сделать это для каждого пульта?
  • что делать с циклами, когда элементы зависят от предыдущих элементов (не только выполнение задачи, но и условные выражения и т. д.)?
  • как справиться с проблемами параллелизма, когда несколько форков выполняются на одном хосте? т.е. они обновляют один и тот же файл
  • как мы справляемся с уборкой? прямо сейчас они могут повторно использовать каталоги tmp ... но каждое выполнение очищается после себя, теперь это может вызвать проблемы.

И есть несколько других проблем, о которых я знаю... конечно, есть много, о которых я не узнаю, пока кто-нибудь не попытается реализовать это. У меня есть решения для некоторых, но они довольно быстро начинают выходить из-под контроля.

Разветвление цикла @bcoca не должно быть включено по умолчанию. Я бы предпочел, чтобы по умолчанию было установлено значение 1, и я ввел его как параметр forks или serial , но включил предупреждение. Скорее всего, это сломает какой-то существующий код. При этом я очень жду эту функцию (особенно для задач, требующих delegate_to )

+1 для вилок (false по умолчанию)

+1 вилки

+1 вилки

+1 вилки

+1 вилки

+1 вилки

+1 за вилки, однако в то же время есть новый плагин для стратегии Ansible, который значительно увеличивает производительность в целом, а также для циклов with_items . Возможно, для тех, кто хочет вилки по соображениям производительности, стоит посмотреть:

https://github.com/dw/митоген
https://mitogen.readthedocs.io/en/latest/ansible.html

Я не вижу, как это точно улучшит циклы with_items. Этот плагин
улучшает проблемы с производительностью, вызванные использованием ssh в качестве метода подключения.
Особенно на больших расстояниях и в скрытых сетях и с большим количеством
серверов.

Это не помогает с облачными функциями AWS или Azure, где выполнение
происходит на контроллере ansible и просто выполняется для набора элементов в
этой облачной системе и вообще не подключается к хостам, что является
основная проблема с медленным with_items. Это не имеет ничего общего с большим набором
машин или задержки или что-либо, связанное с ssh. Это просто факт
что он выполняет облачные функции в цикле with_items в сериале и ничего
может ускорить это, за исключением того, что поставщик облачных услуг улучшает свою скорость или
параллельное выполнение этих облачных функций с помощью ansible.

Он также вообще не упоминает with_items в статье, поэтому я не понимаю, как
это поможет хоть немного. Можете ли вы объяснить немного больше
как это может помочь? Я хотел бы знать, что мне не хватает, если мне не хватает
что-то здесь.

В субботу, 10 марта 2018 г., в 21:58, [email protected] написал:

+1 за форки, а пока есть и новый Ansible
плагин стратегии, который дает большой прирост производительности в целом, а также
для циклов with_items. Возможно, для тех, кто хочет вилки для производительности
причины, на которые стоит обратить внимание:

https://github.com/dw/митоген
https://mitogen.readthedocs.io/en/latest/ansible.html


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/ansible/ansible/issues/12086#issuecomment-372070418 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AJd59qWI9n_DNmUqpmZYiIOMZAyjJy3uks5tdEyQgaJpZM4Fx8zF
.

Правда, не во всех случаях поможет. Однако причина, по которой я ищу форки в with_items, заключается в медленности обработки каждого элемента по отдельности (даже при конвейерной обработке). Иногда мне приходится создавать большое количество (несколько сотен) каталогов на основе host_vars или шаблонировать несколько сотен файлов. Поэтому я в основном перебираю модули file и template .

Однажды я тестировал создание шаблонов 100 файлов в 100 отдельных файлах с помощью with_items, а не перебирал элементы в самом шаблоне jinja и объединял шаблон в один большой файл. Все в одном файле занимает 5 секунд, но создание 100 отдельных файлов конфигурации занимает 30 минут.

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

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

Согласованный. Я использую ansible для запуска только локальных задач. В частности, собрать около десятка образов докеров. На данный момент ansible собирает их серийно, поэтому это занимает много времени и недостаточно использует многоядерный процессор. Я хотел бы создать несколько образов докеров параллельно.

Затем @gjcarneiro не определяет их как данные, определяет их как хосты и нацеливает на них, а затем delegate_to: localhost для параллельного выполнения действий.

Ха, спасибо за ловкий трюк :) Но тем не менее, даже если он работает (я не проверял), это довольно запутанный способ параллельного выполнения задач.

С другой стороны, я могу использовать ansible для совершенно другой цели, чем предполагалось, так что в некотором смысле это моя вина :(

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

Да, я понимаю, Ansible не виноват, в этом есть смысл. Но я использую Ansible в качестве системы сборки (вместо, например, make), потому что Ansible хороша как система сборки во многих отношениях. Но, с моей точки зрения, как система сборки, «хост» не имеет смысла. Такая система сборки, как «make», не заботится о «хостах», она заботится только о файлах и задачах. Я заставляю Ansible использоваться в качестве системы сборки, и это вызывает небольшой когнитивный диссонанс, вот и все.

Ansible заботится только о хостах и ​​задачах, рассмотрите образы, которые вы создаете как «хосты», и внезапно он подходит для обеих парадигм.

Ansible — это инструмент управления конфигурацией для многих других вещей, сетей
устройств, как реальных, так и виртуальных, для огромного количества облачных сервисов, таких как
базы данных, веб-сервисы, такие как eleastic beanstalk, lambda и все
компоненты, которые применяются к нему, как компоненты безопасности IAM, в то время как Ansible
хорош в хостах, если вы все еще используете в основном виртуальные машины / хосты, в которых вы в основном
ИТ начала 2000-х. Никого не обижая здесь бывают иногда важные
причины запуска виртуальных машин или даже контейнеров докеров, но все они
унаследованные причины. На самом деле все больше и больше хостов станут менее
что он автоматизирует. IMO Если мы не получим параллель с with_items, мы могли бы
хорошо лом ansible все вместе.

Сказав, что я собираюсь думать здесь позитивно и попытаюсь использовать
делегат_то для некоторых облачных сервисов, я имею в виду, что я никогда не пробовал выполнять на 200+
Облачные компоненты, которые мне нужны для этого, я думаю, просто запросите список
и сбросьте его в файл hosts в формате hosts с помощью ansible, затем попробуйте
делегат_то: localhost Я сообщу здесь о своих результатах. Если он работает на
по крайней мере, мы можем сделать запрос на получение документации о том, как обойти
Серийный номер цикла with_item работает таким образом. Мы можем убедиться, что у нас есть ссылка на
их на разделы облачных модулей и разделы для докера.

В понедельник, 12 марта 2018 г., в 18:49, Брайан Кока уведомления[email protected] написал:

Ansible заботится только о хостах и ​​задачах, учитывая образы, которыми вы являетесь.
создание «хозяев», и внезапно это соответствует обеим парадигмам.


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

Затем @gjcarneiro не определяет их как данные, определяет их как хосты и нацеливает на них, затем делегирует_to: localhost для параллельного выполнения действий

Это очень хороший подход, но, похоже, он не работает внутри обходного пути для последовательных перезапусков с симуляцией serial=1 (#12170). Таким образом, возможность распараллеливания добавит гораздо больше гибкости.

без сомнения, но это также добавляет огромный уровень сложности и необходимость иметь дело с одновременными действиями на одном хосте аля hosts:all + lineinfile + delegate_to: localhost

Пока что я создал небольшой тест для delegate_to: 127.0.0.1 для
задачи удаления, так как это также боль в массовом масштабе.

Моя игровая книга выглядит так:

  • хосты: "{{ DeploymentGroup }}"

    задачи:

    • имя: удалить vm и все связанные ресурсы
      azure_rm_virtualmachine:
      resource_group: "{{ host_vars[item]['resource_group'] }}"
      имя: "{{ inventory_hostname }}"
      состояние: отсутствует

    делегат_к: 127.0.0.1


К сожалению, он все еще пытается подключиться к машинам, перечисленным в hosts, чтобы
выполнить задачу Azure azure_rm_virtualmachine.
Я делаю это правильно? Кажется, я что-то упускаю, но я попробовал это
ранее разными способами, поэтому просто хочу знать, что вы можете сделать
это.

Это вообще работает? Надеюсь, это просто какая-то проблема с синтаксисом.

В понедельник, 12 марта 2018 г., в 19:55, Исаак Эгглстоун < [email protected]

написал:

Ansible — это инструмент управления конфигурацией для многих других вещей,
сетевых устройств, как реальных, так и виртуальных, для огромного количества облачных
службы, такие как базы данных, веб-службы, такие как eleastic beanstalk, lambda
и все компоненты, которые применяются к нему, такие как компоненты безопасности IAM, в то время как
Ansible хорош для хостов, если вы все еще работаете в основном с виртуальными машинами/хостами.
в основном в начале 2000-х IT. Никого не обижая, здесь бывают иногда
важные причины для запуска виртуальных машин или даже док-контейнеров, но все они
восходят к унаследованным причинам. На самом деле все больше и больше хостов собираются
стать меньше того, что он автоматизирует. ИМО, если мы не получим параллель
with_items мы могли бы с тем же успехом отказаться от ansible.

Сказав, что я собираюсь думать здесь позитивно и попытаюсь использовать
делегат_то для некоторых облачных сервисов, я имею в виду, что я никогда не пробовал выполнять на 200+
Облачные компоненты, которые мне нужны для этого, я думаю, просто запросите список
и сбросьте его в файл hosts в формате hosts с помощью ansible, затем попробуйте
делегат_то: localhost Я сообщу здесь о своих результатах. Если он работает на
по крайней мере, мы можем сделать запрос на получение документации о том, как обойти
Серийный номер цикла with_item работает таким образом. Мы можем убедиться, что у нас есть ссылка на
их на разделы облачных модулей и разделы для докера.

В понедельник, 12 марта 2018 г., в 18:49, Брайан Кока уведомления[email protected] написал:

Ansible заботится только о хостах и ​​задачах, учитывая образы, которыми вы являетесь.
создание «хозяев», и внезапно это соответствует обеим парадигмам.


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

Итак, отключение сбора фактов устраняет эту проблему, однако вызывает
другой, host_vars больше не содержит динамическую инвентаризацию Azure из
стандартный в.

Таким образом, resource_group: "{{ host_vars[item]['resource_group'] }}" не
работать в приведенном выше и должен быть жестко запрограммирован на имя группы ресурсов.

Вс, 18 марта 2018 г., 11:14, Исаак Эгглстоун <
[email protected]> написал:

Пока что я создал небольшой тест для delegate_to: 127.0.0.1 для
задачи удаления, так как это также боль в массовом масштабе.

Моя игровая книга выглядит так:

  • хосты: "{{ DeploymentGroup }}"

    задачи:

    • имя: удалить vm и все связанные ресурсы
      azure_rm_virtualmachine:
      resource_group: "{{ host_vars[item]['resource_group'] }}"
      имя: "{{ inventory_hostname }}"
      состояние: отсутствует

    делегат_к: 127.0.0.1


К сожалению, он все еще пытается подключиться к машинам, перечисленным в hosts, чтобы
выполнить задачу Azure azure_rm_virtualmachine.
Я делаю это правильно? Кажется, я что-то упускаю, но я попробовал это
ранее разными способами, поэтому просто хочу знать, что вы можете сделать
это.

Это вообще работает? Надеюсь, это просто какая-то проблема с синтаксисом.

В понедельник, 12 марта 2018 г., в 19:55, Исаак Эгглстоун <
[email protected]> написал:

Ansible — это инструмент управления конфигурацией для многих других вещей,
сетевых устройств, как реальных, так и виртуальных, для огромного количества облачных
службы, такие как базы данных, веб-службы, такие как eleastic beanstalk, lambda
и все компоненты, которые применяются к нему, такие как компоненты безопасности IAM, в то время как
Ansible хорош для хостов, если вы все еще работаете в основном с виртуальными машинами/хостами.
в основном в начале 2000-х IT. Никого не обижая, здесь бывают иногда
важные причины для запуска виртуальных машин или даже док-контейнеров, но все они
восходят к унаследованным причинам. На самом деле все больше и больше хостов собираются
стать меньше того, что он автоматизирует. ИМО, если мы не получим параллель
with_items мы могли бы с тем же успехом отказаться от ansible.

Сказав, что я собираюсь думать здесь позитивно и попытаюсь использовать
делегат_то для некоторых облачных сервисов, я имею в виду, что я никогда не пробовал выполнять на 200+
Облачные компоненты, которые мне нужны для этого, я думаю, просто запросите список
и сбросьте его в файл hosts в формате hosts с помощью ansible, затем попробуйте
делегат_то: localhost Я сообщу здесь о своих результатах. Если он работает на
по крайней мере, мы можем сделать запрос на получение документации о том, как обойти
Серийный номер цикла with_item работает таким образом. Мы можем убедиться, что у нас есть ссылка на
их на разделы облачных модулей и разделы для докера.

В понедельник, 12 марта 2018 г., в 18:49, Брайан Кока, [email protected]
написал:

Ansible заботится только о хостах и ​​задачах, учитывая образы, которыми вы являетесь.
создание «хозяев», и внезапно это соответствует обеим парадигмам.


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

Хорошо, поэтому я изменил Playbook ниже, чтобы попробовать несколько вещей.

1-й я попытался установить delegate_facts: True на случай, если это помогло, но, конечно
даже основываясь на документации, я не ожидал, что это сработает.
2-й я установил collect_facts: no и попытался запустить настройку, чтобы уменьшить факт
собирается ни к чему, надеясь, что он решит вообще не подключаться, но
конечно как и ожидалось он все таки пытался подключиться к машине.
3-й Пробовал установить соединение: localhost, но, как ни странно, он все еще хочет
удаленно подключаться к машине для сбора фактов, даже если она знает об этом
будет выполнять игру локально, немного раздражает, но я понимаю логику как
как еще он узнает подробности о хосте, о котором идет речь, не делая
это..

Я, вероятно, могу использовать playbook, чтобы сначала включить машины, а затем позволить
ansible войдите в них и соберите ненужные факты. Это было бы так, что
Я могу заставить host_vars работать, а затем удалить машины. Я хотел бы знать
если у кого-то есть лучшее решение здесь, так как это также занимает много времени
усилие, когда у меня есть сотня или более машин, и я должен привести их в действие
все только для того, чтобы потом их удалить.

До сих пор я рассматриваю это как решение вместо параллели с with_items.
решение как имеющее потенциал, но рассматриваемые машины все еще должны быть
и доступны, если вам нужны какие-либо факты из azure_rm.py, пока вы
сделайте это, чтобы там было хотя бы одно предостережение. Это если кто не знает
как получить доступ к host_vars из лазури, которые передаются через стандарт в
когда collect_facts: нет

На самом деле у меня, конечно, такая же проблема, когда я запускаю все это с помощью
with_items list, однако я надеялся избежать этого обходного пути, если я
собирается использовать хосты снова. Обходной путь заключается в сбросе azure_rm.py в
json в командной строке, а затем загрузить в переменную, чтобы получить
доступ к ним снова.

Если я с нетерпением жду своей конечной цели изменить сотни или даже тысячи
бессерверных компонентов параллельно, возможно, это будет нормально, как я могу
используйте такие вещи, как azure_rm_functionapp_facts
http://docs.ansible.com/ansible/latest/azure_rm_functionapp_facts_module.html
к
собирать факты о них и использовать их в пьесе в теории, хотя это
еще предстоит протестировать.

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

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


  • хосты: "{{ DeploymentGroup }}"
    собрать_факты: нет
    задачи:

    • настраивать:

      collect_subset=!все,!минимум

    • имя: удалить vm и все связанные ресурсы

      azure_rm_virtualmachine:

      resource_group: "{{ host_vars[inventory_hostname]['resource_group']

      }}"

      имя: "{{ inventory_hostname }}"

      состояние: отсутствует

      делегат_к: локальный

      делегат_факты: Истина


Вс, 18 марта 2018 г., 12:04, Исаак Эгглстоун <
[email protected]> написал:

Итак, отключение сбора фактов устраняет эту проблему, однако вызывает
другой, host_vars больше не содержит динамическую инвентаризацию Azure из
стандартный в.

Итак, resource_group: "{{ host_vars[item]['resource_group'] }}"
не работает в приведенном выше и должен быть жестко запрограммирован для группы ресурсов
имя.

Вс, 18 марта 2018 г., 11:14, Исаак Эгглстоун <
[email protected]> написал:

Пока что я создал небольшой тест для delegate_to: 127.0.0.1 для
задачи удаления, так как это также боль в массовом масштабе.

Моя игровая книга выглядит так:

  • хосты: "{{ DeploymentGroup }}"

    задачи:

    • имя: удалить vm и все связанные ресурсы
      azure_rm_virtualmachine:
      resource_group: "{{ host_vars[item]['resource_group'] }}"
      имя: "{{ inventory_hostname }}"
      состояние: отсутствует

    делегат_к: 127.0.0.1


К сожалению, он все еще пытается подключиться к машинам, указанным в hosts.
для выполнения задачи Azure azure_rm_virtualmachine.
Я делаю это правильно? Кажется, я что-то упускаю, но я пытался
это раньше по-разному, поэтому просто хочу знать, что вы можете
сделай это.

Это вообще работает? Надеюсь, это просто какая-то проблема с синтаксисом.

В понедельник, 12 марта 2018 г., в 19:55, Исаак Эгглстоун <
[email protected]> написал:

Ansible — это инструмент управления конфигурацией для многих других вещей,
сетевых устройств, как реальных, так и виртуальных, для огромного количества облачных
службы, такие как базы данных, веб-службы, такие как eleastic beanstalk, lambda
и все компоненты, которые применяются к нему, такие как компоненты безопасности IAM, в то время как
Ansible хорош для хостов, если вы все еще работаете в основном с виртуальными машинами/хостами.
в основном в начале 2000-х IT. Никого не обижая, здесь бывают иногда
важные причины для запуска виртуальных машин или даже док-контейнеров, но все они
восходят к унаследованным причинам. На самом деле все больше и больше хостов собираются
стать меньше того, что он автоматизирует. ИМО, если мы не получим параллель
with_items мы могли бы с тем же успехом отказаться от ansible.

Сказав, что я собираюсь думать здесь позитивно и попытаюсь использовать
делегат_то для некоторых облачных сервисов, я имею в виду, что я никогда не пробовал выполнять на 200+
Облачные компоненты, которые мне нужны для этого, я думаю, просто запросите список
и сбросьте его в файл hosts в формате hosts с помощью ansible, затем попробуйте
делегат_то: localhost Я сообщу здесь о своих результатах. Если он работает на
по крайней мере, мы можем сделать запрос на получение документации о том, как обойти
Серийный номер цикла with_item работает таким образом. Мы можем убедиться, что у нас есть ссылка на
их на разделы облачных модулей и разделы для докера.

В понедельник, 12 марта 2018 г., в 18:49, Брайан Кока, [email protected]
написал:

Ansible заботится только о хостах и ​​задачах, учитывая образы, которыми вы являетесь.
создание «хозяев», и внезапно это соответствует обеим парадигмам.


Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

У меня также есть вариант использования вилок, что значительно облегчит задачу. Playbook развертывает кучу экземпляров openstack через terraform со случайно выбранными плавающими ips. Затем я перебираю ips, чтобы проверить, открыт ли порт 22 на каждом созданном хосте. Текущий способ сделать это с многопользовательской игрой:

- hosts: localhost
  connection: local
  gather_facts: no
  tasks:
...
  - name: Run terraform
    terraform:
      plan_file: '{{tf_plan | default(omit)}}'
      project_path: '{{terraform_path}}/{{infra}}'
      state: '{{state}}'
      state_file: '{{stat_tfstate.stat.exists | ternary(stat_tfstate.stat.path, omit)}}'
      variables: '{{terraform_vars | default(omit)}}'
    register: tf_output

  - name: Add new hosts
    with_items: '{{tf_output.outputs.ip.value}}' # configued this in terraform to output a list of assigned ips.
    add_host:
      name: '{{item}}'
      groups: new_hosts

- hosts: new_hosts
  gather_facts: no
  connection: local
  tasks:
   - name: Wait for port 22 to become available
     wait_for:
       host: '{{ansible_host}}'
       port: 22
       state: started
       timeout: 60

Это запускается с помощью: ansible-playbook -i localhost, deploy-test-clients.yml --extra-vars="infra=terraform_os_instances state=present"
Это, конечно, ограниченный обходной путь, поскольку у вас не всегда есть список IP-адресов, с которым можно работать.

Поскольку многие люди, кажется, борются с производительностью файлов шаблонов локально, возможно, вместо этого можно было бы создать специальный модуль template_local для решения этой конкретной проблемы. По крайней мере, это было бы началом... Я бы и сам попробовал, но в обозримом будущем у меня не будет времени.

30+ минут на создание шаблона 100 файлов, которые можно сделать за 5 секунд с помощью jinja, — это смешно.

Создание шаблонов @saplla всегда происходит локально, единственное, что происходит удаленно, — это копирование шаблона и настройка разрешений.

Просто чтобы уточнить, я говорю о тех пользователях, которые хотят создавать файлы шаблонов как локальные задачи, например, для передачи в другие системы сборки или, в моем случае, для развертывания ресурсов k8s с помощью kubectl.

Я имею в виду разгрузку циклов и шаблонов в jinja через модуль, который представляет собой простую оболочку. Модуль может взять некоторый контекст и определение цикла (то, что обычно помещается в with_nested и др.) и просто полностью вырезать ansible для этой задачи (возможно, обертка может запускать jinja параллельно, если это ускоряет работу) .

Его можно вызвать так:

    template_parallel:
      src: "{{ item[0] }}"
      dest: "{{ tempdir }}/{{ item[1] }}-{{ item[0] | basename }}"
      context: "{{ hostvars[inventory_hostname] }}"
      nested:
      - "{{ templates.stdout_lines }}"
      - "{{ namespaces.stdout_lines }}"

В приведенном выше примере в качестве контекста используются все переменные, определенные ansible, но можно передать любой dict.

Как я уже сказал, у меня нет времени работать над этим прямо сейчас, но кажется ли этот подход осуществимым @bcoca ?

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

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

Кроме того, шаблоны уже параллельны по узлам, а не по элементам.

Хорошо, спасибо за мысли. На самом деле этого было бы достаточно для моего варианта использования, и похоже, что это может быть и для некоторых других людей в этой теме. Я просто использую ansible для локальной загрузки иерархических конфигураций и файлов шаблонов, прежде чем вызывать какой-либо двоичный файл, который их развертывает (kubectl, helm и т. д.). Я был бы счастлив с очень простым и легким модулем шаблонов, если бы он был настолько производительным, что сокращал время шаблонов с минут до секунд.

Я постараюсь взглянуть на это, когда это станет для нас проблемой, если кто-то не опередит меня.

Первоначально я подал # 10695, но, видя, что это займет некоторое время, я в конечном итоге рассмотрел эти варианты использования с помощью сценариев оболочки (например, просто скажите, что мне нужно что-то сделать с 50 репозиториями Git на одном хосте, я использую Ansible запустить один скрипт один раз, который делает это 50 раз). К сожалению, это означает отказ от некоторых вещей, которые вы получаете бесплатно с Ansible, таких как очень детализированные отчеты об изменениях, и вам также придется самостоятельно реализовать всю логику «запускать, только если» и быть очень осторожным с обработкой ошибок, но это вероятно, на два порядка быстрее. Таким образом, даже если в будущем мы получим «параллельный» вариант, он может быть не таким быстрым, как мои пользовательские сценарии, и я, вероятно, не буду переключаться на него.

@wincent параллельный цикл, вероятно, всегда будет медленнее, чем сценарий оболочки / специальная программа, поскольку Ansible делает гораздо больше, чем просто «применяет действие».

@bcoca : да, это подтверждает мое понимание.

@saplla k8s_raw лучше, чем использование шаблона для этого, вы можете встроить yaml в свой инвентарь, если это необходимо :) (это не предмет этого PR)
каково текущее состояние по этому поводу? Можем ли мы ожидать чего-то в 2.6 @bcoca ?
Я управляю тысячами привилегий postgresql в своих кластерах БД, и 25 минут мучительно медленно

@nerzhul Спасибо, но нам от этого не лучше. Слишком много магии. Нам нужен шаблон.

@sapila , вы всегда можете создать цель хоста для каждого шаблона, чтобы максимально распараллелить шаблоны, а затем использовать последующие воспроизведения или делегирование для доставки на соответствующие фактические хосты.

@bcoca немного хакерский :)

совсем нет, это ОЧЕНЬ халтурно, но сегодня работает

закрытие в пользу https://github.com/ansible/proposals/issues/140

Была ли эта страница полезной?
0 / 5 - 0 рейтинги