Ssh 使用Ansible,如何在不丢失左边填充的情况下将私钥写入文本文件?

Ssh 使用Ansible,如何在不丢失左边填充的情况下将私钥写入文本文件?,ssh,ansible,jinja2,Ssh,Ansible,Jinja2,换句话说,我希望Ansible变量中的内容写入配置文件中的特定“列”,而不希望对该内容进行包装 任务: -名称:构建云初始化文件 地方行动: 模块:ansible.builtin.template src:cloud_config.j2 目标:./cloud\u config.yml 模式:0640 标签:['containers','containers:configuration'] 位于vault文件中的变量: machineuser\u键:| -----开始OPENSSH私钥-----

换句话说,我希望Ansible变量中的内容写入配置文件中的特定“列”,而不希望对该内容进行包装

任务:

-名称:构建云初始化文件
地方行动:
模块:ansible.builtin.template
src:cloud_config.j2
目标:./cloud\u config.yml
模式:0640
标签:['containers','containers:configuration']
位于vault文件中的变量:

machineuser\u键:|
-----开始OPENSSH私钥-----
B3BLBNNZAC1RZXKTDJEAAABG5VBMUAAAAAAEBM9UZQAAAABAABALWAAAZC2GTCN
...
模板:

write\u文件:
{#ssh config以允许部署用户获取Ansible repo}
{#见https://docs.github.com/en/developers/overview/managing-deploy-keys#machine-用户#}
-路径:/home/{gcp\u deploy\u user}}/.ssh/{{gcp\u deploy\u user}}}\u github\u rsa
权限:600
所有者:{{gcp_部署_用户}
内容:|
{{machineuser_key}
该模板任务的输出:

write\u文件:
-路径:/home/omegasphinx/.ssh/omegasphinx\u github\u rsa
权限:600
所有者:omegasphinx
内容:|
-----开始OPENSSH私钥-----
B3BLBNNZAC1RZXKTDJEAAABG5VBMUAAAAAAEBM9UZQAAAABAABALWAAAZC2GTCN
...
我知道当人们想要编写配置文件时,
blockinfle
是一个推荐的模块,我应该使用。但是当我做这些事情时,它仍然会包装ssh密钥的内容。
blockinfle
任务如下所示:

-name:将ssh私钥添加到云初始化文件
地方行动:
模块:ansible.builtin.blockinfile
路径:cloud_config.yml
模式:0440
插入后面的文字:“#machineuser_ssh_块”
块:| 2
-路径:/home/{gcp\u deploy\u user}}/.ssh/{{gcp\u deploy\u user}}}\u github\u rsa
权限:600
所有者:{{gcp_部署_用户}
内容:|
{{machineuser_key}
标签:['containers','containers:configuration']
.j2
模板如下所示:

write\u文件:
#机器操作员\u ssh\u块
然后,输出如下所示(完全相同):

write\u文件:
-路径:/home/omegasphinx/.ssh/omegasphinx\u github\u rsa
权限:600
所有者:omegasphinx
内容:|
-----开始OPENSSH私钥-----
B3BLBNNZAC1RZXKTDJEAAABG5VBMUAAAAAAEBM9UZQAAAABAABALWAAAZC2GTCN
...
我尝试过的其他事情:

  • 我在编辑器中禁用空格的制表符,然后在
    machineuser_-key
    变量中ssh键的每一行之前添加制表符

  • 文件中说“你可以通过在块的开头加一个加号(+)来手动禁用lstrip_块行为”;因此,我添加了一个块,然后在块内缩进变量:

我对Jinja2中空格的理解:


给你一些我期望发生的事情的背景。Jinja文档的“”部分声明“如果存在单个尾随换行符,则删除该换行符”,但“其他空格(空格、制表符、换行符等)返回时保持不变”。在我的例子中,我有“其他空格”:变量
machineuser_key
每行左边的空格。但很明显,我遗漏了一些东西。

从你的问题中我可以看出,并不是jinja空格控制干扰了你的结果,而是事实上,
machineuser_key
本身嵌入了换行符;许多舵图都有相同的问题,这使您可以利用相同的解决方法:

  • 利用YAML是JSON的超集这一事实
  • 使用将您和YAML块放在同一页上
JSON作为YAML方法
-path:/home/{{gcp\u deploy\u user}}/.ssh/{{gcp\u deploy\u user}}}\u github\u rsa
权限:600
所有者:{{gcp_部署_用户}
内容:{{machineuser_key}to_json}
导致

所有者:gcpawesomeuser
内容:“----开始OPENSSH私钥------\nb3blbnzac1rzxktdjaaaaababg5vbmuaaaaebm9uzqaaaaaabaablawaaadzc2gtcn\nETC等\n”
使用缩进过滤器
-path:/home/{{gcp\u deploy\u user}}/.ssh/{{gcp\u deploy\u user}}}\u github\u rsa
权限:600
所有者:{{gcp_部署_用户}
内容:|
{{machineuser|u key | indent(2)}
#(2)匹配“内容”下胡子开始的空格数
制作:

所有者:gcpawesomeuser
内容:|
-----开始OPENSSH私钥-----
B3BLBNNZAC1RZXKTDJEAAABG5VBMUAAAAAAEBM9UZQAAAABAABALWAAAZC2GTCN
等等等等等等

从你的问题中我可以看出,不是jinja空格控制干扰了你的结果,而是
machineuser_key
本身嵌入了换行符;许多舵图都有相同的问题,这使您可以利用相同的解决方法:

  • 利用YAML是JSON的超集这一事实
  • 使用将您和YAML块放在同一页上
JSON作为YAML方法
-path:/home/{{gcp\u deploy\u user}}/.ssh/{{gcp\u deploy\u user}}}\u github\u rsa
权限:600
所有者:{{gcp_部署_用户}
内容:{{machineuser_key}to_json}
导致

所有者:gcpawesomeuser
内容:“----开始OPENSSH私钥------\nb3blbnzac1rzxktdjaaaaababg5vbmuaaaaebm9uzqaaaaaabaablawaaadzc2gtcn\nETC等\n”
使用缩进过滤器
-path:/home/{{gcp\u deploy\u user}}/.ssh/{{gcp\u deploy\u user}}}\u github\u rsa
权限:600
所有者:{{gcp_部署_用户}
内容:|
{{machineuser|u key | indent(2)}
#与(2)马
  {%+ if machineuser_key is defined %}
    {{ machineuser_key }} 
  {% endif %}