我的本地计算机上有一个文件,我想上传到远程服务器,它包含我不想在我的 VCS 中公开的机密信息。它还有一些我需要在其中动态替换的文本(目前作为 Jinja2 占位符“{{}}”)。
如果我使用复制模块,那么当我上传文件时,文件是未保存的,但显然占位符已被替换。
如果我使用模板模块,那么它不会取消保管文件,因此它会以其加密格式上传(并且也不会替换占位符,因为它们被加密混淆了)。
如何将文件(使用 ansible)模板化和取消保管到远程服务器?
我的本地计算机上有一个文件,我想上传到远程服务器,它包含我不想在我的 VCS 中公开的机密信息。它还有一些我需要在其中动态替换的文本(目前作为 Jinja2 占位符“{{}}”)。
如果我使用复制模块,那么当我上传文件时,文件是未保存的,但显然占位符已被替换。
如果我使用模板模块,那么它不会取消保管文件,因此它会以其加密格式上传(并且也不会替换占位符,因为它们被加密混淆了)。
如何将文件(使用 ansible)模板化和取消保管到远程服务器?
正如评论中已经提到的,您可以将您的秘密设置在变量中并在配置期间将它们呈现到模板中,但是如果由于某种原因您想将整个模板保密,也有一些解决方法可以做到这一点。
作为一种解决方法,您可以在本地临时解密模板,并在推出后使用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
供重用,例如 as view_encrypted_file_cmd
。
group_vars/all.yml
---
view_encrypted_file_cmd: "ansible-vault --vault-password-file {{ lookup('env', 'ANSIBLE_VAULT_PASSWORD_FILE') }} view"
一种方式:作为模板
您可以将秘密静态文件的内容(例如,私钥)设置为 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
- 这样您就不需要额外的变量。
---
- copy:
dest=/your/dest
content=lookup('pipe', 'VAULT_PASSWORD_FILE=path/to/pass_file ansible-vault view path/to/file.enc')
现在 Ansible 2.4 支持复制模块上的解密选项:http: //docs.ansible.com/ansible/latest/copy_module.html#options
这不应该再使用了,请参阅下面的评论...
在静态文件的情况下,还有另一种类似于fishi 解决方案的可能性。通过使用copy
而不是template
不需要额外的文件。
vars.yml
:存储在保险库加密的vars.yml 中:
encrypted_content: |
foo = {{ bar }}
password = abcabc
...
任务代码:
- name: Save encrypted template
copy:
content: "{{ encrypted_content }}"
dest: /path/to/destination
您还可以将加密的模板代码存储在另一个 YAML 文件中。这很有用,wennvars.yml
不会被加密。例如vars/encrypted.yml
可能是:
encrypted_content: |
foo = {{ bar }}
password = abcabc
...
任务代码:
- name: Read encrypted variable file
include_vars: encrypted.yml
no_log: true
- name: Save encrypted template
copy:
content: "{{ encrypted_content }}"
dest: /path/to/destination
简而言之,使用copy
模块和ansible-vault
.
这是在远程服务器上复制名为hello.vault
to的本地加密文件的完整示例。hello.txt
其内容清晰WORLD
,加密密钥为1234
。
hello.vault
:$ ansible-vault create hello.vault
New Vault password: 1234
Confirm New Vault password: 1234
## Then input your secret and exit the editor ##
WORLD
$ cat hello.vault
$ANSIBLE_VAULT;1.1;AES256
39653932393834613339393036613931393636663638636331323034653036326237373061666139
6434373635373065613135633866333733356532616635640a663739306639326535336637616138
39666462343737653030346463326464333937333161306561333062663164313162376564663262
3533393839633466300a666661303363383265613736376564623465613165656531366331366664
6436
vault.key
如下1234
copy
模块传输库文件以清除文本webserver
(在库存中定义)。ansible webserver -i inventory --vault-password-file=vault.key \
-m copy -a "src=hello.vault dest=hello.txt"
ansible webserver -i inventory -m command -a "cat hello.txt"
WORLD