首页 文章

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

提问于
浏览
35

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

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

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

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

10 回答

  • 13

    那不行 . 您将获得的是 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
    

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

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

  • 21

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

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

  • 36

    在复制模块中有a feature request本地支持它 . 但是在实现之前,这里是解决方法(类似于@ 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 文件中,例如:


    crt_b64: |
      ndQbmFQSmxrK2IwOFZnZHNJa0sKICAxdDhFRUdmVzhMM...
    

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

    - 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 文件 . 但是重新运行该剧本将重新创建它,而不是跳过这个任务 . 所以,我宁愿把它留在那里 .

    UPDATE :此功能已在Ansible 2.1中实施 .

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

  • 32

    我使用了一个模板和 vars_file 来做到这一点:

    在您的顶级剧本中:

    vars_files:
      - secretvars.yml
    

    在任务中:

    - 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 加密):

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

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

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

    你可以像这样使用它:

    - name: Copy Some Secret File
      copyv: src="secret.txt" dest="/tmp/"
    

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

  • 11

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

    如果您以某种格式在一个文件中使用证书密钥(如pkcs12或只是连接),则可以使用泛型 openssl (或 gpg ,或其他)加密 . 它看起来像这样:

    openssl enc -e -aes-256-ctr -in original.pem -out encrypted.aes -k <pass-vault>
    

    之后,您只需将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 }}
    

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

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

    在“复制”模块已扩展为自动解密文件库文件之前,这是一个简单的解决方法:

    当stdout不是tty时, ansible-vault view <file> 会在不调用寻呼机的情况下将明文打印到stdout .

    结合“管道”查找,此行为可与保险库密码文件一起使用,以提供给副本模块的“内容”选项:

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

    Ansible 2.5将参数 decrypt 添加到 copy 模块 .

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

    $ ansible-vault encrypt vault/encrypted.crt
    

    现在你可以使用copy decrypt

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

    您还可以使用local_action临时解密您的文件作为playbook的一部分:

    - 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
    
  • 2

    1上面的@utapyngo建议的 copy: content= {{ private_ssl_key }}" 方法 .

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

    • 你只为你的vars获得一个文件,所以所有的密钥(比如你有不同的基于主机或其他的捆绑包)必须在 <role>/vars/main.yml 中一起使用

    • <role>/vars/main.yml 中的变量是可引用的,没有任何路径(这很好!)

    • 请记住,只要您想要变量的内容,就需要引用AND curlies,即 "{{ your_variable_name }}"

    • 如果要为每个任务复制多个文件,则需要 with_items: 循环

    • 如果你想保持敏感数据,你已经经历了很多麻烦,首先在屏幕外进行加密,一个巧妙的诀窍是接下来你的字典中的关键变量;这样,在你的 with_items 循环中,你正在向它提供字典键而不是变量本身的内容 .

相关问题