2

I can't reuse the content of a variable for two different parameters. (host_groups and tags). (Documentation here)

I have a variable in this form :

probe:
  - name: prob1
    groups:
      - group1
      - group2
  - name: prob2
    groups:
      - group1
      - group3

Then, I have a task that loops for each probes that works well.

- name: Probe
  community.zabbix.zabbix_host:
    host_name: "{{ item.name }}"
    host_groups: "{{ item.groups }}"
  loop: "{{ zabbix_sensor }}"

But I would like to add the values I have in the groups variable in the tags parameter of my task.

- name: Probe
  community.zabbix.zabbix_host:
    host_name: "{{ item.name }}"
    host_groups: "{{ item.groups }}"
    tags: "{{ item.groups }}"
  loop: "{{ zabbix_sensor }}"

This doesn't work because it expects the key in the following format - tag: {{value}}. I don't want to create another tag variable containing the same values as groups because the values will be identical.

The result for this to work would be something like :

- name: Probe
  community.zabbix.zabbix_host:
    host_name: probe1
    host_groups: ['group1','group2']
    tags:
      - tag: group1
      - tag: group2

Any idea how to get there?

I've tried a lot of things, but I can't get my result

1 Answers1

3

Use the filter community.general.dict_kv to create the dictionary. For example, given the list

  l: 
    - group1
    - group2

declare the dictionary

  d: "{{ l|map('community.general.dict_kv', 'tag') }}"

gives

  d:
    - tag: group1
    - tag: group2

Example of a complete playbook for testing

- hosts: localhost

  vars:

    zabbix_sensor:
      - name: prob1
        groups:
          - group1
          - group2
      - name: prob2
        groups:
          - group1
          - group3

  tasks:

    - debug:
        msg: |
          host_name: {{ item.name }}
          host_groups: {{ item.groups }}
          tags: {{ item.groups|map('community.general.dict_kv', 'tag') }}
      loop: "{{ zabbix_sensor }}"

gives (abridged)

TASK [debug] *********************************************************************************
ok: [localhost] => (item={'name': 'prob1', 'groups': ['group1', 'group2']}) => 
  msg: |-
    host_name: prob1
    host_groups: ['group1', 'group2']
    tags: [{'tag': 'group1'}, {'tag': 'group2'}]
ok: [localhost] => (item={'name': 'prob2', 'groups': ['group1', 'group3']}) => 
  msg: |-
    host_name: prob2
    host_groups: ['group1', 'group3']
    tags: [{'tag': 'group1'}, {'tag': 'group3'}]

Q: "Have a tag with name and value."

A: Concatenate the lists

    - debug:
        msg: |
          host_name: {{ item.name }}
          host_groups: {{ item.groups }}
          tags: |
            {{ _tags|to_nice_yaml(indent=2)|indent(2) }}
      loop: "{{ zabbix_sensor }}"
      vars:
        _tags: "{{ item.groups|map('community.general.dict_kv', 'tag') +
                   [{'tag': 'name', 'value': item.name}] }}"

gives

TASK [debug] *********************************************************************************
ok: [localhost] => (item={'name': 'prob1', 'groups': ['group1', 'group2']}) => 
  msg: |-
    host_name: prob1
    host_groups: ['group1', 'group2']
    tags: |
      - tag: group1
      - tag: group2
      - tag: name
        value: prob1
ok: [localhost] => (item={'name': 'prob2', 'groups': ['group1', 'group3']}) => 
  msg: |-
    host_name: prob2
    host_groups: ['group1', 'group3']
    tags: |
      - tag: group1
      - tag: group3
      - tag: name
        value: prob2

Q: "For groups, I don't need a value, but in some cases I do."

A: In the example below, any list will be converted to tags only and any other type, expecting a hash, will be converted to the tag and value

- hosts: localhost

  vars:

    zabbix_sensor:
      - name: prob1
        attr1: A
        attr2: B
        groups:
          - group1
          - group2
        regions:
          - r1
          - r2
      - name: prob2
        attr1: C
        attr2: D
        groups:
          - group1
          - group3
        regions:
          - r3
          - r4

  tasks:

    - debug:
        msg: |
          host_name: {{ item.name }}
          host_groups: {{ item.groups }}
          tags: |
            {{ _tags|to_nice_yaml(indent=2)|indent(2) }}
      loop: "{{ zabbix_sensor }}"
      vars:
        _tags_str: |-
          {% for k,v in item.items() %}
          {% if v|type_debug == 'list' %}
          {% for i in v %}
          - tag: {{ i }}
          {% endfor %}
          {% else %}
          - tag: {{ k }}
            value: {{ v }}
          {% endif %}
          {% endfor %}
        _tags: "{{ _tags_str|from_yaml }}"

gives (abridged)

TASK [debug] *********************************************************************************
ok: [localhost] => (item={'name': 'prob1', 'attr1': 'A', 'attr2': 'B', 'groups': ['group1', 'group2'], 'regions': ['r1', 'r2']}) => 
  msg: |-
    host_name: prob1
    host_groups: ['group1', 'group2']
    tags: |
      - tag: name
        value: prob1
      - tag: attr1
        value: A
      - tag: attr2
        value: B
      - tag: group1
      - tag: group2
      - tag: r1
      - tag: r2
ok: [localhost] => (item={'name': 'prob2', 'attr1': 'C', 'attr2': 'D', 'groups': ['group1', 'group3'], 'regions': ['r3', 'r4']}) => 
  msg: |-
    host_name: prob2
    host_groups: ['group1', 'group3']
    tags: |
      - tag: name
        value: prob2
      - tag: attr1
        value: C
      - tag: attr2
        value: D
      - tag: group1
      - tag: group3
      - tag: r3
      - tag: r4
Vladimir Botka
  • 58,131
  • 4
  • 32
  • 63