2017-12-05 3 views
0

ich eine JSON-Datenstruktur beschneiden (eigentlich YAML) und will die stucture neu zu formatieren, kann aber nicht herausfinden, wie dies zu umgehen richtig zu arbeiten. Dies wird innerhalb einer jinja2-Vorlage in Ansible verwendet. Das Tool, das ich zu verwenden versucht habe, ist der json_query-Filter, der JMESPath verwendet.JMESPath - wie ein Baum

Eingang:

"users": { 
    "Administrators": [ 
    "user1", 
    "user2": { 
     "ssh_keys": "...." 
    }, 
    "user3" 
    ], 
    "Users": [ 
    "user4" 
    ] 
} 

Ich möchte diese JSON in diese reformieren (Abstreifen des ssh_key Teil im Prozess)

"Administrators": [ 
    "user1", 
    "user2", 
    "user3" 
], 
"Users": [ 
    "user4" 
] 

Wie kann ich in jinja2 das tun? Ich habe den json_query-Filter gefunden, der das richtige Werkzeug für den Job zu sein scheint, aber ich habe keine Suchanfrage gefunden, die erfüllt, wonach ich suche.

Antwort

1

Zuerst würde ich empfehlen, die JSON neu formatieren, wenn Sie können. Ein gutes Format würde dies extrem einfach, zum Beispiel:

"users": { 
    "Administrators": [ 
    {"name": "user1, "ssh_keys": None}, 
    {"name": "user2, "ssh_keys": "...."}, 
    {"name": "user3, "ssh_keys": None}, 
    ], 
    "Users": [ 
    "user4" 
    ] 
} 

Wenn Ihr nicht in der Lage, dies zu tun, versuchen Sie dies (dies bezieht sich auf die Administrators aber gilt für was auch immer):

- set_fact: 
     admins: "{{ (users | json_query(item) | default([])) | union(admins | default([])) }}" 
    with_items: 
     - "Administrators[?type(@) == 'object'][keys(@)][][]" 
     - "Administrators[?type(@)=='string']" 

Dies würde Erstellen Sie ein admins Array mit nur Benutzernamen von Ihren Benutzern json. als Sie eine andere Tatsache einstellen, dass Administratoren und Benutzer

+0

Danke enthält! In meinem Fall war die erste Lösung tatsächlich eine Option, aber es ist auch gut, den zweiten Ansatz zu kennen! –