web-dev-qa-db-fra.com

lecture de json comme variable dans ansible

Je suis nouveau chez ansible et j'ai un problème de lecture d'une valeur du fichier json dans le rôle ansible. ma variable a une valeur comme celle-ci:

{
  "queue": {
    "first": {
      "car": "bmw",
      "year": "1990",
      "model": "x3",
      "color": "blue"
    },
    "second": {
      "car": "bmw",
      "year": "2000",
      "model": "318",
      "color": "red"
    }
  }
}

J'essaie d'imprimer la valeur de la couleur uniquement pour la comparer avec une autre variable. J'ai utilisé with_dict pour itérer sur l'objet json (stocké dans une variable appelée jsonVar) comme suit:

- name: test loop
  with_dict: "{{jsonVar}}"
  Shell:  |
        if echo "blue" | grep -q "${{item.value.color}}" ; then
           echo "success"

jusqu'à présent, il n'y a aucune chance d'obtenir la comparaison de la valeur de la couleur de json au "bleu" à partir de l'instruction if. Je me demandais si je fais quelque chose de mal? Merci d'avance!

14
tkyass

Vous pouvez lire un fichier json à l'aide d'un plug-in de recherche appelé file et le transmettre au from_json filtre jinja2. Vous avez également commis une erreur dans le with_dict boucle, car vous devez faire une boucle sur jsonVar['queue'], pas seulement jsonVar. Voici un code complet qui fonctionne:

---
- hosts: your_Host
  vars:
    jsonVar: "{{ lookup('file', 'var.json') | from_json }}"
  tasks:
    - name: test loop
      with_dict: "{{ jsonVar['queue'] }}"
      Shell: |
        if echo "blue" | grep -q "{{ item.value.color }}" ; then
            echo "success"
        fi
13
Strahinja Kustudic

Vous pouvez utiliser le | filtre json_query.

http://docs.ansible.com/ansible/playbooks_filters.html#json-query-filter

Mais assurez-vous que le fichier que vous saisissez est également au format approprié, sinon vous pouvez utiliser deux filtres, le premier pour convertir en filtre approprié et le second pour effectuer une requête json.

ex: - {{ variable_name | from_json | json_query('')}}

Dans votre cas, je pense que cela aiderait:

tasks: print the color
set_fact:
  color1 : "{{ jsonVar | from_json | json_query('queue.[0].['color']')}}"
  color2 : "{{ jsonVar | from_json | json_query('queue.[1].['color']')}}"

Mais notez les exigences comme la version Ansible

8
VaibhavKrishna