Ansible URI模块中Jinja2模板无法正常工作的问题求助
解决Ansible URI模块动态生成JSON API调用报错的问题
你遇到的问题核心是手动拼接JSON时产生了无效语法(末尾多余逗号),ArtifactHub的API解析器对JSON语法的严格性要求比静态案例更高(静态案例里的末尾逗号可能被API宽容处理,但动态生成的同样语法触发了校验)。
当用Jinja2循环生成users数组元素时,每个元素后都添加了逗号(包括最后一个元素),导致生成的policy_data字符串是带有末尾逗号的无效JSON,最终触发API返回invalid policy data错误。
方案1:修正Jinja2循环,避免末尾逗号
利用Jinja2的loop.last变量判断是否为最后一个元素,仅在非最后元素后添加逗号:
内联模板写法
body_format: json body: authorization_enabled: true predefined_policy: "rbac.v1" policy_data: | { "roles": { "admin": { "users": [ {% for item in admins %} "{{ item }}"{% if not loop.last %},{% endif %} {% endfor %} ], "allowed_actions": [ "addOrganizationMember", "addOrganizationRepository", "deleteOrganizationMember", "deleteOrganizationRepository", "updateAuthorizationPolicy", "updateOrganizationRepository" ] }, "owner": { "users": [ "myuser" ] } } }
外部模板文件写法(policy.json.j2)
{ "roles": { "admin": { "users": [ {% for item in admins %} "{{ item }}"{% if not loop.last %},{% endif %} {% endfor %} ], "allowed_actions": [ "addOrganizationMember", "addOrganizationRepository", "deleteOrganizationMember", "deleteOrganizationRepository", "updateAuthorizationPolicy", "updateOrganizationRepository" ] }, "owner": { "users": [ "myuser" ] } } }
方案2:完全避免手动拼接JSON(推荐)
利用Ansible的YAML转JSON能力,直接用YAML结构定义policy_data,让Ansible自动处理JSON序列化,彻底规避手动拼接的语法错误:
body_format: json body: authorization_enabled: true predefined_policy: "rbac.v1" policy_data: roles: admin: users: "{{ admins }}" allowed_actions: - addOrganizationMember - addOrganizationRepository - deleteOrganizationMember - deleteOrganizationRepository - updateAuthorizationPolicy - updateOrganizationRepository owner: users: - myuser
这种方式无需手动编写任何JSON语法,动态变量直接通过YAML引用,Ansible会自动将整个body结构序列化为标准JSON字符串,完全符合API的语法要求。
内容的提问来源于stack exchange,提问作者azer
相关产品推荐
相关产品推荐

