我有一个自定义事实,它是字典列表。我需要查看每个字典项的值并可能更改某些值。下面是一个事实示例,我的循环查看每个项目并查询 api 以获取与 bt_device 相关的信息,并可能更改该值
[
{
"at_device": "sw",
"at_name": "GigabitEthernet0/5",
"at_type": "dcim.interface",
"bt_device": "sw2",
"bt_name": "GigabitEthernet1/0/2",
"bt_type": "dcim.interface"
},
{
"at_device": "sw",
"at_name": "GigabitEthernet0/8",
"at_type": "dcim.interface",
"bt_device": "sw3",
"bt_name": "GigabitEthernet1/0/5",
"bt_type": "dcim.interface"
}
]
所以根据查询我需要将“sw3”更改为“fp3”
以下任务可以在屏幕上显示我想要更改的数据,但我无法根据需要跳跃到修改事实中的值。
- name: load custom fact
ansible.builtin.set_fact:
custom_fact: "{{ custom_fact | default([]) + [{ 'at_device' : ansible_net_hostname, 'at_name' : item.key, 'at_type' : 'dcim.interface', 'bt_device' : item.value[0].host, 'bt_name' : item.value[0].port, 'bt_type' : 'dcim.interface'}] }}"
loop: "{{ ansible_facts | dict2items }}"
- name: modify custom fact via query
debug:
msg: "{{ query(NetBoxy stuff).device.name }}"
when: "query(NetBoxy stuff) | length > 0"
loop: "{{ custom_fact }}"
谢谢
我尝试过很多事情,但我还很新,不知道如何到达那里。
问:将“sw3”更改为“fp3”。
A:解决方案取决于数据的结构。例如,给定字典
update:
key: bt_device
regex: sw3
replace: fp3
以下声明
result: "{{ devices | rejectattr(update.key, 'regex', update.regex) +
devices | selectattr(update.key, 'regex', update.regex) |
zip([{update.key: update.replace}]) |
map('combine') }}"
给你想要的
result:
- at_device: sw
at_name: GigabitEthernet0/5
at_type: dcim.interface
bt_device: sw2
bt_name: GigabitEthernet1/0/2
bt_type: dcim.interface
- at_device: sw
at_name: GigabitEthernet0/8
at_type: dcim.interface
bt_device: fp3
bt_name: GigabitEthernet1/0/5
bt_type: dcim.interface
用于测试的完整剧本示例
- hosts: localhost
vars:
devices:
- at_device: sw
at_name: GigabitEthernet0/5
at_type: dcim.interface
bt_device: sw2
bt_name: GigabitEthernet1/0/2
bt_type: dcim.interface
- at_device: sw
at_name: GigabitEthernet0/8
at_type: dcim.interface
bt_device: sw3
bt_name: GigabitEthernet1/0/5
bt_type: dcim.interface
update:
key: bt_device
regex: sw3
replace: fp3
result: "{{ devices | rejectattr(update.key, 'regex', update.regex) +
devices | selectattr(update.key, 'regex', update.regex) |
zip([{update.key: update.replace}]) |
map('combine') }}"
tasks:
- debug:
var: result