vars tower playbook commands ansible ansible-playbook

playbook - ansible tower



¿Cómo cargar un archivo encriptado usando una bóveda de Ansible? (10)

¿Alguien tiene un ejemplo de descifrado y carga de un archivo usando ansible-vault ?

Estoy pensando en mantener mis certificados ssl encriptados en el control de código fuente.

Parece que algo como lo siguiente debería funcionar.

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


+1 para el método copy: content= {{ private_ssl_key }}" sugerido por @utapyngo arriba.

Si está haciendo su distribución de claves como un rol, en lugar de solo en un libro de jugadas (y por qué no, ya que la distribución de claves es algo que podría necesitar de nuevo más adelante), tenga en cuenta lo siguiente:

  • Solo obtienes un archivo para tus vars, por lo que todas las claves (digamos que tienes diferentes paquetes basados ​​en máquinas host o lo que sea) deben ir juntas en <role>/vars/main.yml
  • Las variables en este <role>/vars/main.yml son referenciables sin ningún camino (¡eso es bueno!)
  • Recuerde que cada vez que desee el contenido de la variable, necesitará comillas Y curlies, es decir, "{{ your_variable_name }}"
  • Si desea copiar más de un archivo por tarea, necesita un bucle with_items:
  • Si desea mantener sus datos confidenciales que ha tenido tantos problemas para encriptar en primer lugar fuera de la pantalla, un buen truco es el próximo a sus variables clave dentro de un diccionario; de esa forma, en su ciclo with_items lo está alimentando con la clave del diccionario en lugar de con el contenido de la variable en sí.

Actualización: a partir de abril de 2016, mi https://github.com/ansible/ansible/pull/15417 se fusionó y está disponible en Ansible 2.1 y versiones posteriores. Lo siguiente fue una solución provisional hasta que se fusionó el PR.

Queriendo hacer lo mismo, creé un complemento de acción para implementar la función. Esto está disponible a través de github . El complemento es exactamente el complemento de acción de copia enviado como ansible, pero con soporte para descifrado de bóveda.

Puedes usarlo así:

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

si secret.txt está encriptado (y se proporciona la contraseña de la bóveda), se descifrará y copiará.


Ansible 2.5 agregó el decrypt parámetros al módulo de copy .

Por ejemplo, si encriptaste tu archivo usando algo como:

$ ansible-vault encrypt vault/encrypted.crt

Ahora puedes usar copiar + descifrar :

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


Creo que tienes una manera más simple de hacer esto.

Si usa certificado + clave en un archivo en algún formato (como pkcs12 o simplemente concatenado), puede usar el cifrado genérico openssl (o gpg , o cualquier otro). Se verá así:

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

Después de eso, solo puede copiar encrypted.aes en el host remoto y descifrarlo in situ:

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

Si tiene un archivo de clave separado en formato pem o der, puede usar

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


El módulo de copia ahora lo hace a la perfección desde Ansible 2.1.x. Simplemente encripte su archivo con Ansible Vault y luego emita la tarea de copia en el archivo.

(Como referencia, aquí está la función que agregó esto: https://github.com/ansible/ansible/pull/15417 )


Eso no va a funcionar. Lo que obtendrá es su encrypted.crt (con Ansible Vault) cargado literalmente como domain.crt

Lo que debe hacer es hacer que su libro de jugadas sea parte de una "Bóveda" y agregue una variable que contenga el contenido de su certificado. Algo como esto:

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

También puede optar por colocar su variable mycert en un archivo variable separado utilizando Ansible Vault.

El módulo de copia se ha actualizado en Ansible 2.1. Desde el registro de cambios: "el módulo de copia ahora puede usar transparentemente un archivo abovedado como fuente, si se proporcionaron contraseñas de bóveda, se descifrará y copiará sobre la marcha". Observándolo aquí, ya que algunas personas inevitablemente no mirarán más allá de la respuesta aceptada. - JK Laiho


Hasta que el módulo ''copiar'' se haya extendido para descifrar automáticamente los archivos de vault, aquí hay una solución alternativa:

Cuando stdout no es una tty, ansible-vault view <file> imprime texto sin formato en stdout sin invocar un paginador.

En combinación con una búsqueda ''pipe'', este comportamiento se puede usar con un archivo de contraseña de bóveda para alimentar la opción ''content'' del módulo de copia:

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


Hay una solicitud de función para admitir esto de forma nativa en el módulo de copia. Pero hasta que esto se implemente, aquí está la solución (similar a la respuesta de @ dave1010, pero repitiendo partes comunes para que esté completo):

Cree un archivo secrets.yml encriptado con una bóveda ansible que contenga sus secretos, por ejemplo:

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

En tu libro de jugadas, inclúyelo:

vars_files: - secrets.yml

Entonces puedes usar las variables en las tareas:

- name: Copy private kay copy: content="{{ private_ssl_key }}" dest=/some/path/ssl.key

Sin embargo, esto no funciona si el archivo que está intentando copiar es un archivo binario. En ese caso, primero necesita codificar el contenido con base64:

cat your_secret_file | /usr/bin/base64

A continuación, coloque el valor codificado en base64 en su archivo secrets.yml , por ejemplo:

crt_b64: | ndQbmFQSmxrK2IwOFZnZHNJa0sKICAxdDhFRUdmVzhMM...

Luego puede crear el archivo remoto en dos pasos:

- 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

Tenga en cuenta que puede eliminar el archivo cert.b64 temporal en el host remoto. Pero luego volver a ejecutar el libro de jugadas lo volverá a crear en lugar de omitir esta tarea. Por lo tanto, prefiero dejarlo allí.

ACTUALIZACIÓN : esta característica se ha implementado en Ansible 2.1 .

El módulo de copia ahora puede usar de forma transparente un archivo abovedado como fuente, si se proporcionaron contraseñas de bóveda, se descifrará y copiará sobre la marcha.


También puede usar local_action para descifrar temporalmente su archivo como parte del libro de jugadas:

- 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


vars_file una plantilla y un vars_file para hacerlo:

En tu libro de jugadas de nivel superior:

vars_files: - secretvars.yml

En una tarea:

- name: Private ssl key template: src=etc-ssl-private-site.key dest=/etc/ssl/private/site.key

En la plantilla ( etc-ssl-private-site.key ) todo lo que necesita es la variable:

{{ private_ssl_key }}

En el secretvars.yml encriptado (cifra esto con ansible-vault ):

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