Я использую Ansible 2.2, но могу обновить, если это поможет.
Я видел это и был довольно взволнован, но этого, похоже, нет в этой (или любой другой) версии документации Ansible.
Проблема, которую я пытаюсь решить, состоит в том, что у меня есть 1000 пользователей, которыми я должен управлять на коробке Centos.
Это занимает много времени, чтобы запустить эту задачу поочередно. И что еще более раздражает, все выглядит как измененное, потому что команда «expires» в пользовательском модуле всегда помечает вещь как измененную.
это также выглядело многообещающе, но для выполнения каждой команды в цикле with_items требовалось одинаковое количество времени, и оно не шло быстрее (я никогда не удосужился ждать достаточно долго, чтобы дойти до конца).
Пропуск задач теперь выполняется быстро (намного быстрее, чем в Ansible 2.0), если я не могу понять, как заставить эту работу работать параллельно, думаю, я вернусь и выясню, как пропустить бессмысленные задачи, и если все иначе не получится, я напишу свой собственный модуль. Но похоже, что я должен быть в состоянии сделать все это быстрее в Ansible.
Это то, что я хочу запустить параллельно, host_authorizations
это список имен пользователей и других данных.
- name: Create/modify OS user accounts
user: name={{ item.username }} group=sshusers shell=/bin/bash home="/home/selinux-modules/{{ item.username }}" state=present expires={{item.expiredate|default(omit)}}
with_items: "{{ host_authorizations }}"
tags: full_maintenance
Ответы:
Как упомянул @webKnja, это возможно в
async
режиме. Я недавно обнаружил это сам и узнал, что вы можете использовать его тремя различными способами в зависимости от ваших потребностей.Выполните и опрашивайте результаты, обратите внимание
poll:5
, это будет опрашивать результаты каждые 5 секунд. Вы можете сэкономить время с этим методом.Запустите и забудьте
poll: 0
, это очень быстрый вариант, так как Ansible просто снимает эти задачи. Стороной вниз в том , что мы не знаем , каков был результат задачи , т.е.changed: True/False
. Конечно, это обратная сторона, если вы заботитесь о обратной связи;).Запустите и забудьте
async_status
, синтаксис для задачи такой же, как в примере 2, для кого это потребует дополнительной задачиasync_status
. Это мой фаворит, так как он относительно быстрый (быстрее, чем обычный цикл илиexecute and poll
) и позволяет вам фиксировать обратную связь, хотя вам придется иметь дело с новымregister
для васasync_task
.retries: 20
- сколько попыток до провала.delay: 2
- сколько секунд ждать между опросами.Предостережение , в зависимости от задачи, которую вы можете не использовать
async
. У меня были примеры, когда я взаимодействовал с системой, которая не могла обрабатывать несколько запросов на один и тот же ресурс. Я нашелasync
вариант лучше всего работать, если мне нужно выполнить одну и ту же задачу на нескольких хостах. Вот где я смог «сэкономить» больше всего времени.Поскольку вы разместили ссылку на документацию Ansible в вопросе, я не собираюсь этого делать.
источник
poll
значение на 0 в примере 3. Это удивительное объяснение !! Thnx.async_status
требуетсяjid
, а неid
.Чтобы ответить на ваш вопрос: Нет, на данный момент Ansible не может выполнять циклы параллельно.
Я бы использовал
newusers
вместо этого, что сделано для массового создания пользователей. Создайте файл со всеми пользователями в нем, скопируйте его к хозяину, и запуститьnewusers /path/to/user/list
вcommand
задаче.источник
Этого можно добиться, используя
async
режим. Пожалуйста, найдите некоторые ссылки для того, как сделать это ниже.Refs:
источник