我的本地计算机上有一个文件,我想上传到远程服务器,它包含我不想在我的 VCS 中公开的 secret 信息。它还有一些我需要在其中动态替换的文本(目前作为 Jinja2 占位符“{{}}”)。
如果我使用复制模块,那么当我上传文件时,文件是未保存的,但显然占位符已被替换。
如果我使用模板模块,那么它不会取消保管文件,因此它会以其加密格式上传(并且也不会替换占位符,因为它们被加密混淆了)。
如何将文件(使用 ansible)模板化和取消保管到远程服务器?
最佳答案
正如评论中已经提到的,您可以在变量中设置您的 secret 并在提供期间将它们呈现到模板中,但如果由于某种原因您想将整个模板保密,也有一些解决方法可以做到这一点。
处理加密模板
作为一种解决方法,您可以在本地临时解密模板,并在推出后使用 local_action
删除解密的文件。模块。
假设您的加密模板位于 template.enc
在你的角色templates
目录。
---
- name: Decrypt template
local_action: "shell {{ view_encrypted_file_cmd }} {{ role_path }}/templates/template.enc > {{ role_path }}/templates/template"
changed_when: False
- name: Deploy template
template:
src=templates/template
dest=/home/user/file
- name: Remove decrypted template
local_action: "file path={{ role_path }}/templates/template state=absent"
changed_when: False
请注意
changed_when: False
.这对于使用您的 ansible 角色运行幂等性测试非常重要 - 否则每次运行 playbook 时都会发出更改信号。在
group_vars/all.yml
您可以设置一个全局解密命令以供重用,例如 view_encrypted_file_cmd
.group_vars/all.yml
---
view_encrypted_file_cmd: "ansible-vault --vault-password-file {{ lookup('env', 'ANSIBLE_VAULT_PASSWORD_FILE') }} view"
处理加密的静态文件
一种方式:作为模板
您可以将 secret 静态文件的内容(例如,私钥)设置为 ansible 中的变量,并将其设置为模板。
变量.yml
---
my_private_key: |
YOUR KEY
asfdlsafkj
asdlkfjasf
模板/private_key.j2
{{ private_key }}
任务/main.yml
---
template:
src=templates/private_key.j2
dest=/home/user/.ssh/id_rsa
vars:
private_key: "{{ my_private_key }}"
另一种方式:通过查找管道
另一种方法是使用
lookup
带有 pipe
的模块设置content
copy
内的属性(property)模块 - 这样您就不需要额外的变量。---
- copy:
dest=/your/dest
content=lookup('pipe', 'VAULT_PASSWORD_FILE=path/to/pass_file ansible-vault view path/to/file.enc')
关于templates - Ansible 取消保管和模板化文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37682928/