it-swarm.com.de

Ansible: Wie werden einige Variablen in einer Inventardatei in einer separaten Tresordatei verschlüsselt?

Einstellungen

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

Das Problem

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?

Was ich versucht habe

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.

47
Adam Matan

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)

39
Antoine

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 }}"
53
wired00

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
10
V. Morate

Sie können etwas Ähnliches tun.

  1. Erstellen Sie eine Kennwortdatei (eine reine Textdatei mit Ihrem Kennwort in einer einzelnen Zeile).
  2. Erstellen Sie einen ansible.cfg in Ihrem Projektordner

    [defaults]
    vault_password_file = <path/to/your/password/file>
    
  3. 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 }}'"`
    
  4. Erstellen Sie eine variable Datei (z. B. vars.yml).

    my_secure_variable: "X_my_secret_X"
    
  5. Verschlüsseln Sie die Variablendatei (vom ansässigen Projektspeicherort mit dem ansible.cfg)

    ansible-vault encrypt vars.yml
    
  6. 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
6
grandma

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

3
leucos

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.

0