4

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

如果我使用复制模块,那么当我上传文件时,文件是未保存的,但显然占位符已被替换。

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

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

4

4 回答 4

10

正如评论中已经提到的,您可以将您的秘密设置在变量中并在配置期间将它们呈现到模板中,但是如果由于某种原因您想将整个模板保密,也有一些解决方法可以做到这一点。

处理加密模板

作为一种解决方法,您可以在本地临时解密模板,并在推出后使用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')
于 2016-06-07T17:02:02.747 回答
6

现在 Ansible 2.4 支持复制模块上的解密选项:http: //docs.ansible.com/ansible/latest/copy_module.html#options

于 2017-09-20T17:04:07.403 回答
2

这不应该再使用了,请参阅下面的评论...


在静态文件的情况下,还有另一种类似于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 文件中。这很有用,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
于 2017-05-24T09:55:05.460 回答
0

简而言之,使用copy模块和ansible-vault.

这是在远程服务器上复制名为hello.vaultto的本地加密文件的完整示例。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
于 2019-05-23T14:06:02.053 回答