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

使用YAML模板创建AAP凭据:如何避免Jinja2损坏SSH私钥

解决Jinja2渲染时破坏SSH私钥格式的问题

问题原因

私钥格式损坏是因为YAML解析器默认会对多行字符串进行折叠处理:把换行符转换成空格、自动调整缩进,而SSH私钥依赖严格的换行和格式才能正常使用。加上模板中使用的{% filter from_yaml %}触发YAML解析,进一步篡改了私钥的原始格式。

解决方案

方法1:用YAML块字面量强制保留私钥格式

修改vars/Credentials.yml.j2模板,给ssh_key_data添加YAML的|块字面量标记,强制保留私钥的所有换行和原始结构:

################################################################
# credential_type: Source Control
################################################################
vars_credentials:
  all:
  - name: 'CRED_GIT_myuser'
    description: 'Git-User myuser at Git-Projekt'
    credential_type: Source Control
    organization: myorg
    state: 'present'
    inputs:
      ssh_key_data: |
        {{ lookup("file", "ssh/id_rsa_myuser") }}
      ssh_key_unlock: 'AxxxxxxZ'
################################################################

然后修改Playbook中的set_fact任务,移除模板内的from_yaml过滤器,改为在lookup后直接用from_yaml解析:

- name: "read vars/Credentials.yml.j2 as template"
  ansible.builtin.set_fact:
    Q: "{{ lookup('template', 'vars/Credentials.yml.j2') | from_yaml }}"

- name: "Show all from vars_credentials at vars/Credentials.yml.j2"
  debug:
    msg: "{{ q }}"
  loop: "{{ Q.vars_credentials.all | list }}"
  loop_control:
    loop_var: q

方法2:直接用raw过滤器保护私钥格式

如果不想调整模板结构,也可以在读取私钥时添加raw过滤器,避免Jinja2处理字符串格式:

将模板中的ssh_key_data行改为:

ssh_key_data: '{{ lookup("file", "ssh/id_rsa_myuser") | raw }}'

这种方法优先级低于方法1,因为YAML单引号字符串仍可能对特殊字符做隐性处理,推荐优先使用块字面量方案。

验证

执行Playbook后查看debug输出的ssh_key_data,内容应与本地ssh/id_rsa_myuser文件完全一致,包含正确的换行和格式,此时私钥即可正常用于AWX凭据创建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:49:51