Как собрать строку json из списка var - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь создать JSON для использования в задаче Ansible uri POST. У меня есть список «тегов»:

ok: [testserver] => {
    "post_tags": [
        "st_unclass_app", 
        "st_test_app"
    ]
}

И мне нужно создать строку JSON для тела метода POST для задачи URI. Список тегов составляет часть полной строки, поэтому мне нужно создать факт, который является строкой для раздела всего кода JSON. Строка должна выглядеть следующим образом:

{"tag": "st_unclass_app"}, {"tag": "st_test_app"}

Моя проблема двоякая: 1) Количество тегов будет различным, поэтому мне нужно сделать это динамическим по длине. и 2) Строка состоит из символов, относящихся к JSON, и я знаю, что мне придется перемещаться по ней.

До сих пор я не смог найти никаких полезных советов, но все еще ищу. Поиск таких вещей, как «объединить строку в список» и т. Д., Не возвращает ничего полезного.

Вот статическое задание, которое мне нужно выполнить

  - name: Apply tags
      uri:
        url: https://{{ nsxt_host }}/api/v1/fabric/virtual-machines?action=update_tags
        method: POST
        user: "{{ nsxt_user }}"
        password: "{{ nsxt_pass }}"
        force_basic_auth: yes
        validate_certs: no
        headers:
          Content-Type: application/json
          Accept: :application/json,version=2
        body: {"external_id": '{{ nsxt_record.json.results[0].external_id }}', "tags": [{"tag": "st_unclass_app"}, {"tag": "st_test_app"}]}
        body_format: json
      delegate_to: localhost

Я ожидаю, что оно будет выглядеть как-токак это:

  - name: Apply tags
      uri:
        url: https://{{ nsxt_host }}/api/v1/fabric/virtual-machines?action=update_tags
        method: POST
        user: "{{ nsxt_user }}"
        password: "{{ nsxt_pass }}"
        force_basic_auth: yes
        validate_certs: no
        headers:
          Content-Type: application/json
          Accept: :application/json,version=2
        body: {"external_id": '{{ nsxt_record.json.results[0].external_id }}', "tags": ['{{ nsxt_tags }}']}
        body_format: json
      delegate_to: localhost

1 Ответ

0 голосов
/ 29 октября 2019

Я решил это, используя соединение и экранирование двойных кавычек. Вот задача построить JSON:

- name: Build tag string
      set_fact:
        nsxt_tags: "{\"tag\": \" {{ post_tags | join('\"}, {\"tag\": \"') }} \"}"

А вот задача обновления URI:

- name: Apply tags
      uri:
        url: https://{{ nsxt_host }}/api/v1/fabric/virtual-machines?action=update_tags
        method: POST
        user: "{{ nsxt_user }}"
        password: "{{ nsxt_pass }}"
        force_basic_auth: yes
        validate_certs: no
        headers:
          Content-Type: application/json
          Accept: :application/json,version=2
        body: {"external_id": '{{ nsxt_record.json.results[0].external_id }}', "tags": '{{ nsxt_tags }}'}
        body_format: json
      delegate_to: localhost
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...