Ansible un-vault和模板文件

时间:2016-06-07 15:02:08

标签: templates ansible jinja2 ansible-playbook ansible-vault

我的本​​地计算机上有一个文件要上传到远程服务器,它包含我不希望在我的VCS中公开的机密信息。它还有一些我需要在其中动态替换的文本(目前为Jinja2占位符" {{}}")。

如果我使用复制模块,那么当我上传文件时文件是非拱形的,但很明显占位符被替换为注释。

如果我使用模板模块,那么它不会对文件进行取消保存,因此会以加密格式上传(并且也不会替换占位符,因为它们会被加密模糊)。

如何将文件(使用ansible)模板和取消保存到远程服务器?

4 个答案:

答案 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文件

您还可以将加密的模板代码存储在另一个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

  1. 创建您的保管库文件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
  1. 创建您的密码文件,例如vault.key如下
1234
  1. 使用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