首页 > 解决方案 > 对于需要 sudo 的多个任务,如何让 ansible 只运行一次 sudo?

问题描述

当 ansible 以 root 身份运行多个任务时(变成:是,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' && 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 进行身份验证时推送。所以如果你有多个主机,多个任务,你必须不断的响应push,而当push延迟出现“拒绝攻击”时,ansible run就会失败。

我的问题:

  1. 有没有办法让 ansible sudo 一次,然后运行多个任务?使用上面的示例,它可以并且应该AnsiballZ_command.py在单个 sudo 身份验证后运行每个文件。
  2. 还有其他方法可以防止 Duo Mobile 寻呼吗?

标签: ansiblesudo

解决方案


这个问题没有答案。三种解决方法是:

  1. 在 ansible 任务开始时,禁用 sudo 密码:
perl -i -pe 's/(?<=\s)PASSWD/NOPASSWD/' /etc/sudoers.d/$(who am i | sed "s/\./-/; s/ .*//")

最后,启用它(在上面的代码中交换 PASSWD 和 NOPASSWD)。

  1. 在运行开始时,在 duo 控制台(手动或通过 API 调用)禁用 Duo 身份验证,最后重新启用它。
  2. 在没有 Duo 身份验证的情况下设置 ansible 用户,但这与 #2 相比安全性较低,但如果您的安全要求允许,这仍然是一种解决方法。

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


推荐阅读