Использование модуля url с шаблонами jinja2 - PullRequest
0 голосов
/ 28 февраля 2019

Я знаю, как обрабатывать jinja2 шаблоны файлы и позволять им создавать файлы.Я также знаю, как POST к веб-сервисам, используя модуль url .Сейчас я использую такой код, который успешно передает жестко закодированный JSON в мой удаленный сервис:

  tasks:
    - name: GSA app definition
      uri:
        url: "http://localhost:8764/api/apps?relatedObjects=false"
        method: POST
        force_basic_auth: yes
        user: "{{ admin_name }}"
        password: "{{ admin_pass }}"
        body_format: json
        body: "{\"name\":\"My new app\", \"description\":\"A really great new app\" }"
        follow_redirects: all
        status_code: 200
        timeout: 15
      register: app_gsa_cfg

Но JSON статичен, как я могу обработать шаблон jinja2 и POST его содержимое?Я бы предпочел не создавать временные файлы на диске и не помещать их POST, я ищу прямое соединение или, возможно, подход, который помещает результат обработки шаблона в строку.

Для начала шаблон jinja2 мог быПохоже, позже я тоже добавлю переменные:

{#
This file creates the basic GSA app in Fusion. See https://doc.lucidworks.com/fusion-server/4.2/reference-guides/api/apps-api.html#create-a-new-app for details
#}

{
  "name": "GSA",
  "description": "Contains all configuration specific to the migrated GSA legacy searches"
}

(я знаю, что это имеет небольшое преимущество по сравнению со статическим json, включенным в сборник пьес. Но его легче редактировать и он дает мне возможность получить(стиль jinja) комментарии в Json, что обычно невозможно)

1 Ответ

0 голосов
/ 28 февраля 2019

В моем случае я делаю следующее:

У меня есть API, поэтому я делаю следующее:

- name: Change API Status
  uri:
    url: "{{ enpoint }}/v1/requests/{{ whatever }}"
    method: PATCH
    user: "{{ tokenid }}"
    password: x
    headers:
      X-4me-Account: "myaccount"
    body: '{ "status":"{{ reqstatus }}" }'
    body_format: json
    status_code:
      - 201
      - 200
    force_basic_auth: true
    validate_certs: false
    return_content: true

Тогда ваша reqstatus переменная изменится.

Даже вы можете добавить весь текст в виде yaml, импортировать в переменную и конвертировать с фильтрами {{ some_variable | to_json }}

Примечание. Обратите внимание на форматирование без экранирования кавычек.Это поможет.

Нет смысла создавать файл с помощью jinja2, если вы не собираетесь копировать его удаленно.Ansible изначально поддерживает jinja, но его сильной стороной является возможность иметь плагины для лучшей поддержки.Между модулями template (или win_template) нет никакой разницы, если (как сказано) не скопировать файл куда-нибудь.Посмотрите этот пример:

---
- name: Adhoc Jinja
  hosts: localhost
  connection: local
  gather_facts: false

  vars:
    mytemplate:
      - name: "GSA"
        description: "Contains all configuration specific to the migrated GSA legacy searches"
      - name: "Another Name"
        description: "Contains Another Var"

  tasks:
    - name: Read Vars Loop
      debug:
        msg: "{{ item | to_json }}"
      with_items: "{{ mytemplate }}"

    - name: Include Vars
      include_vars: adhocjinja2.yml

    - name: Read Vars Loop
      debug:
        msg: "{{ item | to_json }}"
      with_items: "{{ mytemplate }}"

И adhocjinja2.yml:

mytemplate:
  - name: "GSA2"
    description: "Contains all configuration specific to the migrated GSA legacy searches"
  - name: "Another Name 2"
    description: "Contains Another Var"

Вывод:

TASK [Read Vars Loop] **************************************************************************************
ok: [localhost] => (item={'name': 'GSA', 'description': 'Contains all configuration specific to the migrated GSA legacy searches'}) => {
    "msg": "{\"name\": \"GSA\", \"description\": \"Contains all configuration specific to the migrated GSA legacy searches\"}"
}
ok: [localhost] => (item={'name': 'Another Name', 'description': 'Contains Another Var'}) => {
    "msg": "{\"name\": \"Another Name\", \"description\": \"Contains Another Var\"}"
}

TASK [Include Vars] ****************************************************************************************
ok: [localhost]

TASK [Read Vars Loop] **************************************************************************************
ok: [localhost] => (item={'name': 'GSA2', 'description': 'Contains all configuration specific to the migrated GSA legacy searches'}) => {
    "msg": "{\"name\": \"GSA2\", \"description\": \"Contains all configuration specific to the migrated GSA legacy searches\"}"
}
ok: [localhost] => (item={'name': 'Another Name 2', 'description': 'Contains Another Var'}) => {
    "msg": "{\"name\": \"Another Name 2\", \"description\": \"Contains Another Var\"}"
}

Вы можете управлять своими переменными, как вы хотите, и создатьу твоего json на лету, как у Ansible, есть jinja, а json - его сердце.

...