Ansible任务中用Jinja2循环生成filters列表报错求助
解决Ansible动态生成fortios_webfilter_profile的filters列表报错问题
错误原因
你使用YAML块标符|生成filters内容,导致Jinja2循环输出的是字符串类型,但fortios_webfilter_profile模块要求filters是列表(数组)结构,模块无法将字符串解析为字典/列表,因此抛出"msg": "dictionary requested, could not parse JSON or key=value"错误。
正确写法
直接在YAML结构中用Jinja2循环生成列表,保持原生数据类型,不需要块字符串:
方案1:原生Jinja2循环
vars: category_info: 1: block 2: block tasks: - fortios_webfilter_profile: state: "present" webfilter_profile: name: "default" ftgd_wf: filters: {% for category_id, category_action in category_info.items() %} - id: {{ category_id }} action: {{ category_action }} {% endfor %}
方案2:列表推导式(更简洁)
借助community.general集合的dict_kv过滤器,一键转换键值对为目标字典结构:
vars: category_info: 1: block 2: block tasks: - fortios_webfilter_profile: state: "present" webfilter_profile: name: "default" ftgd_wf: filters: "{{ category_info.items() | map('community.general.dict_kv', 'id', 'action') | list }}"
注意:使用此方案前需确保已安装
community.general集合,执行命令安装:ansible-galaxy collection install community.general
注意事项
- 严格保持Jinja2循环的缩进与YAML结构一致,避免缩进错误导致YAML解析失败
- 生成结构化数据(列表/字典)时,禁止使用块字符串
|,必须直接在YAML中构建数据类型 - 如果使用方案2,需确认目标环境已安装对应Ansible集合
内容的提问来源于stack exchange,提问作者dandu
相关产品推荐
相关产品推荐

