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

Ansible生成sudoers文件时,如何消除路径列表的方括号与引号?

问题:生成符合要求的sudoers.d文件内容

给定配置

变量字典

sudoers_include:
  sudofile1:
    privileges:
      - name: "%technodrome"
        paths: 
          - "ALL=(ALL) NOPASSWD: ALL"    

Ansible任务

- name: 生成/etc/sudoers.d文件
  template:
    src: sudoers_d_file.j2
    dest: "/etc/sudoers.d/{{ item.key }}"
  loop: "{{ sudoers_include | dict2items }}"

Jinja2模板

{% for item in item.value.privileges | default([]) %}
{{ item.name }} {{ item.paths }}
{% endfor %}

当前生成的文件内容

%technodrome ['ALL=(ALL) NOPASSWD: ALL']

期望的正确内容

%technodrome ALL=(ALL) NOPASSWD: ALL

解决方案

问题根源是paths是列表类型,直接输出会保留Python列表的格式(方括号+引号)。可以通过以下两种方式解决:

方案1:修改Jinja2模板

如果每个权限条目下只有一个路径,直接取列表的第一个元素即可:

{% for priv in item.value.privileges | default([]) %}
{{ priv.name }} {{ priv.paths[0] }}
{% endfor %}

如果需要支持一个权限对应多个路径(每个路径单独一行),可以嵌套遍历:

{% for priv in item.value.privileges | default([]) %}
{% for path in priv.paths %}
{{ priv.name }} {{ path }}
{% endfor %}
{% endfor %}

方案2:调整变量字典结构

如果每个权限本来就只对应单个路径,可将paths从列表改为字符串类型:

sudoers_include:
  sudofile1:
    privileges:
      - name: "%technodrome"
        paths: "ALL=(ALL) NOPASSWD: ALL"    

修改后原模板无需调整,直接输出即可得到正确格式。

内容的提问来源于stack exchange,提问作者johnny bravo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:48:28