我有一个 Ansible 剧本,用于在我们的环境中管理我们的 sudoers 文件。我们喜欢在 /etc/sudoers 中保留一个最小的 sudoers 文件,然后我们想要添加的任何内容都放在 /etc/sudoers.d 下的单独文件中。
我的 Ansible playbook 包含以下用于推送这些文件的任务:
- name: copy sudoers files
copy:
src: "{{ item }}"
dest: "/etc/sudoers.d/{{ item }}"
backup: yes
owner: root
group: root
mode: 0440
validate: /usr/sbin/visudo -cf %s
with_items:
- admins
- apache
- monitor
该任务包含一个 validate 子句,用于在提交文件之前确保文件有效,这通常运行良好。但是,今天我遇到了一个更新破坏 sudo 的问题。该文件通过了验证步骤,但包含一个与主 /etc/sudoers 文件中的 User_Alias 同名的 User_Alias。此后任何尝试运行 sudo 都会导致解析错误。
我的问题是——如何测试来自 Ansible 的 sudoers 文件的更新,以捕获这样的错误?文件到位后,可以通过运行来捕获错误visudo -c
,但是将其作为验证步骤不起作用。Ansible 需要%s
占位符,即使不需要,也会在将文件复制到位之前完成验证,这样visudo -c
就不会捕获它。
你有没有试过这个:
这个对我有用。
我让它工作了。这就是我所做的。首先,我添加了一组 Ansible 任务以在 /etc/sudoers.stage.d 处创建一个暂存目录并将 /etc/sudoers.d 的内容复制到其中。然后,我将文件上传到此暂存区域,如果其中任何一个发生更改,请运行自定义脚本来激活它们。
这就是剧本中的逻辑现在的样子
这就是 activate_sudoers.sh 脚本的样子。
它比我希望的要长和复杂一些,但它完成了工作。希望这对遇到同样问题的其他人有用。
只对 Ansible 模块做同样的事情。