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

如何使用ansible vault上载加密文件?,ansible,ansible-playbook,Ansible,Ansible Playbook,是否有人有使用解密和上载文件的示例 我正在考虑在源代码管理中对ssl证书进行加密 下面的方法似乎可以奏效 --- - name: upload ssl crt copy: src=../../vault/encrypted.crt dest=/usr/local/etc/ssl/domain.crt 那是行不通的。您将得到的是您的加密.crt(带Ansible Vault)以域.crt 您需要做的是使您的playbook成为“Vault”的一部分,并添加一个包含证书内容的变量。大概

是否有人有使用解密和上载文件的示例

我正在考虑在源代码管理中对ssl证书进行加密

下面的方法似乎可以奏效

---
  - name: upload ssl crt
    copy: src=../../vault/encrypted.crt dest=/usr/local/etc/ssl/domain.crt

那是行不通的。您将得到的是您的
加密.crt
(带Ansible Vault)以
域.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
openssl enc -e -aes-256-ctr -in original.pem -out encrypted.aes -k <pass-vault>
- name: Copy Some Secret File
  copyv: src="secret.txt" dest="/tmp/"
您也可以选择使用Ansible Vault将
mycert
变量放入单独的变量文件中


复制模块已在Ansible 2.1中更新。从变更日志: “复制模块现在可以透明地使用Vault文件作为源,如果 提供了保险库密码,它将动态解密和复制。” 注意这里,因为有些人不可避免地不会看过去 接受答案JK莱奥


我使用了一个模板和一个
vars\u文件

在顶级剧本中:

vars_files:
  - secretvars.yml
- name: "temporairly decrypt the twpol.enc"
  sudo: False
  local_action: shell ansible-vault view --vault-password-file {{ lookup('env', 'ANSIBLE_VAULT_PASS_FILE') }} ./roles/copykey/files/key.enc > ./roles/copykey/files/key.txt 

- name: "copy the key to the target machine."
  copy: src=key.txt dest=/tmp

- name: "remove decrypted key.txt file"
  sudo: False
  local_action: rm ./roles/copykey/files/key.txt
在任务中:

- name: Private ssl key
  template: src=etc-ssl-private-site.key dest=/etc/ssl/private/site.key
在模板(
etc ssl private site.key
)中,您只需要变量:

{{ private_ssl_key }}
在加密的
secretvars.yml
(使用
ansible vault对其进行加密)


我想,你有一个更简单的方法

如果您在一个文件中以某种格式使用证书+密钥(如pkcs12或只是级联),则可以使用通用的
openssl
(或
gpg
,或其他)加密。它将如下所示:

---
- 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
openssl enc -e -aes-256-ctr -in original.pem -out encrypted.aes -k <pass-vault>
- name: Copy Some Secret File
  copyv: src="secret.txt" dest="/tmp/"
openssl enc-e-aes-256-ctr-in original.pem-out encrypted.aes-k
之后,您只需将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 }}
-名称:复制加密证书和密钥
复制:src=encrypted.aes dest=/root/ansible files/mode=0600
-名称:解密证书和密钥
命令:openssl enc-aes-256-ctr-d-in/root/ansible files/encrypted.aes-out-k{{pass vault}
如果您有pem或der格式的单独密钥文件,则可以使用

openssl rsa -in original.pem -out encrypted.pem -aes256 -passout pass:<pass-vault>
openssl rsa-in original.pem-out encrypted.pem-aes256-passout pass:

+1用于上面@utapyngo建议的
copy:content={{private\u ssl\u key}}
方法

如果您将密钥分发作为一个角色,而不仅仅是在剧本中(为什么不这样做,因为密钥分发是您以后可能需要的东西),请记住以下几点:

  • 您的VAR只获得一个文件,因此所有密钥(例如,您有基于主机的不同捆绑包或其他)必须在
    /vars/main.yml
  • 这个
    /vars/main.yml
    中的变量是可引用的,没有任何路径(太好了!)
  • 请记住,无论何时需要变量的内容,都需要引号和卷曲,即,
    “{{your_variable_name}}”
  • 如果要为每个任务复制多个文件,则需要一个带有_项的
    循环:
    循环
  • 如果你想让你的敏感数据不显示在屏幕上,那么一个巧妙的方法就是把你的关键变量放在字典里;这样,在你的
    with_items
    循环中,你给它的是字典密钥,而不是变量本身的内容
在复制模块中本机无法支持这一点。但在实现这一点之前,以下是解决方法(与@dave1010的答案类似,但为了完整性,重复了常见部分):

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

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

private_crt: |
  -----BEGIN CERTIFICATE-----
  abcabcabcabcabcabcabcabcabc
  -----END CERTIFICATE-----
在您的剧本中,包括:

vars_files:
  - secrets.yml
然后可以在任务中使用变量:

- name: Copy private kay
  copy: content="{{ private_ssl_key }}" dest=/some/path/ssl.key
但是,如果您尝试复制的文件是二进制文件,则此操作无效。在这种情况下,您需要首先使用base64对内容进行编码:

cat your_secret_file | /usr/bin/base64
然后将base64编码值放入
secrets.yml
文件中,例如:


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

- 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
请注意,您可以删除远程主机上的临时
cert.b64
文件。但是,重新运行playbook将重新创建它,而不是跳过此任务。因此,我宁愿将其保留在那里

更新: 此功能已在中实现

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


更新:截至2016年4月,my已被合并,并在Ansible 2.1及更高版本中提供。以下是合并PR之前的临时解决方案

为了做同样的事情,我创建了一个动作插件来实现该功能。该插件可通过。该插件与ansible附带的复制动作插件完全相同,但支持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
openssl enc -e -aes-256-ctr -in original.pem -out encrypted.aes -k <pass-vault>
- name: Copy Some Secret File
  copyv: src="secret.txt" dest="/tmp/"

如果对secret.txt进行了加密(并提供了vault密码),则将对其进行解密和复制。

在“复制”模块扩展到自动解密vault文件之前,这里有一个简单的解决方法:

当标准输出不是tty时,
ansible vault view
将明文打印到标准输出,而无需调用寻呼机

结合“管道”查找,此行为可与vault密码文件一起使用,以输入复制模块的“内容”选项:

- name: "install host key"
  copy: content="{{ lookup('pipe', 'ansible-vault view ' + src_key_file) }}"
        dest={{ dest_key_file }}

您还可以使用local_操作临时解密您的文件,作为剧本的一部分:

vars_files:
  - secretvars.yml
- name: "temporairly decrypt the twpol.enc"
  sudo: False
  local_action: shell ansible-vault view --vault-password-file {{ lookup('env', 'ANSIBLE_VAULT_PASS_FILE') }} ./roles/copykey/files/key.enc > ./roles/copykey/files/key.txt 

- name: "copy the key to the target machine."
  copy: src=key.txt dest=/tmp

- name: "remove decrypted key.txt file"
  sudo: False
  local_action: rm ./roles/copykey/files/key.txt

从Ansible 2.1.x开始,“复制”模块现在可以无缝地执行此操作。只需使用Ansible Vault加密您的文件,然后对该文件发出复制任务


(供参考,以下是添加此项的功能:)

Ansible 2.5将参数
decrypt
添加到
复制
模块

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

$ ansible-vault encrypt vault/encrypted.crt
现在您可以使用copy+解密:

---
  - name: upload ssl crt
    copy:
      src: path/to/encrypted-with-vault.crt
      dest: /usr/local/etc/ssl/domain.crt
      decrypt: yes
      mode: 0600

您还可以使用
copy:content=“{{private\u ssl\u key}}”
而不是创建另一个模板