【问题标题】:Ansible: best practice for maintaining list of sudoersAnsible:维护 sudoer 列表的最佳实践
【发布时间】: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 添加和删除用户的最佳做法是什么?

【问题讨论】:

    标签: python unix ansible user-management


    【解决方案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 模块各有利弊。我倾向于喜欢复制模块在控制节点上有一个单一的标准化文件,以确保每个受管节点使用相同的确切文件。但是,当然,使用复制也有可能的缺点。这里只是思考的食物。
    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 2017-12-22
    • 2010-09-25
    • 1970-01-01
    • 2023-03-12
    • 2017-12-09
    • 2011-08-04
    相关资源
    最近更新 更多