You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ansible为每个管理员用户生成独立sudo配置文件?

问题:如何为每个管理员用户生成独立的sudo配置文件?

我尝试为每个用户创建sudo配置文件,现有Playbook、变量文件及Jinja模板如下:

现有Playbook

- name:
  hosts: all
  gather_facts: false
  tasks:
    - name:
      template:
        src: sudo.j2
        dest: "/etc/sudoers.d/{{item.name}}"
      loop: "{{userinfo}}"
      when: "'admins' in item.groupname"

变量文件

userinfo:
  - groupname: admins
    name: bill
  - groupname: admins
    name: bob
  - groupname: devs
    name: bea

Jinja模板

{% for item in userinfo %}
{% if item.groupname=="admins" %}
{{item.name}} ALL=ALL NOPASSWD:ALL
{% endif %}
{% endfor %}

当前生成了两个文件(/etc/sudoers.d/bill 和 /etc/sudoers.d/bob),但每个文件都包含两位管理员用户的配置信息:

bill ALL=ALL NOPASSWD:ALL
bob ALL=ALL NOPASSWD:ALL

请问如何实现每个文件仅包含对应用户的配置信息?


解决方案

问题根源是Jinja模板遍历了整个userinfo变量,导致每个生成的文件都写入所有管理员的配置。需要让模板只处理当前循环的单个用户,而非全量遍历。

修改后的Jinja模板(sudo.j2)

移除模板内的循环逻辑,直接使用Ansible循环时传递的当前用户对象item:

{{ item.name }} ALL=ALL NOPASSWD:ALL

优化后的Playbook(可选)

给任务和Playbook添加明确名称,并补充sudoers文件的标准权限配置:

- name: Generate individual sudo configs for admin users
  hosts: all
  gather_facts: false
  tasks:
    - name: Create sudoers file for each admin user
      template:
        src: sudo.j2
        dest: "/etc/sudoers.d/{{item.name}}"
        mode: '0440'  # sudoers目录文件的标准安全权限
      loop: "{{userinfo}}"
      when: "'admins' in item.groupname"

说明

  • Ansible执行loop时,会将当前遍历到的用户对象传递给模板,模板直接调用item即可获取当前用户的信息,无需再遍历全量列表。
  • 添加mode: '0440'是为了符合sudoers文件的权限要求,避免出现安全风险。

修改后,/etc/sudoers.d/bill仅会包含bill ALL=ALL NOPASSWD:ALL,/etc/sudoers.d/bob仅会包含bob ALL=ALL NOPASSWD:ALL,实现每个文件对应单个用户的配置需求。


内容的提问来源于stack exchange,提问作者Ahmed Talal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:50:32