首页 > 解决方案 > 在 Ansible 中遍历包含子元素的字典

问题描述

我必须根据字典创建一个列表。
要从字典中获取元素,我需要加入“服务器”+“域”。问题是我有 3 个不同的域。目前,我正在重复代码以便能够使用 3 个不同的域。

- name: "Get server instances {{ ansible_fqdn }}"
  set_fact:
    app_ps_mon_list: "{{ app_ps_mon_list | default ([]) + [ app_instance ] }}"
  vars:
    app_instance: |
      [Java,<event_type>]
      java    critical 1-
      *ARGS {{item.value.INSTANCE_NAME.split("/")[1]}}
  with_dict: '{{ server_instances[ansible_hostname + "<DOMAIN1>"] }}'
  when:  '{{server_instances[ansible_hostname + "<DOMAIN1>"] is defined and item.key != "SERVER_IMPACT"}}'

- name: "Get server instances {{ ansible_fqdn }}"
  set_fact:
    app_ps_mon_list: "{{ app_ps_mon_list | default ([]) + [ app_instance ] }}"
  vars:
    app_instance: |
      [Java,<event_type>]
      java    critical 1-
      *ARGS {{item.value.INSTANCE_NAME.split("/")[1]}}
  with_dict: '{{ server_instances[ansible_hostname + "<DOMAIN2>"] }}'
  when:  '{{server_instances[ansible_hostname + "<DOMAIN2>"] is defined and item.key != "SERVER_IMPACT"}}'

- name: "Get server instances {{ ansible_fqdn }}"
  set_fact:
    app_ps_mon_list: "{{ app_ps_mon_list | default ([]) + [ app_instance ] }}"
  vars:
    app_instance: |
      [Java,<event_type>]
      java    critical 1-
      *ARGS {{item.value.INSTANCE_NAME.split("/")[1]}}
  with_dict: '{{ server_instances[ansible_hostname + "<DOMAIN3>"] }}'
  when:  '{{server_instances[ansible_hostname + "<DOMAIN3>"] is defined and item.key != "SERVER_IMPACT"}}'

我一直在尝试用_subelements 做同样的事情,但没有成功。我也尝试使用“ansible_fqdn”,但 fqdn 域通常与实际域不匹配(我知道它一团糟)。

有什么解决方法可以避免重复代码吗?

更新

该剧本的想法是从我用作主机的服务器(ansible_hostname 变量)获取解决方案。
获得解决方案后,使用 INSTANCE_NAME 中的一些信息创建一个列表

这是字典的通用版本:

{
  "<server_name><domain>": {
    "<solution_id>": {
      "INSTANCE_NAME": "",
      "SOLUTION_CATEGORY": "",
      "SOLUTION_NAME": ""
    },
    "<solution_id>": {
      "INSTANCE_NAME": "",
      "SOLUTION_CATEGORY": "",
      "SOLUTION_NAME": ""
    },
    SERVER_IMPACT: "",
  ...,

}

这就是列表的样子(它是一个多行字符串变量,愚蠢但有用):

[
  [Java]
  java    critical 1-
  *ARGS <iINSTANCE_NAME info>
], 
[
  [Java]
  java    critical 1-
  *ARGS  <iINSTANCE_NAME info>
]

标签: dictionaryansible

解决方案


推荐阅读