AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 901491
Accepted
virtex
virtex
Asked: 2018-03-14 10:57:33 +0800 CST2018-03-14 10:57:33 +0800 CST 2018-03-14 10:57:33 +0800 CST

使用 Ansible 检查 sudoers.d 文件

  • 772

我有一个 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就不会捕获它。

linux
  • 3 3 个回答
  • 12925 Views

3 个回答

  • Voted
  1. SAM
    2018-08-17T11:30:38+08:002018-08-17T11:30:38+08:00

    你有没有试过这个:

    - copy:
        src: '{{ item }}'
        dest: '/etc/sudoers.d/{{ item }}'
        owner: root
        group: root
        mode: 0440
        validate: 'bash -c "cat /etc/sudoers %s | visudo -cf-"'
    

    这个对我有用。

    • 8
  2. Best Answer
    virtex
    2018-03-16T12:09:40+08:002018-03-16T12:09:40+08:00

    我让它工作了。这就是我所做的。首先,我添加了一组 Ansible 任务以在 /etc/sudoers.stage.d 处创建一个暂存目录并将 /etc/sudoers.d 的内容复制到其中。然后,我将文件上传到此暂存区域,如果其中任何一个发生更改,请运行自定义脚本来激活它们。

    这就是剧本中的逻辑现在的样子

    - name: delete staging area
      file:
        path: "/etc/sudoers.stage.d"
        state: absent
      changed_when: false
    
    - name: copy /etc/sudoers.d to staging area
      shell: "cp -rp /etc/sudoers.d /etc/sudoers.stage.d"
      changed_when: false
    
    - name: stage sudoers files
      copy:
        src: "{{item}}"
        dest: "/etc/sudoers.stage.d/{{item}}"
        backup: yes
        owner: root
        group: root
        mode: 0440
        validate: /usr/sbin/visudo -cf %s
      with_items:
        - admins
        - apache
        - monitor
      register: sudoers_d
    
    - block:
      - name: push out activate script
        copy:
          src: activate_sudoers.sh
          dest: /usr/local/bin/activate_sudoers.sh
          owner: root
          group: root
          mode: 0700
    
      - name: activate change
        shell: /bin/sh /usr/local/bin/activate_sudoers.sh /etc/sudoers.stage.d
    
      when: sudoers_d.changed
    

    这就是 activate_sudoers.sh 脚本的样子。

    #!/bin/sh
    
    function usage {
        echo "Usage: $0 <stage directory>" >&2
        exit 1
    }
    
    function abort {
        echo "*** Error detected" >&2
        [ "$#" -gt 0 ] && echo "***" $@ >&2
        exit 1
    }
    
    PATH=/usr/bin:/bin:/usr/sbin:/sbin
    export PATH
    
    test $# -eq 1 || usage
    test -d "$1" || abort "Stage directory $1: missing or not a directory"
    test -d /etc/sudoers.old.d && rm -rf /etc/sudoers.old.d
    test -d /etc/sudoers.old.d && abort "Failed to remove /etc/sudoers.old.d"
    
    mv /etc/sudoers.d /etc/sudoers.old.d \
      && mv "$1" /etc/sudoers.d \
      && visudo -c
    
    if [ $? -eq 0 ]; then
        # Success - clean up
        rm -rf /etc/sudoers.old.d
        exit 0
    else
        # Failure - roll back
        rm -rf /etc/sudoers.d
        mv /etc/sudoers.old.d /etc/sudoers.d
        abort "sudoers update failed"
    fi
    

    它比我希望的要长和复杂一些,但它完成了工作。希望这对遇到同样问题的其他人有用。

    • 2
  3. Júlio Dutra
    2021-04-01T07:49:41+08:002021-04-01T07:49:41+08:00

    只对 Ansible 模块做同样的事情。

    - name: Creating assemble directory
      file:
        path: /etc/sudoers.stage.d
        state: directory
        mode: 0600
    
    - name: Applying sudoers.d files on assemble directory
      template:
        src: "{{ item }}.j2"
        dest: /etc/sudoers.stage.d/{{ item }}
        mode: 0400
      loop:
        - 10-wheel
        - 20-sys
      register: check
    
    - name: Copying original sudoers to the assemble directory
      copy:
        remote_src: yes
        src: /etc/sudoers
        dest: /etc/sudoers.stage.d/99-sudoers
      when: check.changed
    
    - name: Removing include line from 99-sudoers
      lineinfile:
        path: /etc/sudoers.stage.d/99-sudoers
        state: absent
        regex: ^#includedir /etc/sudoers.d
      when: check.changed
    
    - name: Assembling unique config for validation
      assemble:
        src: /etc/sudoers.stage.d
        dest: /etc/sudoers.stage
        mode: 0600
        validate: visudo -cf %s
      when: check.changed
    
    - name: Applying sudoers configurations
      template:
        src: "{{ item }}.j2"
        dest: /etc/sudoers.d/{{ item }}
        mode: 0440
      loop:
        - 10-wheel
        - 20-sys
      when: check.changed
    
    • 1

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve