--- - name: Check if target file exists ansible.builtin.stat: path: '{{ _target_path }}' register: _target_file_stat delegate_to: '{{ prometheus_target_host }}' - name: Read target file ansible.builtin.slurp: src: '{{ _target_path }}' register: _target_file_content delegate_to: '{{ prometheus_target_host }}' when: _target_file_stat.stat.exists - name: Parse YAML and add host to matching target group ansible.builtin.set_fact: _updated_targets: >- {%- set targets = (_target_file_content.content | b64decode | from_yaml) if _target_file_stat.stat.exists else [] -%} {%- set targets = targets if targets is not none else [] -%} {%- set ns = namespace(found=false, result=[], match=true) -%} {%- for group in targets -%} {%- set group_labels = group.labels | default({}) -%} {%- set ns.match = true -%} {%- if _target_labels | length != group_labels | length -%} {%- set ns.match = false -%} {%- else -%} {%- for key, value in _target_labels.items() -%} {%- if group_labels.get(key) != value -%} {%- set ns.match = false -%} {%- endif -%} {%- endfor -%} {%- endif -%} {%- if ns.match -%} {%- if _target_host not in group.targets -%} {%- set _ = group.targets.append(_target_host) -%} {%- endif -%} {%- set ns.found = true -%} {%- set _ = ns.result.append(group) -%} {%- else -%} {%- set filtered_targets = group.targets | reject('equalto', _target_host) | list -%} {%- if filtered_targets | length > 0 -%} {%- if group_labels | length > 0 -%} {%- set _ = ns.result.append({'labels': group_labels, 'targets': filtered_targets}) -%} {%- else -%} {%- set _ = ns.result.append({'targets': filtered_targets}) -%} {%- endif -%} {%- endif -%} {%- endif -%} {%- endfor -%} {%- if not ns.found -%} {%- if _target_labels | length > 0 -%} {%- set new_group = {'labels': _target_labels, 'targets': [_target_host]} -%} {%- else -%} {%- set new_group = {'targets': [_target_host]} -%} {%- endif -%} {%- set _ = ns.result.append(new_group) -%} {%- endif -%} {{ ns.result }} - name: Write updated target file ansible.builtin.copy: content: '{{ _updated_targets | to_nice_yaml(indent=2, width=1337) }}' dest: '{{ _target_path }}' mode: '0644' delegate_to: '{{ prometheus_target_host }}' become: true register: _yaml_result - name: Track changes ansible.builtin.set_fact: changed: '{{ changed | default(false) or _yaml_result.changed }}'