如何使用ansible vault上传加密文件?

Aar*_*oir 37 ansible ansible-playbook

有没有人有一个使用ansible-vault解密和上传文件的例子.

我正在考虑在源代码管理中保持我的ssl证书加密.

看起来像下面的东西应该工作.

---
  - name: upload ssl crt
    copy: src=../../vault/encrypted.crt dest=/usr/local/etc/ssl/domain.crt
Run Code Online (Sandbox Code Playgroud)

jef*_*her 44

从Ansible 2.1.x开始,复制模块现在无缝地执行此操作.只需使用Ansible Vault加密文件,然后在文件上发出复制任务.

(作为参考,这里增加了这个功能:https://github.com/ansible/ansible/pull/15417)

  • 这应该是现在接受的答案 (3认同)
  • 我希望这个答案能够提供一个示例或链接到一个示例。我点击了链接,但对我来说我需要做什么并不明显。 (2认同)

Ric*_*ico 34

那不行.你会得到的是你的encrypted.crt(使用Ansible Vault)按字面意思上传的domain.crt

您需要做的是使您的Playbook成为"Vault"的一部分,并添加包含您的证书内容的变量.像这样的东西:

---
- name: My cool playbook
  hosts: all

  vars:
    mycert: |
       aasfasdfasfas
       sdafasdfasdfasdfsa
       asfasfasfddasfasdfa


  tasks:
    # Apparently this causes new lines on newer ansible versions
    # - name: Put uncrypted cert in a file
    #   shell: echo '{{ mycert }}' > mydecrypted.pem

    # You can try this as per
    # https://github.com/ansible/ansible/issues/9172
    - copy:
      content: "{{ mycert }}"
      dest: /mydecrypted.pem

    - name: Upload Cert
      copy: src=/home/ubuntu/mydecrypted.pem dest=/home/ubuntu/mydecrypteddest.pem

    - name: Delete decrypted cert
      file: path=/home/ubuntu/mydecrypted.pem state=absent
Run Code Online (Sandbox Code Playgroud)

您也可以选择mycert使用Ansible Vault 将变量放在单独的变量文件中.

副本模块已在Ansible 2.1中更新.来自更改日志:"复制模块现在可以透明地使用存储文件作为源,如果提供了存储库密码,它将动态解密和复制." 在这里注意到,因为有些人不可避免地会超越接受的答案. - JK Laiho

  • 文件查找插件现在处理加密文件,就像include_vars一样.所有你需要的内容:"{{lookup('file','{{item}}')}}"` (10认同)
  • 副本模块已在Ansible 2.1中更新.来自更改日志:"复制模块现在可以透明地使用存储文件作为源,如果提供了存储库密码,它将动态解密和复制." 在这里注意到,因为有些人不可避免地会超越接受的答案. (8认同)
  • 我为此开了一个新的Github问题:https://github.com/ansible/ansible/issues/9556 (2认同)
  • @JKLaiho谢谢!用您的报价更新了答案! (2认同)

Yas*_*ser 21

一个功能请求,可以在复制模块中本地支持此功能.但是在实现之前,这里是解决方法(类似于@ dave1010的答案,但为了完整性重复公共部分):

创建一个secrets.yml使用ansible vault加密的文件,其中包含您的秘密,例如:

---
private_ssl_key: |
  -----BEGIN PRIVATE KEY-----
  abcabcabcabcabcabcabcabcabc
  -----END PRIVATE KEY-----

private_crt: |
  -----BEGIN CERTIFICATE-----
  abcabcabcabcabcabcabcabcabc
  -----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

在您的剧本中,包含它:

vars_files:
  - secrets.yml
Run Code Online (Sandbox Code Playgroud)

然后你可以在任务中使用变量:

- name: Copy private kay
  copy: content="{{ private_ssl_key }}" dest=/some/path/ssl.key
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试复制的文件是二进制文件,则不起作用.在这种情况下,您需要首先使用base64编码内容:

cat your_secret_file | /usr/bin/base64
Run Code Online (Sandbox Code Playgroud)

然后将base64编码的值放在您的secrets.yml文件中,例如:


crt_b64: |
  ndQbmFQSmxrK2IwOFZnZHNJa0sKICAxdDhFRUdmVzhMM...
Run Code Online (Sandbox Code Playgroud)

然后,您可以分两步创建远程文件:

- name: Copy certificate (base64 encoded)
  copy: content="{{ crt_b64 }}" dest=/some/path/cert.b64

- name: Decode certificate
  shell: "base64 -d /some/path/cert.b64 > /some/path/cert.txt"
  args:
    creates: /some/path/cert.txt
Run Code Online (Sandbox Code Playgroud)

请注意,您可以删除cert.b64远程主机上的临时文件.但是重新运行该剧本将重新创建它,而不是跳过这个任务.所以,我宁愿把它留在那里.

更新:此功能已在Ansible 2.1中实现.

复制模块现在可以透明地使用存储文件作为源,如果提供了存储库密码,它将动态解密和复制.


dav*_*010 15

我使用了模板和a vars_file来做:

在您的顶级剧本中:

vars_files:
  - secretvars.yml
Run Code Online (Sandbox Code Playgroud)

在任务中:

- name: Private ssl key
  template: src=etc-ssl-private-site.key dest=/etc/ssl/private/site.key
Run Code Online (Sandbox Code Playgroud)

在template(etc-ssl-private-site.key)中,您只需要变量:

{{ private_ssl_key }}
Run Code Online (Sandbox Code Playgroud)

在加密secretvars.yml(加密这个ansible-vault):

---

private_ssl_key: |
  -----BEGIN PRIVATE KEY-----
  abcabcabcabcabcabcabcabcabc
  -----END PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用`copy:content ="{{private_ssl_key}}"`而不是创建另一个模板. (22认同)

Cam*_*Cam 13

更新:截至2016年4月,我的Github PR已合并,可在Ansible 2.1及更高版本中使用.在公关合并之前,以下是临时解决方案.

想要做同样的事情我创建了一个动作插件来实现该功能.这可以通过github获得.该插件正是ansible随附的复制动作插件,但支持保险库解密.

你可以像这样使用它:

- name: Copy Some Secret File
  copyv: src="secret.txt" dest="/tmp/"
Run Code Online (Sandbox Code Playgroud)

如果secret.txt被加密(并提供了保管库密码),那么它将被解密和复制.


Kon*_*bov 11

我想,你有一个更简单的方法来做到这一点.

如果在某个格式的文件中使用certificate + key(如pkcs12或只是连接),则可以使用通用openssl(或gpg其他)加密.它看起来像这样:

openssl enc -e -aes-256-ctr -in original.pem -out encrypted.aes -k <pass-vault>
Run Code Online (Sandbox Code Playgroud)

之后,您只需将encrypted.aes复制到远程主机并就地解密:

- name: copy encrypted cert and key
  copy: src=encrypted.aes dest=/root/ansible-files/ mode=0600

- name: decrypt cert and key
  command: openssl enc -aes-256-ctr -d -in /root/ansible-files/encrypted.aes -out <dest> -k {{ pass-vault }}
Run Code Online (Sandbox Code Playgroud)

如果您有pem或der格式的单独密钥文件,则可以使用

openssl rsa -in original.pem -out encrypted.pem -aes256 -passout pass:<pass-vault>
Run Code Online (Sandbox Code Playgroud)


小智 8

Ansible 2.5 将参数添加decryptcopy模块中。

例如,如果您使用以下内容加密文件:

$ ansible-vault encrypt vault/encrypted.crt
Run Code Online (Sandbox Code Playgroud)

现在您可以使用复制 +解密

---
  - name: upload ssl crt
    copy:
      src: path/to/encrypted-with-vault.crt
      dest: /usr/local/etc/ssl/domain.crt
      decrypt: yes
      mode: 0600
Run Code Online (Sandbox Code Playgroud)