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

