我的本地计算机上有一个文件要上传到远程服务器,它包含我不希望在我的VCS中公开的机密信息。它还有一些我需要在其中动态替换的文本(目前为Jinja2占位符" {{}}")。
如果我使用复制模块,那么当我上传文件时文件是非拱形的,但很明显占位符被替换为注释。
如果我使用模板模块,那么它不会对文件进行取消保存,因此会以加密格式上传(并且也不会替换占位符,因为它们会被加密模糊)。
如何将文件(使用ansible)模板和取消保存到远程服务器?
答案 0 :(得分:9)
正如评论中已经提到的,你可以在变量中设置你的秘密,并在提供过程中将它们渲染到模板中,但是如果由于某种原因你想让你的整个模板保密,那么也有一些变通方法可以做到这一点。
作为一种解决方法,您可以在本地临时解密模板,并在转出后使用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"
单向:作为模板
您可以将秘密静态文件(例如私钥)的内容设置为ansible中的变量,并将其设置为模板。
var.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')
答案 1 :(得分:4)
现在Ansible 2.4支持复制模块上的解密选项:http://docs.ansible.com/ansible/latest/copy_module.html#options
答案 2 :(得分:2)
在静态文件的情况下,还有另一种类似于solution by 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文件中。这很有用,wenn vars.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
答案 3 :(得分:0)
简而言之,请使用copy
模块和ansible-vault
。
这是将名为hello.vault
的本地加密文件复制到远程服务器上的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