如何修改Ansible注册变量?以Azure网卡IP配置为例
修改Azure网卡IP配置的公网IP分配方式并复用变量
问题背景
在Ansible中执行获取Azure网卡信息的任务后,注册变量azure_network_interface_info.networkinterfaces[0].ip_configurations包含public_ip_allocation_method字段,需要将该字段修改为Static或Dynamic,并在后续任务中复用修改后的ip_configurations数组。
原获取网卡信息的任务代码:
- name: 获取指定网卡信息 azure_rm_networkinterface_info: resource_group: "{{ resource_group }}" name: "{{ azure_vm_network_interface }}" register: azure_network_interface_info
注册变量输出示例:
ip_configurations: - application_gateway_backend_address_pools: null application_security_groups: null load_balancer_backend_address_pools: null name: Ubuntu915 primary: true private_ip_address: 10.0.0.5 private_ip_address_version: IPv4 private_ip_allocation_method: Dynamic public_ip_address: /subscriptions/123456789/resourceGroups/test-resource-group/providers/Microsoft.Network/publicIPAddresses/Ubuntu-915-test public_ip_address_name: /subscriptions/123456789/resourceGroups/test-resource-group/providers/Microsoft.Network/publicIPAddresses/Ubuntu-915-test public_ip_allocation_method: null
解决方案
通过Ansible的set_fact模块即可修改数组字段,以下是具体实现方式:
1. 批量修改所有IP配置的公网IP分配方式
使用map结合combine过滤器,批量更新数组中所有元素的目标字段:
- name: 将所有IP配置的公网IP分配方式设为Static set_fact: modified_ip_configs: "{{ azure_network_interface_info.networkinterfaces[0].ip_configurations | map('combine', {'public_ip_allocation_method': 'Static'}) | list }}"
若需改为Dynamic,直接将'Static'替换为'Dynamic'即可。
2. 修改指定IP配置的公网IP分配方式
如果只需修改特定名称的IP配置(比如示例中的Ubuntu915),可通过条件判断实现精准修改:
- name: 修改指定IP配置的公网IP分配方式为Static set_fact: modified_ip_configs: "{{ azure_network_interface_info.networkinterfaces[0].ip_configurations | map('combine', {'public_ip_allocation_method': 'Static'} if item.name == 'Ubuntu915' else {} ) | list }}" loop: "{{ azure_network_interface_info.networkinterfaces[0].ip_configurations }}"
3. 后续任务复用修改后的变量
在后续需要使用修改后IP配置的任务中,直接引用modified_ip_configs变量即可,例如更新网卡配置:
- name: 更新网卡配置 azure_rm_networkinterface: resource_group: "{{ resource_group }}" name: "{{ azure_vm_network_interface }}" ip_configurations: "{{ modified_ip_configs }}" state: present
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

