2017-03-09 1 views
0

Compte tenu de la Playbook suivante:Comment passer des variables Ansible à la requête JMESPath?

--- 
- 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)]" 

Je voudrais passer une variable définie dans ansible bar: ['dd','ee'] à une requête jmes_path comme "[?a == 'cc' && contains ({{bar}} ,b)]". Malheureusement, cela ne fonctionne pas, le script échoue.

fatale: [localhost]: ÉCHEC! => {"failed": true, "msg": "le champ 'args' a une valeur invalide ([]), et n'a pas pu être converti en un dict Erreur: Expecting: comma, got: literal: Erreur d'analyse dans la colonne 28, jeton «dd» (LITERAL), pour l'expression: \ n \ "[? A == 'cc' & & contient ([u'dd ', u'ee'], b L'erreur semble avoir été dans '/home/vagrant/testnew/lieferschein-deployment/stack.yml': ligne 16, colonne 6, mais peut-être \ nêtre ailleurs dans le fichier en fonction du problème de syntaxe exact . \ n \ nLa ligne incriminée semble être: \ n \ n tâches: \ n - débogage: \ n^ici \ n "}

Cependant, la définition de la liste dans la requête elle-même, en ligne comme "[?a == 'cc' && contains (['dd','ee'],b)]", cela fonctionne sans problème

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'}] " 
} 

Est-il possible de mettre une variable Ansible dans la requête, et si oui, comment?

Répondre

2

Change:

bar: ['dd','ee'] 

à:

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

Sinon, il est défini comme un objet, mais vous voulez une chaîne.


Si vous avez déjà une liste définie, vous devez se pencher pour vérifier the documentation, trouver un filtre approprié et de le modifier en fonction de vos besoins:

Pour concaténer une liste dans une chaîne:

{{ list | join(" ") }} 
+0

cela fonctionne, mais dans un vrai playbook je voudrais utiliser une variable définie ailleurs. Donc, dans ce cas, j'aurais besoin de quelque chose pour le convertir en chaîne. – user140547

+0

Donc, le convertir en une chaîne, quel est le problème? – techraf

+0

Et la prochaine fois faire une déclaration claire lors de l'écriture "* Compte tenu du playbook suivant: *" que vous attendez réellement lecteurs d'ignorer "le livret donné" et lisez votre esprit. – techraf