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

