对于需要 sudo 的多个任务,如何让 ansible 只执行一次 运行 sudo?

How to let ansible to run sudo only once for multiple tasks requiring sudo?

当 ansible 运行s 多个任务作为 root 时(变成:是的,become_method:sudo),我发现它 运行s 每个任务在单独的会话中:

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' && 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' && 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. 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. 设置一个没有Duo身份验证的ansible用户,但是这个比较少 与 #2 相比安全,但如果您的安全性仍然是一种解决方法 要求允许。

PS:您可以使用 ssh 密钥对 sudo 进行身份验证,请参阅 this link