You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible Playbook中将注册的WireGuard地址转为指定变量?

解决方法:将注册的循环结果转为可直接调用的变量

方案1:创建独立变量(满足wg1.address形式需求)

添加一个set_fact任务,遍历注册的查询结果,为每个WireGuard接口生成包含address字段的独立变量:

- name: 为每个WireGuard接口设置地址变量
  ansible.builtin.set_fact:
    "{{ item.item.name }}":
      address: "{{ item.msg[0].address }}"
  loop: "{{ extended_queryout.results }}"

逻辑说明

  • loop: "{{ extended_queryout.results }}":遍历注册结果列表,每个元素对应一个接口的查询返回值
  • item.item.name:提取当前循环项对应的接口名称(wg1/wg2/wg3)
  • item.msg[0].address:从查询结果的msg列表中取出第一个条目的IPv6地址(每个接口仅返回一条链路本地地址)
  • 动态生成以接口名为变量名的字典,直接通过wg1.address、wg2.address调用

方案2:创建集中字典变量(更易批量管理)

如果希望将所有地址集中存储,可生成一个统一字典:

- name: 整理WireGuard地址到统一字典
  ansible.builtin.set_fact:
    wg_addresses: "{{ wg_addresses | default({}) | combine({ item.item.name: item.msg[0].address }) }}"
  loop: "{{ extended_queryout.results }}"

后续通过wg_addresses.wg1、wg_addresses.wg2形式访问对应地址。

完整修改后的Playbook

将上述任务插入到原Playbook的注册任务之后:

---
- name: RouterOS test with API
  hosts: localhost
  vars:
    hostname: "some_host"
    username: "api"
    password: "some_password"
    gather_subset: all
  module_defaults:
    group/community.routeros.api:
      hostname: "{{ hostname }}"
      password: "{{ password }}"
      username: "{{ username }}"
      tls: true
      force_no_cert: false
      validate_certs: false
      validate_cert_hostname: false
  tasks:

  - name: Add wg tuns
    ignore_errors: true
    community.routeros.api:
      path: "interface wireguard"
      add: "name={{ item.name }} listen-port={{ item.port }} comment={{ item.comment }}"
    loop:
      - { name: 'wg1', port: '111', comment: 'com1' }
      - { name: 'wg2', port: '222', comment: 'com2' }
      - { name: 'wg3', port: '333', comment: 'com3' }

  - name: Get wg link-local addrs
    community.routeros.api:
      path: ipv6 address
      extended_query:
        attributes:
          - address
          - interface
        where:
          - attribute: "interface"
            is: "=="
            value: "{{ item.name }}"
    loop:
      - { name: 'wg1' }
      - { name: 'wg2' }
      - { name: 'wg3' }
    register: extended_queryout

  # 新增:生成独立变量
  - name: 为每个WireGuard接口设置地址变量
    ansible.builtin.set_fact:
      "{{ item.item.name }}":
        address: "{{ item.msg[0].address }}"
    loop: "{{ extended_queryout.results }}"

  # 验证变量可用性
  - name: 测试变量调用
    ansible.builtin.debug:
      msg: "wg1.address = {{ wg1.address }}, wg2.address = {{ wg2.address }}, wg3.address = {{ wg3.address }}"

  # 原dump任务可保留或删除
  - name: Dump "Extended query example" output
    ansible.builtin.debug:
      msg: '{{ extended_queryout }}'

运行效果

执行Playbook后,测试变量调用任务会输出:

ok: [localhost] => {
    "msg": "wg1.address = fe80::caa4:e31c:dd63:7598/64, wg2.address = fe80::c0eb:fadb:2da0:50f5/64, wg3.address = fe80::28d1:7b9b:92:ed43/64"
}

此时即可在后续任务中直接使用wg1.address等变量。

内容的提问来源于stack exchange,提问作者Serhiy Bobrov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:50:56