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.
- Cree un archivo de contraseña (un archivo de texto sin formato con su contraseña en una sola línea)
-
Cree un
ansible.cfg
en su carpeta de proyecto ansible[defaults] vault_password_file = <path/to/your/password/file>
-
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 }}''"`
-
Crear un archivo variable (por ejemplo,
vars.yml
)my_secure_variable: "X_my_secret_X"
-
Cifre el archivo variable (desde la ubicación del proyecto ansible con
ansible.cfg
)ansible-vault encrypt vars.yml
-
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
Si su problema es tener archivos vars no cifrados y cifrados por group_hosts.
Puede usar esta función ansible: http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults
group_vars/
san_diego/
vars.yml # unencrypted yaml file
vault.yml # encrypted yaml file
Ansible leerá automáticamente vault.yml como archivo cifrado de yaml.
Actualización: la solución a below también es una buena solución (desde Ansible 2.3)