Templates Ansible取消vault并为文件创建模板
我在本地机器上有一个文件,我想上传到远程服务器,其中包含我不想在VCS中公开的机密信息。它还有一些我需要动态替换的文本(目前作为Jinja2占位符“{}”) 如果使用“复制”模块,则在上载文件时该文件将取消保险存储,但显然占位符已被替换 如果我使用模板模块,那么它不会取消vault文件,因此它将以加密格式上载(也不会替换占位符,因为它们会被加密弄糊涂)Templates Ansible取消vault并为文件创建模板,templates,ansible,jinja2,ansible-playbook,ansible-vault,Templates,Ansible,Jinja2,Ansible Playbook,Ansible Vault,我在本地机器上有一个文件,我想上传到远程服务器,其中包含我不想在VCS中公开的机密信息。它还有一些我需要动态替换的文本(目前作为Jinja2占位符“{}”) 如果使用“复制”模块,则在上载文件时该文件将取消保险存储,但显然占位符已被替换 如果我使用模板模块,那么它不会取消vault文件,因此它将以加密格式上载(也不会替换占位符,因为它们会被加密弄糊涂) 如何将文件(使用ansible)模板化和取消保险存储到远程服务器?如评论中所述,您可以在变量中设置机密,并在设置期间将其呈现到模板中,但如果出于
如何将文件(使用ansible)模板化和取消保险存储到远程服务器?如评论中所述,您可以在变量中设置机密,并在设置期间将其呈现到模板中,但如果出于某种原因,您希望将整个模板保密,也有一些解决方法可以做到这一点 处理加密模板 作为一种解决方法,您可以临时在本地解密模板,并在卷展后使用
local\u 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
请注意,当:False时,已更改。为了使用ansible角色运行幂等性测试,这一点很重要,否则每次运行剧本时,都会发出更改的信号。
在group\u vars/all.yml
中,您可以设置一个全局解密命令以供重用,例如,作为查看加密的\u文件\u cmd
组变量/all.yml
处理加密的静态文件
单向:作为模板
您可以将机密静态文件的内容(例如私钥)设置为ansible中的变量,并将其设置为模板
yml变种
模板/private_key.j2
tasks/main.yml
另一种方式:通过查找管道
另一种方法是使用查找
模块和管道
在复制
模块中设置内容
属性-这样您就不需要额外的变量
---
- copy:
dest=/your/dest
content=lookup('pipe', 'VAULT_PASSWORD_FILE=path/to/pass_file ansible-vault view path/to/file.enc')
在静态文件的情况下,还有另一种类似的可能性。通过使用copy
而不是template
无需额外的文件
使用vars.yml
:
在vault中存储加密的vars.yml:
任务代码:
- name: Save encrypted template
copy:
content: "{{ encrypted_content }}"
dest: /path/to/destination
- name: Read encrypted variable file
include_vars: encrypted.yml
no_log: true
- name: Save encrypted template
copy:
content: "{{ encrypted_content }}"
dest: /path/to/destination
使用单独的YAML文件
您还可以将加密的模板代码存储在另一个YAML文件中。这很有用,因为不应加密wennvars.yml
。例如,vars/encrypted.yml
可能是:
任务代码:
- name: Save encrypted template
copy:
content: "{{ encrypted_content }}"
dest: /path/to/destination
- name: Read encrypted variable file
include_vars: encrypted.yml
no_log: true
- name: Save encrypted template
copy:
content: "{{ encrypted_content }}"
dest: /path/to/destination
现在Ansible 2.4支持复制模块上的解密选项:简而言之,使用copy
模块和Ansible vault
下面是将名为hello.vault
的本地加密文件复制到远程服务器上的hello.txt
的完整示例。它的明确内容是WORLD
,加密密钥是1234
创建vault文件您好。vault
:
$ansible vault创建hello.vault
新Vault密码:1234
确认新Vault密码:1234
##然后输入您的秘密并退出编辑器##
世界
$cat hello.vault
$ANSIBLE_保险库;1.1;AES256
39653932393834613339393036613931393636663638636331323034653036326237373061666139
6434373635373065613135633866333733356532616635640A6637393066393265353366376138
39666462343737653030346463326464333937333161306561333062663164313162376564663262
353339383963346630A66663130336338326561613736376564623465613165656531366331366664
6436
创建密码文件,例如vault.key
,如下所示
使用copy
模块将vault文件传输到webserver
(在资源清册中定义)上的明文
为什么不为你想保密的部分创建变量,然后在保险存储秘密变量后使用模板模块?@ydaetskcoR我认为在某些边缘情况下,你可能不想公开配置文件,而将整个配置模板放入秘密变量字符串中是很难维护的。
encrypted_content: |
foo = {{ bar }}
password = abcabc
...
- name: Save encrypted template
copy:
content: "{{ encrypted_content }}"
dest: /path/to/destination
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
1234
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