Puncte:1

json_query ajutor - nu produce rezultatul așteptat

drapel cn

Încerc să construiesc o matrice pe care să o folosesc cu_cuiburi, dar nu pot trece de ce json_query nu emite gazdele reale atribuite fiecărui cluster:

Joaca:

- nume: Index clusters.json
  shell: cat {{ tower_var_path }}/clusters.json
  register: result_clusters

- nume: Salvați datele Json într-o variabilă ca fapt
  set_fact: 
    clusters_jsondata: „{{ result_clusters.stdout | from_json }}”

- depanare:
    msg: "{{ clusters_jsondata }}"

- nume: setați faptele cluster
  set_fact:
    cluster: „{{ cluster|implicit([]) + [ {
      „nume”: articol,
      „gazde”: element | json_query('*.hosts[*].name')
       } ] }}"  
  with_items: „{{ clusters_jsondata.clusters }}”      

- depanare: 
    msg: „{{ cluster }}”

date clusters.json:

    {
    „clusters”: {
        „Cluster_1”: {
            „gazde”: [
                {
                    „folder”: „/cale”,
                    „nume”: „gazdă1.domeniu.com”
                },
                {
                    „folder”: „/cale”,
                    „nume”: „gazdă2.domeniu.com”
                }
            ],

        },
        „Cluster_2”: {
            „gazde”: [
                {
                    „folder”: „/cale”,
                    „nume”: „gazdă3.domeniu.com”
                },
                {
                    „folder”: „/cale”,
                    „nume”: „gazdă4.domeniu.com”
                }
            ],

        },
    }

Rezultate asteptate:

SARCINA [depanare] ************************************************ **************************************************** **************************************************** ********************************************
ok: [localhost] => {
    "msg": [
        {
            „hosts”: „host1.domain.com, host2.domain.com”,
            "name": "Cluster_1"
        },
        {
            „hosts”: „host3.domain.com, host4.domain.com”,
            "name": "Cluster_2"
        }
    ]
}

Rezultate actuale:

    SARCINA [depanare] ************************************************ **************************************************** **************************************************** ********************************************
ok: [localhost] => {
    "msg": [
        {
            „gazde”: nul,
            "name": "Cluster_1"
        },
        {
            „gazde”: nul,
            "name": "Cluster_2"
        }
    ]
}
Puncte:2
drapel fr

Pe scurt, puteți obține rezultatul cu o singură expresie fără bucle.

Următorul manual de joc:

---
- gazde: localhost
  gather_facts: false

  vars:
    # Datele dvs. originale pe o singură linie pentru lizibilitate
    result_clusters:
      stdout: >-
        {"clusters":{"Cluster_1":{"hosts":[{"folder":"/path","name":"host1.domain.com"},{"folder":"/path"," name":"host2.domain.com"}]},"Cluster_2":{"hosts":[{"folder":"/path","name":"host3.domain.com"},{"folder ":"/path","name":"host4.domain.com"}]}}}

  sarcini:
    - nume: obține rezultatul așteptat din datele json într-o singură sarcină
      vars:
        interogare: >-
          [].{nume: cheie, gazde: join(', ', value.hosts[].name)}
        clustere: „{{ (result_clusters.stdout | from_json).clusters }}”
      depanare:
        msg: „{{ clustere | dict2items | json_query(interogare) }}”

Oferă:

PLAY [localhost] ************************************************ ********

SARCINA [obține rezultatul așteptat din datele json într-o singură sarcină] *********
ok: [localhost] => {
    "msg": [
        {
            „hosts”: „host1.domain.com, host2.domain.com”,
            "name": "Cluster_1"
        },
        {
            „hosts”: „host3.domain.com, host4.domain.com”,
            "name": "Cluster_2"
        }
    ]
}

JOACĂ RECAPITULARE ************************************************ ************
localhost: ok=1 schimbat=0 inaccesibil=0 eșuat=0 omis=0 salvat=0 ignorat=0

Notă: deși cele de mai sus oferă foarte precis rezultatul pe care l-ați cerut, bănuiesc puternic că căutați un rezultat ușor diferit. Înlocuirea interogării de mai sus cu:

        interogare: >-
          [].{nume: cheie, gazde: value.hosts[].name}

va da asta in schimb:

SARCINA [obține rezultatul așteptat din datele json într-o singură sarcină] ************************************ **************************************************** **************************************************** **********************************
ok: [localhost] => {
    "msg": [
        {
            „gazde”: [
                „host1.domain.com”,
                „host2.domain.com”
            ],
            "name": "Cluster_1"
        },
        {
            „gazde”: [
                „host3.domain.com”,
                „host4.domain.com”
            ],
            "name": "Cluster_2"
        }
    ]
}

drapel cn
Perfect! Mulțumesc. Mult diferit de ceea ce mă gândeam, deci ai fi atât de amabil să oferi un link către o resursă care ar putea explica cum ai ajuns la această abordare?
Zeitounator avatar
drapel fr
Cu greu găsesc un link care să trimită la un rezumat al experienței mele de a trata astfel de probleme în ultimii peste 8 ani ;) Între timp, trei puncte de plecare bune legate de subiect: [jinja2 builtin filters](https://jinja.palletsprojects .com/en/3.0.x/templates/#list-of-builtin-filters), [filtre ansilble](https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html) și [tutorial jmespath ](https://jmespath.org/tutorial.html)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.