2017-03-09 5 views
0

das folgende Textbuch Gegeben:Wie übergibt Ansible-Variablen an JMESPath Abfrage?

--- 
- name: "foo bar" 
    hosts: localhost 
    connection: local 
    gather_facts: false 
    vars: 
    foo: 
    - 
     a: aa 
     b: bb 
    - 
     a: cc 
     b: dd 

    tasks: 
    - debug: 
     msg: " filter {{foo}} to {{ foo | json_query(query)}} " 

    vars: 
     bar: ['dd','ee'] 
     query: "[?a == 'cc' && contains (['dd','ee'],b)]" 
     #query: "[?a == 'cc' && contains ({{bar}} ,b)]" 

Ich mag würde eine Variable in ansible bar: ['dd','ee'] zu einer jmes_path Abfrage wie "[?a == 'cc' && contains ({{bar}} ,b)]" definiert passieren. Leider funktioniert das nicht, das Skript schlägt fehl.

fatal: [localhost]: FEHLGESCHLAGEN! => {"failed": true, "msg": "Das Feld 'args' hat einen ungültigen Wert ([]) und konnte nicht in ein dict konvertiert werden. Fehler war: Expected: comma, hat: literal: Parse-Fehler in Spalte 28, Token \ "dd \" (LITERAL), für Ausdruck: \ n \ "[? A == 'cc' & ([u'dd ', u'ee'], b)] \ "\ n^\ n \ nDer Fehler scheint in '/home/vagrant/testnew/lieferschein-deployment/stack.yml' zu sein: Zeile 16, Spalte 6, kann aber \ nwo anderswo sein Datei hängt von dem genauen Syntaxproblem ab. \ n \ nDie folgende Zeile scheint zu sein: \ n \ n Aufgaben: \ n - debug: \ n^here \ n "}

jedoch definieren, die Liste in der Abfrage selbst, Inline wie "[?a == 'cc' && contains (['dd','ee'],b)]", funktioniert es ohne Probleme

TASK [debug] ******************************************************************* 
ok: [localhost] => { 
    "msg": " filter [{u'a': u'aa', u'b': u'bb'}, {u'a': u'cc', u'b': u'dd'}] to [{u'a': u'cc', u'b': u'dd'}] " 
} 

Ist es möglich, eine ansible Variable in die Abfrage zu setzen, und wenn ja, wie?

Antwort

2

Wechsel:

bar: ['dd','ee'] 

zu:

bar: "['dd','ee']" 

Ansonsten wird es als ein Objekt definiert, aber Sie wollen einen String.


Wenn Sie bereits eine Liste definiert haben, müssen Sie die Überprüfung the documentation bücken, einen geeigneten Filter finden und ändern Sie es an Ihre Bedürfnisse anpassen:

Um eine Liste in einen String verketten:

+0

das funktioniert, aber in einem echten playbook möchte ich eine Variable verwenden, die woanders definiert ist. In diesem Fall würde ich etwas brauchen, um es in eine Zeichenfolge umzuwandeln. – user140547

+0

Also konvertieren Sie es in eine Zeichenfolge, was ist das Problem? – techraf

+0

Und das nächste Mal machen Sie eine klare Aussage, wenn Sie schreiben "* Gegeben das folgende playbook: *", dass Sie tatsächlich erwarten, dass Leser "das gegebene playbook" ignorieren und Ihre Meinung lesen. – techraf

Verwandte Themen