如何在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
相关产品推荐
相关产品推荐

