ansible - Ansible 嵌套列表到 jinja 模板
问题描述
我正在尝试将嵌套列表传递到 jinja 中,以使用 SNMP 输入插件为 Telegraf 创建配置文件。
到目前为止,我已经能够将以下简单列表解析为合适的配置文件。
列表:
- name: CpuUsage
oid: 1.3.6.1.4.1.5951.4.1.1.41.1.0
- name: mgmt_CPU
oid: 1.3.6.1.4.1.5951.4.1.1.41.6.1.2.8.77.103.109.116.32.67.80.85
- name: MemUsage
oid: 1.3.6.1.4.1.5951.4.1.1.41.2.0
- name: TotRxMbits
oid: 1.3.6.1.4.1.5951.4.1.1.43.27.0
- name: TotTxMbits
oid: 1.3.6.1.4.1.5951.4.1.1.43.30.0
- name: httpTotRequestsRate
oid: 1.3.6.1.4.1.5951.4.1.1.48.76.0
- name: tcpCurClientConnEstablished
oid: 1.3.6.1.4.1.5951.4.1.1.46.12.0
- name: tcpCurServerConnEstablished
oid: 1.3.6.1.4.1.5951.4.1.1.46.10.0
- name: tcpCurClientConnClosing
oid: 1.3.6.1.4.1.5951.4.1.1.46.9.0
进入以下配置:
[[inputs.snmp.field]]
name = "CpuUsage"
oid = "1.3.6.1.4.1.5951.4.1.1.41.1.0"
conversion = "int"
[[inputs.snmp.field]]
name = "mgmt_CPU"
oid = "1.3.6.1.4.1.5951.4.1.1.41.6.1.2.8.77.103.109.116.32.67.80.85"
conversion = "int"
[[inputs.snmp.field]]
name = "MemUsage"
oid = "1.3.6.1.4.1.5951.4.1.1.41.2.0"
conversion = "int"
[[inputs.snmp.field]]
name = "TotRxMbits"
oid = "1.3.6.1.4.1.5951.4.1.1.43.27.0"
conversion = "int"
[[inputs.snmp.field]]
name = "TotTxMbits"
oid = "1.3.6.1.4.1.5951.4.1.1.43.30.0"
conversion = "int"
[[inputs.snmp.field]]
name = "httpTotRequestsRate"
oid = "1.3.6.1.4.1.5951.4.1.1.48.76.0"
conversion = "int"
[[inputs.snmp.field]]
name = "tcpCurClientConnEstablished"
oid = "1.3.6.1.4.1.5951.4.1.1.46.12.0"
conversion = "int"
[[inputs.snmp.field]]
name = "tcpCurServerConnEstablished"
oid = "1.3.6.1.4.1.5951.4.1.1.46.10.0"
conversion = "int"
[[inputs.snmp.field]]
name = "tcpCurClientConnClosing"
oid = "1.3.6.1.4.1.5951.4.1.1.46.9.0"
conversion = "int"
我被困的地方是以下列表
netscaler_citrix_vserver:
- name: name
oid: NS-ROOT-MIB::vsvrName
is_tag: "true"
- name: fullName
oid: NS-ROOT-MIB::vsvrFullName
is_tag: "true"
- name: requests
oid: NS-ROOT-MIB::vsvrTotalRequests
- name: state
oid: NS-ROOT-MIB::vsvrState
- name: servicesUp
oid: NS-ROOT-MIB::vsvrCurServicesUp
netscaler_citrix_vservice:
- name: vserver
oid: NS-ROOT-MIB::vserverFullName
is_tag: "true"
- name: vservice
oid: NS-ROOT-MIB::vsvrServiceFullName
is_tag: "true"
- name: hits
oid: NS-ROOT-MIB::vsvrServiceHits
我尝试了许多变体,但每一个都证明不成功。我正在尝试获得以下输出:
[[inputs.snmp.table]]
name = "netscaler_citrix_vserver"
# oid omitted, to allow collection of specific columns only
[[inputs.snmp.table.field]]
name = "name"
oid = "NS-ROOT-MIB::vsvrName"
is_tag = true
[[inputs.snmp.table.field]]
name = "fullName"
oid = "NS-ROOT-MIB::vsvrFullName"
is_tag = true
[[inputs.snmp.table.field]]
name = "requests"
oid = "NS-ROOT-MIB::vsvrTotalRequests"
[[inputs.snmp.table.field]]
name = "state"
oid = "NS-ROOT-MIB::vsvrState"
[[inputs.snmp.table.field]]
name = "servicesUp"
oid = "NS-ROOT-MIB::vsvrCurServicesUp"
[[inputs.snmp.table]]
name = "netscaler_citrix_vservice"
# oid omitted, to allow collection of specific columns only
[[inputs.snmp.table.field]]
name = "vserver"
oid = "NS-ROOT-MIB::vserverFullName"
is_tag = true
[[inputs.snmp.table.field]]
name = "vservice"
oid = "NS-ROOT-MIB::vsvrServiceFullName"
is_tag = true
[[inputs.snmp.table.field]]
name = "hits"
oid = "NS-ROOT-MIB::vsvrServiceHits"
基本上我需要引用顶级条目,并且对于每个顶级条目,还需要列出子级条目。
任何帮助,将不胜感激。
用于创建第一个列表的代码非常简单,如下所示:
[[inputs.snmp.field]]
name = "{{ item.name }}"
oid = "{{ item.oid }}"
{% endfor %}
对于 SNMP 表代码,我已采用如下方式显式声明表名:
[[inputs.snmp.table]]
name = "netscaler_citrix_vserver"
{% for item in netscaler_citrix_vserver %}
[[inputs.snmp.table.field]]
name = "{{ item.name }}"
oid = "{{ item.oid }}"
{% if item.is_tag is defined %}
is_tag = {{item.is_tag}}
{% endif %}
{% endfor %}
[[inputs.snmp.table]]
name = "netscaler_citrix_vservice"
{% for item in netscaler_citrix_vservice %}
[[inputs.snmp.table.field]]
name = "{{ item.name }}"
oid = "{{ item.oid }}"
{% if item.is_tag is defined %}
is_tag = {{item.is_tag}}
{% endif %}
{% endfor %}
解决方案
当然,一旦我发布了相关问题中另一个问题的答案,就会弹出。用以下代码解决
{% for input_snmp_table in input_snmp_tables recursive %}
[[inputs.snmp.table]]
name = {{ input_snmp_table.table_name }}
{% for input_snmp_table_fields in input_snmp_table.input_snmp_table_fields %}
[[inputs.snmp.table.field]]
name = "{{ input_snmp_table_fields.name }}"
oid = "{{ input_snmp_table_fields.oid}}"
{% if input_snmp_table_fields.is_tag is defined %}
is_tag = {{input_snmp_table_fields.is_tag}}
{% endif %}
{% endfor %}
{% endfor %}```
推荐阅读
- c# - 错误代码:1136 列计数与第 1 行的值计数不匹配
- javascript - 从 laravel 到 vue.js 验证后如何显示数组响应中的错误(基于索引)
- c# - 如何将 MySQL 8.0 (X DevAPI) 表数据放入 WPF DataGrid?
- regex - 除非它包含特定单词,否则如何匹配找到的所有字符串?
- elasticsearch - 在 ElasticSearch ver_6.2.4 中,scroll_size 可以有多大?
- google-sheets - 如何用最后一个非空白单元格填充列中的空白
- python - 编辑特征向量并使用 Conv net 应用分类
- javascript - 按钮内的三元运算符并调用函数
- wordpress - 如何在 Wordpress 上使用小部件
- json - 大十进制问题