Ansible:维护 sudoer 列表的最佳实践
Posted
技术标签:
【中文标题】Ansible:维护 sudoer 列表的最佳实践【英文标题】:Ansible: best practice for maintaining list of sudoers 【发布时间】:2016-01-26 08:36:08 【问题描述】:documentation中有一个使用lineinfile
模块编辑/etc/sudoers
的例子。
- lineinfile: "dest=/etc/sudoers state=present regexp='^%wheel' line='%wheel ALL=(ALL) NOPASSWD: ALL'"
感觉有点骇人听闻。
我认为user
模块中有一些东西可以处理这个问题,但似乎没有任何选项。
向/etc/sudoers
添加和删除用户的最佳做法是什么?
【问题讨论】:
【参考方案1】:如果可能的话,我更喜欢使用/etc/sudoers.d/
(这风险更小,更模块化和自我描述),所以这种方法看起来像:
$ cat files/*
%admins ALL=(ALL) NOPASSWD: ALL
$ cat tasks/*
- name: sudoers | Create sudoers.d files
copy:
src: ./
dest: /etc/sudoers.d
owner: root
group: root
mode: ug+rwX,o=
force: yes
使用visudo -cf file_name
预先检查文件。
【讨论】:
您缺少src:
中的文件名。此外,force: yes
是多余的,因为这是默认设置。也许更明确地说明目标是有意义的,因为如果 /etc/sudoers.d
不存在,这会将其创建为文件...
感谢您的来信!实际上,我正在考虑以下内容:文件名没有丢失,语法表示目录的所有内容; force
用于模块动作细节强调,可以省略;如果dest:
是不存在的路径并且src:
是目录(即)dest:
创建路径(目录,而不是文件)。
好的,./
看起来像是一个疏忽。在您的文件目录中有一个子目录 - 这样您就可以使用 - 比如说 - src: sudoers.d
- 可以说会使这种模式更加明显。【参考方案2】:
该行实际上并未将用户添加到 sudoers,只是确保 wheel
组可以对所有命令使用无密码 sudo。
至于将用户添加到/etc/sudoers
,最好将用户添加到必要的组,然后为这些组提供对 sudo 的相关访问权限。当您不使用 Ansible 时也是如此。
user module 允许您指定组的独占列表,或简单地将指定的组附加到用户已经拥有的当前组。这自然是幂等的,因为不能将用户多次定义为组中。
一个示例游戏可能如下所示:
- hosts: all
vars:
sudoers:
- user1
- user2
- user3
tasks:
- name: Make sure we have a 'wheel' group
group:
name: wheel
state: present
- name: Allow 'wheel' group to have passwordless sudo
lineinfile:
dest: /etc/sudoers
state: present
regexp: '^%wheel'
line: '%wheel ALL=(ALL) NOPASSWD: ALL'
validate: visudo -cf %s
- name: Add sudoers users to wheel group
user:
name: " item "
groups: wheel
append: yes
with_items: " sudoers "
【讨论】:
validate: visudo -cf %s
作为lineinfile
任务的一个属性将确保您不会搞砸,首先通过验证命令运行它。
请注意validate
命令可能需要visudo
的完整路径才能工作。
这种方法的问题是你必须 a) 确保你已经有轮组并且已经在 sudoers 中启用,并且 b) 确保你想把用户放到***中组,而不是其他人。如果您希望用户成为 NOPASSWD,但限制他们的命令怎么办?当您需要在末尾插入一行但 not 时,lineinfile 模块会变得更加棘手。 (因为在末尾插入它会破坏 #includedir 语句,该语句必须在最后一行。)
顺便说一句。如果您想知道,validate
中的%s
是什么意思,它是应该修改的文件的目标(dest)或路径。这是documentation。
很好的答案。稍微不同的方法是使用copy
模块而不是lineinfile
模块将sudoers 文件从控制节点复制到每个受管节点。使用 copy 与 lineinfile 模块各有利弊。我倾向于喜欢复制模块在控制节点上有一个单一的标准化文件,以确保每个受管节点使用相同的确切文件。但是,当然,使用复制也有可能的缺点。这里只是思考的食物。以上是关于Ansible:维护 sudoer 列表的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
《Ansible自动化运维:技术与最佳实践》图书已上架,欢迎大家阅读