Betrachten Sie eine Ansible-Inventardatei ähnlich dem folgenden Beispiel:
[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
Ich möchte einige der Variablen (wie db_password
) in einem Ansible-Vault speichern, aber nicht die gesamte Datei.
Wie kann eine vault-verschlüsselte ansible Datei in eine unverschlüsselte Inventardatei importiert werden?
Ich habe eine verschlüsselte VAR-Datei erstellt und versucht, sie mit folgendem zu importieren:
include: secrets
Auf welchen ansible-playbook
antwortete mit:
ERROR: variables assigned to group must be in key=value form
Wahrscheinlich, weil versucht wurde, die include
-Anweisung als Variable zu analysieren.
Wenn es sich bei Ihrem Problem um unverschlüsselte und verschlüsselte vars-Dateien pro group_hosts handelt.
Sie können diese benutzbare Funktion verwenden: http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-aults
group_vars/
san_diego/
vars.yml # unencrypted yaml file
vault.yml # encrypted yaml file
Ansible liest vault.yml automatisch als verschlüsselte yaml-Datei.
Update: Die Lösung unten ist auch eine gute Lösung (seit Ansible 2.3)
Seit Ansible 2.3 können Sie eine Single Encrypted Variable. IMO verschlüsseln. Hierfür ist eine Komplettlösung erforderlich, da die Dokumente recht knapp erscheinen.
Beispiel: mysql_password: password123
(innerhalb von main.yml)
Führe einen Befehl aus wie:
ansible-vault encrypt_string password123 --ask-vault-pass
Dies wird produzieren:
!vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
Encryption successful
füge dies in dein main.yml ein:
mysql_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833
3136626431626536303530376336343832656537303632313433360a626438346336353331
Spielbuch ausführen:
Dh ansible-playbook -i hosts main.yml --ask-vault-pass
Per Debug überprüfen:
- debug:
msg: "mysql Pwd: {{ mysql_password }}"
Derzeit ist es mit Ansible 2.3 möglich, sowohl verschlüsselte als auch unverschlüsselte Variablen in einem einfachen yaml zu haben. Das Format der Variablen ist verschlüsselt:
dbServer: PlainDatabaseServer
dbName: PlainDatabaseName
dbUser: PlainUser
dbPasswd: !vault |
$ANSIBLE_VAULT;1.1;AES256
63633363616165656538656537323835343634633063386137353637646663333939623464666437
6263383933656635316436313934366564316337623435350a386362613838373363393534383232
39663162363066313431623466363763356466376538613532333731613538373431623239626330
6463373238366630360a623566616535376339326431363465663431623462356238636333306663
6439
Sie können die Variable mithilfe der folgenden Anweisung mit einem Kennwort oder einer Kennwortdatei verschlüsseln:
ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt
Diese Anweisung gibt den Text zurück, der in der Variablen dbPasswd im obigen yaml angezeigt wird.
Um ein Playbook auszuführen, das die verschlüsselte Variable verwendet, fügen Sie einfach die folgende Variable hinzu:
ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt
Sie können dasselbe auch mit --ask-vault-pass machen, das Sie beim Ausführen des Playbooks nach dem Kennwort fragt:
ansible-playbook playbooks/myplaybook --ask-vault-pass
Sie können etwas Ähnliches tun.
Erstellen Sie einen ansible.cfg
in Ihrem Projektordner
[defaults]
vault_password_file = <path/to/your/password/file>
Erstellen einer Playbook-Datei (z. B. 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 }}'"`
Erstellen Sie eine variable Datei (z. B. vars.yml
).
my_secure_variable: "X_my_secret_X"
Verschlüsseln Sie die Variablendatei (vom ansässigen Projektspeicherort mit dem ansible.cfg
)
ansible-vault encrypt vars.yml
Führe dein Playbook aus (von der ansässigen Projektposition mit dem ansible.cfg
)
ansible-playbook -i "localhost," playbook.yml
Sie sollten eine Ausgabe ähnlich wie:
$ 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
Das hängt von Ihrem Workflow ab. Sie können eine group_vars
-Datei gemäß dem Vorschlag von Sebastian Stigler verwenden. Wenn Sie eine Inventardatei verwenden möchten, können Sie einfach eine weitere "ini-like" -Datei in einem Inventarverzeichnis hinzufügen und diese verschlüsseln.
$ 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
Verwenden Sie dann -i my_inventory/
in Ihrer Befehlszeile oder erstellen Sie einen lokalen ansible.cfg
, der Folgendes enthält:
[defaults]
hostfile = ./my_inventory/
und du solltest eingestellt sein. Ansible führt beide Dateien zur Laufzeit zusammen.
Verwenden Sie ansible-vault encrypt my_inventory/inventory_crypted_vars
, bevor Sie ein Commit ausführen.
Möglicherweise möchten Sie einen Pre-Commit-Hook, um sicherzustellen, dass Sie keine unverschlüsselte Version der Datei festlegen. Zum Beispiel würde ein Pre-Commit-Hook wie dieser den Trick tun (FILES_PATTERN
entsprechend anpassen).
Sie können group_vars verwenden (siehe http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable ).
Erstellen Sie in Ihrem Playbook ein Unterverzeichnis mit dem Namen group_vars
.
Dort erstellen Sie eine Datei mit dem Namen west_coast
und geben die folgenden Einträge ein:
---
db_server: foo.example.com
db_Host: 5432
db_password: top secret password
Diese Datei kann dann in einen verfügbaren Tresor konvertiert werden.