sistema salidas planilla para inventarios inventario hacer gestion entradas crear control con como codigos encryption ansible ansible-playbook ansible-vault

encryption - salidas - gestion de inventarios



Ansible: ¿Cómo cifrar algunas variables en un archivo de inventario en un archivo de almacén separado? (6)

La configuración

Considere un archivo de inventario Ansible similar al siguiente ejemplo:

[san_diego] host1 host2 [san_francisco] host3 host4 [west_coast] san_diego san_francisco [west_coast:vars] db_server=foo.example.com db_host=5432 db_password=top secret password

El problema

Me gustaría almacenar algunos de los vars (como db_password ) en un db_password de Ansible , pero no todo el archivo.

¿Cómo se puede importar un archivo ansible cifrado en bóveda a un archivo de inventario no cifrado?

Lo que he intentado

He creado un archivo vars cifrado e intenté importarlo con:

include: secrets

A lo que ansible-playbook respondió con:

ERROR: variables assigned to group must be in key=value form

Probablemente porque trató de analizar la declaración de include como una variable.


Depende de tu flujo de trabajo. Puede usar un archivo group_vars según la sugerencia de Sebastian Stigler o si desea usar un archivo de inventario, simplemente puede agregar otro archivo "ini-like" en un directorio de inventario y cifrarlo.

$ mkdir my_inventory/ $ cat >> hosts << EOF [san_diego] host1 host2 [san_francisco] host3 host4 [west_coast] san_diego san_francisco EOF $ cat >> inventory_crypted_vars << EOF [west_coast:vars] db_server=foo.example.com db_host=5432 db_password=top secret password EOF

Luego, use -i my_inventory/ en su línea de comando, o cree un ansible.cfg local que contenga:

[defaults] hostfile = ./my_inventory/

y deberías estar listo. Ansible combinará ambos archivos en tiempo de ejecución.

Use ansible-vault encrypt my_inventory/inventory_crypted_vars antes de ansible-vault encrypt my_inventory/inventory_crypted_vars y listo.

Probablemente desee un enlace previo a la confirmación para asegurarse de que no está confirmando una versión sin cifrar del archivo. Por ejemplo, un gancho de confirmación previa como este sería el truco (ajuste FILES_PATTERN consecuencia).


Desde Ansible 2.3 puede encriptar una Variable Encriptada Única . En mi opinión, se necesita un tutorial ya que los doco parecen bastante concisos.

Dado un ejemplo de: mysql_password: password123 (dentro de main.yml)

Ejecute un comando como:

ansible-vault encrypt_string password123 --ask-vault-pass

Esto producirá:

!vault | $ANSIBLE_VAULT;1.1;AES256 66386439653236336462626566653063336164663966303231363934653561363964363833 3136626431626536303530376336343832656537303632313433360a626438346336353331 Encryption successful

pegue esto en su main.yml:

mysql_password: !vault | $ANSIBLE_VAULT;1.1;AES256 66386439653236336462626566653063336164663966303231363934653561363964363833 3136626431626536303530376336343832656537303632313433360a626438346336353331

ejecutar libro de jugadas:

Es decir, ansible-playbook -i hosts main.yml --ask-vault-pass

Verificar mediante depuración:

- debug: msg: "mysql Pwd: {{ mysql_password }}"


En este momento con Ansible 2.3 es posible tener en un solo yaml variables cifradas y no cifradas. El formato de las variables cifradas es el siguiente:

dbServer: PlainDatabaseServer dbName: PlainDatabaseName dbUser: PlainUser dbPasswd: !vault | $ANSIBLE_VAULT;1.1;AES256 63633363616165656538656537323835343634633063386137353637646663333939623464666437 6263383933656635316436313934366564316337623435350a386362613838373363393534383232 39663162363066313431623466363763356466376538613532333731613538373431623239626330 6463373238366630360a623566616535376339326431363465663431623462356238636333306663 6439

Puede cifrar la variable usando una contraseña o un archivo de contraseña con la declaración:

ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt

Esta declaración devuelve el texto que se muestra en la variable dbPasswd en el yaml anterior.

Para ejecutar un libro de jugadas que use la variable encriptada simplemente agregue la siguiente var:

ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt

O puede hacer lo mismo con --ask-vault-pass, que le pide la contraseña al ejecutar el libro de jugadas:

ansible-playbook playbooks/myplaybook --ask-vault-pass


Puede usar group_vars (consulte docs.ansible.com/… ).

Cree un subdirectorio en su libro de jugadas llamado group_vars .
Allí crea un archivo llamado west_coast y coloca las siguientes entradas en él:

--- db_server: foo.example.com db_host: 5432 db_password: top secret password

Este archivo se puede convertir a una bóveda ansible.


Puedes hacer algo similar a esto.

  1. Cree un archivo de contraseña (un archivo de texto sin formato con su contraseña en una sola línea)
  2. Cree un ansible.cfg en su carpeta de proyecto ansible

    [defaults] vault_password_file = <path/to/your/password/file>

  3. Crear un archivo de libro de jugadas (por ejemplo, playbook.yml )

    - name: my ansible playbook hosts: 127.0.0.1 vars_files: - ''vars.yml'' tasks: - name: print secure variable debug: msg="my secure variable ''{{ my_secure_variable }}''"`

  4. Crear un archivo variable (por ejemplo, vars.yml )

    my_secure_variable: "X_my_secret_X"

  5. Cifre el archivo variable (desde la ubicación del proyecto ansible con ansible.cfg )

    ansible-vault encrypt vars.yml

  6. Ejecute su libro de jugadas (desde la ubicación del proyecto ansible con ansible.cfg )

    ansible-playbook -i "localhost," playbook.yml

Debería obtener una salida similar a:

$ ansible-playbook playbook.yml -i ''localhost,'' PLAY [my ansible playbook] **************************************************** GATHERING FACTS *************************************************************** ok: [127.0.0.1] TASK: [print secure variable] ************************************************* ok: [127.0.0.1] => { "msg": "my secure variable ''X_my_secret_X'' " } PLAY RECAP ******************************************************************** 127.0.0.1 : ok=2 changed=0 unreachable=0 failed=0