首页 > 解决方案 > 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 %}

标签: ansiblejinja2

解决方案


当然,一旦我发布了相关问题中另一个问题的答案,就会弹出。用以下代码解决

{% 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 %}```

推荐阅读