Ansible zufällige Generierung der UUID
In meinem Ansible Skript, ich möchte UUIDs auf die Fliegen, und verwenden Sie Sie später.
Hier ist mein Ansatz:
- shell: echo uuidgen
with_sequence: count=5
register: uuid_list
- uri:
url: http://www.myapi.com
method: POST
body: "{{ item.item.stdout }}"
with_items: uuid_list.result
Jedoch bekomme ich die folgende Fehlermeldung:
fatal: [localhost] => One or more undefined variables: 'str object' has no attribute 'stdout'
Wie kann ich dieses Problem lösen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In ansible 1.9 gibt es einen neuen filter : to_uuid , die in einem gegebenen Zeichenfolge zurück ansible domain-specific-UUID,die Sie finden können für die Nutzung in der hier https://docs.ansible.com/playbooks_filters.html#other-useful-filters
{{ ansible_date_time.iso8601_micro | to_uuid }}
zu einem echten uuid.Als metioned von Gao Xingxing, es ist
to_uuid
die verwendet werden können, mit einer ausreichend großen Anzahl und derrandom
filter erzeugen eine zufällige UUID. Je größer die Zahl, desto größer der Zufall. eg:oder
Dies ist sehr nahe. Ich hatte nur ein paar Dinge ändern. Ich dachte, dies aus, indem Sie die Aufgabe "
debug: var=uuid_list
" und Durchlaufen.Hinweise:
echo
verursacht die Zeichenfolgeuuidgen
gedruckt werden. entferntecho
gehaltenuuidgen
.item.item.stdout
werden mussteitem.stdout
uuid_list.stdout
werden mussteuuid_list.results
Einer Lösung, die sollten immun sein caching/veraltete Tatsache sammeln und geben Sie eine halbwegs zufällige UUID jedes mal, wenn Sie es verwenden, ist:
{{ (999999999999999999999 | random | string + (lookup('pipe', 'date +%s%N'))) | to_uuid() }}
Es wird eine zufällige Zahl zwischen 0 und 999999999999999999999 mit aktuellen Nanosekunden seit der Unix-Epoche und feeds, die durch Ansible ist to_uuid() filter (verfügbar seit version 1.9). Tatsache caching sollte nicht zu einem problem führen, wie lookups werden immer ausgewertet, die jeder und jedes mal, wenn Sie aufgerufen werden.
Wenn Sie möchten, eine UUID, die bleibt konstant über das ganze spielt in einem playbook (aber nicht weiterhin zwischen mehreren Anrufungen des playbook - auch mit der Tat für die das Zwischenspeichern aktiviert), dann verwenden:
set_fact: uuid={{ (999999999999999999999 | random | string + (lookup('pipe', 'date +%s%N'))) | to_uuid() }}
9999....))
damit es erbricht das Datum verkettet mit der uuid anstelle der Generierung von uuid aus Datum+Zufallszahl.{{ (999999999999999999999 | random | string + ansible_date_time.iso8601_micro) | to_uuid() }}
funktioniert bei mir ohne diese nutzlose Rohr-lookup2**ansible_userspace_bits
statt999999999999999999999
Sinn macht ....Bewusst sein, wenn Sie mit Willem-Lösung, Jinja und Ansible wird der cache das Ergebnis für mehrere Ausführungen des gleichen filters, so müssen Sie die Nummer der Quelle jedes mal, wenn
und für Situationen, in denen Sie einen normalen md5 anstelle von to_uuid, hash('md5') nicht nehmen, eine ganze Zahl. Der bequemste Weg, um konvertieren Sie das zufällige, um eine Zeichenfolge, die ich gefunden habe, ist to_uuid: