使用url模块和jinja2模板

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用url模块和jinja2模板相关的知识,希望对你有一定的参考价值。

我知道如何处理jinja2 templates文件并让他们创建文件。我也知道如何使用url模块POST到webservices。现在我使用这样的代码,它成功地将硬编码的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没有什么优势。但是更容易编辑并且让我有机会在Json中获得(jinja风格)评论,这通常是不可能的)

答案

就我而言,我所做的是以下内容:

我有一个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 var会改变。

即使您可以将整个文本添加为​​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它的核心。

以上是关于使用url模块和jinja2模板的主要内容,如果未能解决你的问题,请参考以下文章

二十一:jinja2之模板继承

Python Flask模块

flask框架下的jinja2模板引擎

自动化运维工具-Ansible Jinja2模板

Flask模板jinja2

Python 模板模块-Jinjia2