Идея функции
основной
2.1
how:
forks: 1
pause: 0
squash: name
label: "{{item.name}}"
end: on_fail
with_items: ...
документы в текущее состояние по адресу:
http://docs.ansible.com/ansible/playbooks_loops.html#loop — управление
Пожалуйста, давайте не будем называть это 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+ элементам...
+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
, сделать это для каждого пульта?И есть несколько других проблем, о которых я знаю... конечно, есть много, о которых я не узнаю, пока кто-нибудь не попытается реализовать это. У меня есть решения для некоторых, но они довольно быстро начинают выходить из-под контроля.
Разветвление цикла @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 }}"
задачи:
делегат_к: 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 в документации.
Я буду ждать отзывов от тех, кому это небезразлично, на
этот список проблем, чтобы решить мой следующий шаг. Тем временем я воспользуюсь своим хаком, чтобы получить
моя непосредственная работа сделана.
Вс, 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
Самый полезный комментарий
+1 вилки
Я жду, когда модули openstack пройдут циклы
with_
по 100+ элементам...