2017-12-05 4 views
0

Ich versuche, Bash-Umgebungsvariablen zu konvertieren, die aus einer Eigenschaftendatei auf einem Remotecomputer stammen. Ich melde mich die Schlüssel und Werte zu zwei Registervariablen und dann versuchen, sie zu durch Schleife with_together und set_factWie kann ich set_fact und with_together verwenden?

Hier ist, wie ich meine Variablen Schlüssel bin Sourcing/Werte

- name: Source Env Properties 
    shell: . <source utility> && (set -a posix ; set| sed 's,=.*,,') 
    register: variable_keys 

- shell: . <source utility> && (set -a posix ; set| sed 's,^.*=,,') 
    register: variable_values 

Danach versuche ich set_fact Verwenden der zwei registrierten Werte.

Die Ausgabe der Aufgaben scheint wie es funktionieren sollte, aber wenn Sie versuchen, diese Variablen zu verwenden, heißt es, dass sie nicht definiert sind.

Kann mir jemand sagen, warum das nicht funktioniert?

+0

Ich glaube, Sie haben zu viel zitiert in Ihrem 'set_fact' Block. Probiere '" {{item.0}} ":" {{item.1}} "'? – larsks

+0

@larks gleiche Ergebnisse. Keine Fehler, bis ich versuche, einen der Fakten später im Spielbuch als Variable zu verwenden. –

Antwort

1

Also, Ihr erstes Problem, wie ich in meinem Kommentar angespielt habe, ist, dass die Syntax in Ihrem set_fact Block falsch ist. Wenn Sie diese:

"{{item.0}}:{{item.1}}" 

Dann haben Sie einzelne Zeichenfolge, kein key: value Paar. Sie müssten das so ändern, dass es wie folgt aussieht:

- name: set variables 
    set_fact: 
    "{{item.0}}": "{{item.1}}" 
    with_together: 
    - "{{ variable_keys.stdout_lines }}" 
    - "{{ variable_values.stdout_lines }}" 

Aber das ist nur die Hälfte des Problems. Ihre sed Ausdrücke können am Ende syntaktisch ungültige Ausgabe produzieren, weil sie bash Funktionsdefinitionen enthalten. Das heißt, wenn ich den ersten Befehl in meinem lokalen Umgebung ausgeführt, die Ausgabe enthält alle cruft von Shell-Funktionen für Bash-Vervollständigungen, git Aufforderungen, usw., wie folgt aus:

scl() 
{ 
    local CMD 
    if [ "$CMD" 
     eval "module [email protected]"; 
    else 
     /usr/bin/scl "[email protected]"; 
    fi 
} 

das ist nur ansible gehen zu brechen:

failed: [localhost] (item=[u"'", u"'"]) => {"changed": false, "failed": true, "item": ["'", "'"], "msg": "The variable name ''' is not valid. Variables must start with a letter or underscore character, and contain only letters, numbers and underscores."} 

Sie müssen sicherstellen, dass Sie diesen Inhalt herausfiltern. Früher habe ich dies:

- name: Source Env Properties 
    shell: . ./myvars.sh && (set -a posix; set| sed -n '/^[A-Z]/ s,=.*,,p') 
    register: variable_keys 

- shell: . ./myvars.sh && (set -a posix; set| sed -n '/^[A-Z]/ s,^.*=,,p') 
    register: variable_values 

- name: set variables 
    set_fact: 
    "{{item.0}}": "{{item.1}}" 
    with_together: 
    - "{{ variable_keys.stdout_lines }}" 
    - "{{ variable_values.stdout_lines }}" 

Wenn ich habe, in myvars.sh:

FOO=bar 

Und wenn in meinem Textbuch Ich habe nach der oben:

- debug: 
    var: FOO 

Ich werde als Ausgabe sehen :

ok: [localhost] => { 
    "FOO": "bar" 
} 

Inci Dentally, denke ich, dass all das mit sed zerbrechlich ist und andere Probleme auf der Straße verursachen kann. Ich würde wahrscheinlich etwas tun:

- name: Source Env Properties 
    shell: | 
    set -a 
    . ./myvars.sh 
    jq -n env 
    register: vars_raw 

- set_fact: 
    shellvars: "{{ vars_raw.stdout|from_json }}" 

- debug: 
    var: shellvars.FOO 

Dieses verwendet jq alle verfügbaren Umgebungsvariablen als JSON zu exportieren, und ordnet dann das Ergebnis an die shellvars Variable. Die set -a stellt sicher, dass alle in myvars.sh festgelegten Variablen in die Umgebung exportiert werden.Wenn Sie nicht jq zur Hand haben zu tun, könnten Sie python verwenden:

- name: Source Env Properties 
    shell: | 
    set -a 
    . ./myvars.sh 
    python -c 'import json; import os; print(json.dumps(dict(os.environ)))' 
    register: vars_raw 

- set_fact: 
    shellvars: "{{ vars_raw.stdout|from_json }}" 

- debug: 
    var: shellvars.FOO 
+0

Vielen Dank für Ihre Hilfe. Du hast recht, wenn du mit "sed" herumlegst, ist das problematisch auf der Straße, aber der Tweak, den du meinem "sed" zur Verfügung gestellt hast, hat mein Problem vorerst behoben. Die Python-Lösung könnte auch in den meisten meiner Umgebungen funktionieren, aber nicht in allen. –

Verwandte Themen