如何用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
相关产品推荐
相关产品推荐

