【发布时间】:2020-10-16 15:06:06
【问题描述】:
因此,我正在使用 Ansible,并且正在从某些设备中检索特定信息。特别是,我有这样的任务:
<rpc-reply message-id="urn:uuid:1914-b84d7ff">
<lldp-neighbors-information style="brief">
<lldp-neighbor-information>
<lldp-local-port-id>A1</lldp-local-port-id>
<lldp-local-parent-interface-name>-</lldp-local-parent-interface-name>
<lldp-remote-chassis-id-subtype>A2</lldp-remote-chassis-id-subtype>
<lldp-remote-chassis-id>A3</lldp-remote-chassis-id>
<lldp-remote-port-id-subtype>A4</lldp-remote-port-id-subtype>
<lldp-remote-port-id>A5</lldp-remote-port-id>
<lldp-remote-system-name>A6</lldp-remote-system-name>
</lldp-neighbor-information>
<lldp-neighbor-information>
<lldp-local-port-id>B1</lldp-local-port-id>
<lldp-local-parent-interface-name>-</lldp-local-parent-interface-name>
<lldp-remote-chassis-id-subtype>B2</lldp-remote-chassis-id-subtype>
<lldp-remote-chassis-id>B3</lldp-remote-chassis-id>
<lldp-remote-port-id-subtype>B4</lldp-remote-port-id-subtype>
<lldp-remote-port-id>B5</lldp-remote-port-id>
<lldp-remote-system-name>B6</lldp-remote-system-name>
</lldp-neighbor-information>
<lldp-neighbor-information>
<lldp-local-port-id>C1</lldp-local-port-id>
<lldp-local-parent-interface-name>-</lldp-local-parent-interface-name>
<lldp-remote-chassis-id-subtype>C2</lldp-remote-chassis-id-subtype>
<lldp-remote-chassis-id>C3</lldp-remote-chassis-id>
<lldp-remote-port-id-subtype>C4</lldp-remote-port-id-subtype>
<lldp-remote-port-id>C5</lldp-remote-port-id>
</lldp-neighbor-information>
</lldp-neighbors-information>
</rpc-reply>
我的目标是建立一个这样的字典:
{'A6': ['A1', 'A2'], 'B6': ['B1', 'B2']}
我所做的是通过执行以下任务创建一个包含所有密钥的列表:
- name: Retrieve lldp system names
xml:
xmlstring: "{{ item.string | regex_replace('\n', '') }}"
xpath: "{{ item.path }}"
content: text
loop:
- { path: "/rpc-reply/lldp-neighbors-information/lldp-neighbor-information/lldp-remote-system-name", string: "{{xml_reply.xml}}" }
register: sys_names
- name: Save all sys names in a list
set_fact:
sys_names_list: "{{ sys_names.results[0].matches | map('dict2items') | list | json_query('[].value') }}"
然后我可以分别为元素 [A1, B1] 和第三个列表 [A2, B2] 创建第二个列表。所以我可以结合这 3 个列表并创建我的字典。
所以这里有3个问题:
- 有没有办法直接从 xml 元素构建 ansible-dictionary 还是我应该继续编写自己的模块?
- 由于最后一个元素 C6 将是我的第三个键但不存在,我想跳过它。在我上面的任务中怎么可能?
- 如何组合这 3 个列表并创建我的字典,跳过第 3 个元素?否则我的列表将与正确的信息不匹配..
【问题讨论】:
-
我认为您应该将所有逻辑放入过滤器插件中,以保持您的剧本可读。你正在尝试实现一个复杂的算法,在这种情况下 python 比 ansible/jinja2 更好
-
有没有办法在 ansible 中解决上述任何问题?
标签: loops dictionary ansible