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
Ich glaube, Sie haben zu viel zitiert in Ihrem 'set_fact' Block. Probiere '" {{item.0}} ":" {{item.1}} "'? – larsks
@larks gleiche Ergebnisse. Keine Fehler, bis ich versuche, einen der Fakten später im Spielbuch als Variable zu verwenden. –