Search code examples
ansible

How to upload encrypted file using ansible vault?


Does anyone have an example of decrypting and uploading a file using ansible-vault.

I am thinking about keeping my ssl certificates encrypted in source control.

It seems something like the following should work.

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

Solution

  • UPDATE: Deprecated as of 2016, Ansible 2.1

    On any Ansible version prior of 2.1:

    That's not going to work. What you will get is your encrypted.crt (with Ansible Vault) uploaded literally as domain.crt

    What you need to do is make your playbook part of a "Vault" and add a variable that contains your certificate content. Something like this:

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

    You can choose to put your mycert variable in a separate variable file using Ansible Vault too.

    The copy module has been updated in Ansible 2.1. From the changelog: "copy module can now transparently use a vaulted file as source, if vault passwords were provided it will decrypt and copy on the fly." Noting it here, since some people will inevitably not look past the accepted answer. – JK Laiho