有没有办法使该变量在变量内起作用?

时间:2019-04-01 14:32:01

标签: ansible

我当前正在使用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

有人知道我的问题有什么可能的解决方案吗?

1 个答案:

答案 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