我当前正在使用Ansible来配置收集的内容,特别是snmp插件。为了创建snmp配置文件,我需要遍历存储在变量中的变量。尽管那是我认为我需要做的。
我设置了默认的主机类型,因此我可以自动知道要收集哪个主机的数据以及所需的MIBS。
types:
mikrotik_switch:
collect:
- "if_speed"
- "temperature"
- "processorTemperature"
- "fanspeed"
mibs:
- mib_mikrotik
tikromik_switch:
collect:
- "sif-peed"
- "rempetature"
- "tocessorPremperature"
- "spanfeed"
mibs:
- mib_tikromik
在同一文件(库存)中,设置以下变量
collectd:
snmp_port: 161
config_: /etc/collectd.conf
snmp_destinations:
- { hostname: "best_server_ever", address: 127.0.0.1, host_type: "{{ types.mikrotik_switch }}", community: "public", version: 2 }
- { hostname: "smallest_server_ever", address: 127.0.0.1, host_type: "{{ types.tikromik_switch }}", community: "public", version: 2 }
现在我要创建以下输出:
<Host "best_server_ever">
Address "127.0.0.1"
Version 2
Community "public"
Collect "if_speed" "temperature" "processorTemperature" "fanspeed"
Interval 120
Timeout 10
Retries 1
</Host>
<Host "smallest_server_ever">
Address "127.0.0.1"
Version 2
Community "public"
Collect "sif_peed" "rempetature" "tocessorPremperature" "spanfeed"
Interval 120
Timeout 10
Retries 1
</Host>
我被困住了,不知道如何遍历存储在变量中的变量。 我目前的任务是:
- name: create collectd config
blockinfile:
path: "{{ collectd_config_file }}"
block: |
<Host "{{item.hostname | default(item.address)}}" >
Address "{{item.address}}"
Version "{{item.version | default(2)}}"
Community "{{item.community | default("public")}}"
Collect "{{item.}}"
</Host>
insertbefore: "^# INSERT HOSTS"
marker: "# {mark} ANSIBLE MANAGED BLOCK FOR HOST: {{item.hostname}}"
with_items: "{{ collectd.snmp_hosts }}"
notify: restart collectd
tags: collectd
有人知道我的问题有什么可能的解决方案吗?
答案 0 :(得分:0)
如果要创建一个新文件,可能最好的最快方法是使用 Jinja2模板作为文件,然后在剧本中使用anem template 模块
如果您正在编辑现有文件,并且只能使用 blockinfile 模块,则可以访问 item.host_type.collect 并使用 join >过滤器,如下所示:
- name: create collectd config
blockinfile:
path: "{{ collectd_config_file }}"
block: |
<Host "{{item.hostname | default(item.address)}}" >
Address "{{item.address}}"
Version "{{item.version | default(2)}}"
Community "{{item.community | default("public")}}"
Collect "{{item.host_type.collect | join('" "')}}"
</Host>
insertbefore: "^# INSERT HOSTS"
marker: "# {mark} ANSIBLE MANAGED BLOCK FOR HOST: {{item.hostname}}"
with_items: "{{ collectd.snmp_destinations }}"
notify: restart collectd
tags: collectd`
注意:请注意with_items循环:循环应该在snmp_destinations上,而不是snmp_hosts