繁体   English   中英

在ansible中使用Jinja2模板创建Json文件

[英]Create Json file using Jinja2 template in ansible

我想根据可用数据创建动态 json 文件。 假设我有如下数据。 那么 jinja 模板应该创建 2 个列表。 如果数据可用 3 次,那么它应该在 jinja 模板中创建 3 个列表。

"datastore_details": [
            {
                "name": "XYZ",
                "size": 6258
            },
            {
                "name": "XYZ-1",
                "size": 32192
            }
 
        ]

 

{
    "company": "Test",
    "table": "data",
    "message_id": "2022222",
    "p_filter": {
        "key": "u_topic",
        "value": "test-datastore"
    },
    "c_filter": {
        "key": "u_topic",
        "value": "test-disk_capacity"
    },
    "p_data": [        
        {
          
            "u_label": "XYZ",
            "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
            "u_value": "XYZ",
            "c_data": [
                {
                    "u_label": "XYZ",
                    "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
                    "u_value": "6258"
                }
            ]
        },
        {
            "u_label": "XYZ-1",
            "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
            "u_value": "XYZ-1",
            "c_data": [
                {
                    "u_label": "XYZ-1",
                    "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
                    "u_value": "32192"
                }
            ]
        }
        
    ]
} 

我不确定如何在这里使用循环来运行 3 或 4 次,具体取决于数据。 使用下面的 jinja 模板。

   {% for n in range(count) %}
            "u_label": "{{ datastore_details[item | int]['name'] }}",
            "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
            "u_value": "{{ datastore_details[item | int]['size'] }}",
            "c_data": [
                {
                    "u_label": "{{ datastore_details[item | int]['name'] }}",
                    "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
                    "u_value": "{{ datastore_details[item | int]['size'] }}"
                }
            ]
    {% endfor %}

首先,您需要将这些变量放入 ansible。 最简单的方法是在清单中定义它们。 如果你不能这样做(例如因为这个 json 文件是在主机上生成的),你可以使用include_vars模块来加载变量。

假设您的变量可供 ansible 访问,您可以像这样在 jinja2 模板中循环遍历列表:

示例库存:

---
all:
  hosts:
    localhost:
      ansible_connection: local
      datastore_details: 
        - name: "XYZ"
          size: 6258
        - name: "XYZ-1"
          size: 32192
        - name: "as-many-as-you-want"
          size: 1337

示例剧本:

---
- hosts: all
  tasks:    

  # if you have your variables somewhere else, use the `include_vars` module here

  - name: template
    template:
      src: tmpl.j2
      dest: /tmp/out.file

示例模板:

... some data ...

{% for d in datastore_details %}
         "u_label": "{{ d['name'] }}",
         "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
         "u_value": "{{ d['size'] }}",
         "c_data": [
             {
                 "u_label": "{{ d['name'] }}",
                 "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
                 "u_value": "{{ d['size'] }}"
             }
         ]

... some data in between ...

{% endfor %}

... some more data ...

输出:

... some data ...

         "u_label": "XYZ",
         "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
         "u_value": "6258",
         "c_data": [
             {
                 "u_label": "XYZ",
                 "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
                 "u_value": "6258"
             }
         ]

... some data in between ...

         "u_label": "XYZ-1",
         "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
         "u_value": "32192",
         "c_data": [
             {
                 "u_label": "XYZ-1",
                 "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
                 "u_value": "32192"
             }
         ]

... some data in between ...

         "u_label": "as-many-as-you-want",
         "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
         "u_value": "1337",
         "c_data": [
             {
                 "u_label": "as-many-as-you-want",
                 "u_catalog_item": "c08c7936db71d4503fa396f8f49619db",
                 "u_value": "1337"
             }
         ]

... some data in between ...


... some more data ...

这里重要的是将您的数据作为变量,我使用清单来做,但是(如前所述)您可以使用include_vars在您正在运行的主机上加载变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM