循环时ansible改变事实的值

问题描述 投票:0回答:1

我有一个自定义事实,它是字典列表。我需要查看每个字典项的值并可能更改某些值。下面是一个事实示例,我的循环查看每个项目并查询 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 }}"

谢谢

我尝试过很多事情,但我还很新,不知道如何到达那里。

loops ansible
1个回答
0
投票

问:将“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
© www.soinside.com 2019 - 2024. All rights reserved.