Как разрешить ansible запускать sudo только один раз для нескольких задач, требующих sudo?

#ansible #sudo

#ansible #sudo

Вопрос:

Когда ansible запускает несколько задач от имени root (become: да, become_method: sudo), я обнаружил, что он запускает каждую задачу в отдельных сеансах:

 john.doe    481901  481809  0 19:44 pts/0    00:00:00 /bin/sh -c sudo -H -S  -p "[sudo via ansible, key=blabla1] password:" -u root /bin/sh -c 'echo BECOME-SUCCESS-blabla1 ; /usr/bin/python3 /home/john.doe/.ansible/tmp/ansible-tmp-1609789454.667826-84063-275493394187528/AnsiballZ_command.py' amp;amp; sleep 0

john.doe    481937  481809  0 19:44 pts/0    00:00:00 /bin/sh -c sudo -H -S  -p "[sudo via ansible, key=blabla2] password:" -u root /bin/sh -c 'echo BECOME-SUCCESS-blabla2 ; /usr/bin/python3 /home/john.doe/.ansible/tmp/ansible-tmp-1609789496.208312-84094-182235695212206/AnsiballZ_command.py' amp;amp; sleep 0
 

и в результате этого он не использует кэш sudo
(/var/run/sudo/ts/john.doe ), но для аутентификации каждый раз. Это
не проблема, если вы используете аутентификацию по паролю только потому, что вы
указываете пароль один раз --ask-become-pass , однако, когда я
использовал Duo Mobile в качестве второго фактора для аутентификации, он нажимает каждый
раз, когда аутентифицируется sudo. Итак, если у вас несколько хостов и несколько задач, вам нужно постоянно отвечать на нажатие, и когда нажатие задерживается при «атаке отказа», запуск ansible завершится неудачей.

Мои вопросы:

  1. Есть ли способ разрешить ansible запускать sudo один раз, а затем запускать несколько задач? Используя приведенный выше пример, он может и должен запускать каждый из AnsiballZ_command.py файлов после одной проверки подлинности sudo.
  2. Есть ли другой способ предотвратить подкачку Duo Mobile?

Комментарии:

1. Используйте duo mobile для подключения к компьютеру внутри вашей сети, откуда вы будете запускать свои скрипты ansible, не требующие авторизации второго фактора. Иначе вам нужен способ обойти эту вторую аутентификацию (как это делается, например, в gitlab, google-api …. с помощью токена).

2. @Zeitounator Требование состоит в том, чтобы использовать вторую аутентификацию для sudo независимо от того, приходит пользователь изнутри или снаружи, я просто не хочу использовать аутентификацию для каждой задачи.

3. Давайте предположим, что мы можем достичь этого (что, я почти уверен, невозможно ….) и что теперь вы можете запланировать запуск своего скрипта в tower / awx на 4 часа утра. Вы все равно получите хотя бы один толчок. И ваша автоматизация исчезает. (если вы не хотите нажимать на свой телефон посреди ночи)

Ответ №1:

Ответа на вопрос нет. Существуют три обходных пути::

  1. В начале задачи ansible отключите пароль sudo:
 perl -i -pe 's/(?<=s)PASSWD/NOPASSWD/' /etc/sudoers.d/$(who am i | sed "s/./-/; s/ .*//")
 

и в конце включил его (поменяйте местами PASSWD и NOPASSWD в приведенном выше коде).

  1. В начале запуска отключите проверку подлинности Duo в консоли duo (вручную или с помощью вызова API), а в конце снова включите ее.
  2. Настройте пользователя ansible без проверки подлинности Duo, но это менее безопасно по сравнению с # 2, но все же обходной путь, если ваши требования безопасности позволяют это.

PS: Вы можете использовать ssh-ключи для аутентификации sudo, см. Эту ссылку.