Использование ansible для синтаксического анализа и перебора json-файла для отправки обратно в curl

#json #ansible

#json #ансибль

Вопрос:

Я пытаюсь проанализировать json с помощью ansible, чтобы затем отправить его обратно в API с помощью команды curl. Я думаю, что with_together, вероятно, лучший способ сделать это, но, похоже, я не могу найти правильный путь json для него, хотя это довольно простой json. Итак, json здесь —

 {
                "deploy-account": [{
                                "role": "roles/iam.serviceAccountTokenCreator",
                                "members": [
                                        "group:group1@google.com",
                                        "group:group2@google.com"
                                ]
                        }
                ],
                "data_account": [{
                                "role": "roles/iam.serviceAccountTokenCreator",
                                "members": [
                                        "group:group1@google.com"
                                ]
                        },
                        {
                                "role": "roles/iam.serviceAccountKeyAdmin",
                                "members": [
                                        "group:group1@google.com"
                                ]
                        }
                ],
                "dataproc_account": [{
                                "role": "roles/iam.serviceAccountTokenCreator",
                                "members": [
                                        "group:group1@google.com"
                                ]
                        },
                        {
                                "role": "roles/iam.serviceAccountKeyAdmin",
                                "members": [
                                        "group:group3@google.com"
                                ]
                        }
                ]
                
        }

 

Идея состоит в том, чтобы взять имя учетной записи как один элемент, а затем взять все под этим именем учетной записи, независимо от того, сколько ролей или групп существует, и добавить это во второй элемент для отправки в API. Но когда я перебираю его, он принимает только одну роль от каждой учетной записи и применяет ее, поэтому мой цикл должен быть неправильным, но я не вижу как. yml выглядит так

       tasks:
      - name: access fact
        set_fact:
        access_auths: "{{ lookup('file', 'stack.json') }}"
     - name: Curl
       uri:
         url: "https://google.com/{{ item.0 }}"
         body:
           policy: 
             bindings: "{{ item.1 }}"
         body_format: json
         method: POST
         headers:
           Content-Type: "application/json"
      with_together: 
        - "{{ access_auths }}"
        - "{{ access_auths | json_query ('*') }}"
 

Таким образом, конечная цель состоит в том, что будет много файлов json с разным количеством учетных записей, а в json будет разное количество подэлементов, и это необходимо обработать,
Идея в этом случае

элемент.0 — элемент deploy-account
.1 — [{«роль»: «роли /iam.serviceAccountTokenCreator»,»участники»: [ «group:group1@google.com «,»group:group2@google.com «]

следующий
элемент цикла.0 —
элемент data_account.1 — [{«роль»: «роли/iam.serviceAccountTokenCreator»,»участники»: [«group:group1@google.com «]},{«роль»: «роли/iam.serviceAccountKeyAdmin»,»участники»: [«group:group1@google.com «]

Однако, как я уже говорил выше, проблема, с которой я сталкиваюсь при запуске этого, заключается в том, что если учетной записи назначены 2 роли, она дважды выполняет цикл и перезаписывает первую роль, есть ли лучший способ доступа к json вместо моего запроса? И является ли with_together лучшим способом?

Ответ №1:

В итоге я использовал with_dict, поскольку ему просто нужны были ключи и значения, и он работал

 loop: "{{ lookup('dict', access_auths) }}"