Ich versuche, aus dem Standard einer Befehlsaufgabe, die ich von einer anderen Rolle aus aufrufe, ansible Fakten zu ermitteln.
Rolle A:
- name: example command
command: client get -s {{ service }}
register: vars_string
- name: set vars
set_fact: vars={{ vars_string.stdout.split('\n')}}
when:
- vars_string.stdout | length > 0
- name: set vars as facts
set_fact: "{{ item }}"
with_items: "{{ vars }}"
vars Ausgabe:
"vars": [
"tst=ansible",
"example=values"
]
Rolle B:
- debug:
var: tst
Ergebnisse aus Rolle B:
Erwartung: { "tst": "ansible" }
Wirklichkeit: { "tst": "VARIABLE IS NOT DEFINED!" }
Ich habe versucht, Vars in ein Diktat zu spucken und auch zu verwenden set_fact: "{{ item.key }}" : "{{ item.value }}"
. Dies ergab die gleichen Ergebnisse.
Ich möchte in zukünftigen Rollen über den vom Befehl zurückgegebenen Variablennamen aufrufen können. Irgendwelche Ideen?
Zwei Punkte zu Ihrem Code-Snippet, die Sie interessieren könnten:
vars_string.stdout_lines
vars
, aber so oder so, tun Sie das nichtWie ich am besten beurteilen kann, gibt es keine unterstützte Syntax zum Zuweisen beliebiger Host-Fakten der obersten Ebene innerhalb einer Aufgabe.
Sie haben zwei Möglichkeiten: Schreiben Sie diese Variablen in eine Datei und include_vars:
lesen Sie sie dann ein. Dadurch werden sie als Host-Fakten zugewiesen oder Sie geben zu, wie Sie set_fact:
möchten, und geben sich mit den dynamischen Variablen zufrieden, die unter einem bekannten Schlüssel in Host-Fakten leben
Wir werden letzteres zuerst zeigen, weil es kürzer ist:
- set_fact:
my_facts: >-
{{ "{" + (vars_string.stdout_lines
| map('regex_replace', '^([^=]+)=(.+)', '"\1": "\2"')
| join(",")) + "}"
}}
when:
- vars_string.stdout | length > 0
Beachten Sie natürlich, dass Tricks nicht funktionieren, wenn Ihre Schlüssel oder Werte nicht JSON-freundliche Zeichen enthalten. Wenn diese einfache Version jedoch nicht funktioniert, stellen Sie eine Folgefrage, da viel mehr Tricks enthalten sind die gleiche Ader
Der include_vars:
Weg ist:
- tempfile:
state: file
suffix: .json
register: vars_filename
- copy:
dest: '{{ vars_filename.path }}'
content: >-
{{ "{" + (vars_string.stdout_lines
| map('regex_replace', '^([^=]+)=(.+)', '"\1": "\2"')
| join(",")) + "}"
}}
- include_vars:
file: '{{ vars_filename.path }}'
- file:
path: '{{ vars_filename.path }}'
state: absent
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen