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

如何使用Ansible写入私钥到文件且不丢失左侧缩进?

问题根因

你遇到的缩进丢失问题核心来自YAML块语法的解析规则:你用|定义machineuser_key变量时,变量值每一行前的前置缩进是YAML用来识别块内容边界的元信息,不会被当作变量值的一部分存储,所以Ansible读取到的machineuser_key实际只有第一行保留了模板侧的缩进,后续行无前置空格,渲染时自然会出现缩进错乱。你之前尝试的{%+ %}空白控制标签作用对象是Jinja模板自身标记的周边空白,不影响变量内部内容,因此无效。

正确解决方案

方案1:直接在Jinja模板中使用indent过滤器(推荐)

不需要修改变量定义,只需在模板中调用Jinja内置的indent过滤器处理多行变量即可。过滤器第一个参数为需要追加的缩进空格数,第二个参数first设为False表示不对第一行追加缩进(第一行已经被模板里{{ ... }}前的空格完成缩进对齐)。
你的模板修改为:

write_files:
{# ssh config to allow our deployment user to fetch the Ansible repo #}
{# See https://docs.github.com/en/developers/overview/managing-deploy-keys#machine-users #}
- path: /home/{{ gcp_deploy_user }}/.ssh/{{ gcp_deploy_user}}_github_rsa
  permissions: 600
  owner: {{ gcp_deploy_user }}
  content: |
    {{ machineuser_key | indent(4, first=False) }}

这里填4是因为你模板里{{ machineuser_key }}前已经有4个空格,后续行追加4个空格即可保持对齐。

方案2:blockinfile场景下的修改

同样使用indent过滤器,根据你block内{{ machineuser_key }}前的空格数调整缩进参数即可,你的任务配置修改为:

- name: add ssh private key to cloud-init file
  local_action:
    module: ansible.builtin.blockinfile
    path: cloud_config.yml
    mode: 0440
    insertafter: "# machineuser_ssh_block"
    block: |2
      - path: /home/{{ gcp_deploy_user }}/.ssh/{{ gcp_deploy_user}}_github_rsa
        permissions: 600
        owner: {{ gcp_deploy_user }}
        content: |
          {{ machineuser_key | indent(10, first=False) }}
  tags: ['containers', 'containers:configuration']

这里填10是因为block内{{ machineuser_key }}前有10个空格(2个块基础缩进 + 8个层级缩进),你可以根据实际排版需求调整数值。

方案3:修改变量定义避免自动剥除缩进

如果不想用过滤器,可以在块定义时指定缩进级别,明确告知YAML解析器保留对应数量的前置缩进作为变量内容的一部分:

machineuser_key: |4
    -----BEGIN OPENSSH PRIVATE KEY-----
    b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
    ...

|后面的数字4表示保留块内每一行前4个空格作为内容的一部分,这样解析后的变量每一行都会自带4个前置空格,渲染时也会保持缩进。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 13:36:06