Mam bramkę, która pyta API Inventory Inventory API i odzyskuje wynik JSON, który zawiera wiele rekordów zgodnie z tym formacie:

{
    "service_level": "Test", 
    "tags": [
        "Application:MyApp1"
    ], 
    "fqdn": "matestsvcapp1.vipcustomers.com", 
    "ip": "172.20.11.237", 
    "name": "matestsvcapp1.vipcustomers.com"
}

Następnie pętlę przez te branżowe zadania, aby zapytać wyników JSON dla każdego z adresów IP, o których zależy mi:

- name: Set JMESQuery
  set_fact:
    jmesquery: "Devices[?ip_addresses[?ip.contains(@,'{{ ip_to_query }}' )]].{ip: '{{ ip_to_query }}', tags: tags[], , service_level: service_level }"

- name: Store values
  set_fact:
    inven_results: "{{ (inven_results| default([])) + (existing_device_info.json | to_json | from_json | json_query(jmesquery)) }}"

Następnie kontynuuję inne zadania w branży, naciskając te dane do innych systemów, a wszystko działa dobrze.

Jednak właśnie otrzymałem prośbę od zarządzania, że chcieliby zobaczyć "poziom usług" reprezentowany jako znacznik w niektórych systemach, do których pcham te dane. Dlatego muszę połączyć przedmioty "Tagi" i "Service_level", co powoduje, że wygląda tak:

{ 
    "tags": [
        "Application:MyApp1",
        "service_level:Test"
    ], 
    "fqdn": "matestsvcapp1.vipcustomers.com", 
    "ip": "172.20.11.237", 
    "name": "matestsvcapp1.vipcustomers.com"
}

Próbowałem modyfikować zapytanie JMespath, aby dołączyć do wyników używając Połącz lub mapuj, ale nie mogłem też dostać żadnych z tych do pracy.

Jakieś myśli we właściwym sposobie radzenia sobie z tym? Z góry dziękuję!

Uwaga: "Tagi" to lista sznurków, a nawet jeśli jest zapisywana w kluczowym formacie: naprawdę jest to tylko ciąg.

1
JoeInVT 17 październik 2020, 13:48

1 odpowiedź

Najlepsza odpowiedź

Aby dodać dwa tablice, używasz operatora +:

ansible localhost -m debug -a 'msg="{{ b + ["String3"] }}"' -e '{"b":["String1", "String2"]}'

Wynik:

localhost | SUCCESS => {
    "msg": [
        "String1",
        "String2",
        "String3"
    ]
}

Więc jeśli weźmieję twój kod JSON jako test.json mógłbyś uruchomić

ansible localhost -m debug -a 'msg="{{ tags + ["service_level:" ~ service_level ] }}"' -e @test.json

Wynik:

localhost | SUCCESS => {
    "msg": [
        "Application:MyApp1",
        "service_level:Test"
    ]
}

Dzięki tej wiedzy możesz użyć SET_FACT, aby umieścić tę nową tablicę w zmiennej do późniejszego użycia.

1
Oliver Gaida 18 październik 2020, 06:29