Ansible是否有类似AWS Fn::Cidr的子网CIDR生成功能?
问题:Ansible中是否有等效于AWS Fn::Cidr的模块?
我可以通过以下Ansible Playbook获取VPC子网的已占用CIDR列表:
tasks: - name: 收集VPC子网信息 amazon.aws.ec2_vpc_subnet_info: region: "eu-east-1" filters: vpc-id: vpc-433434432aad778ad register: output - name: 整理已占用CIDR列表 ansible.builtin.set_fact: cidr_list: "{{ cidr_list|default([]) + [item.cidr_block] }}" loop: "{{ output.subnets }}" - name: 输出已占用CIDR ansible.builtin.debug: msg: "{{ cidr_list }}"
现在我需要实现类似AWS CloudFormation中Fn::Cidr的功能:指定初始VPC CIDR、子网数量和每个子网的掩码,生成对应子网列表。比如:
"Fn::Cidr" : ["10.0.0.0/16", 15, 29 ]
这个函数会基于10.0.0.0/16生成15个掩码为/29的子网。我的目标是对比这个生成的列表和上面获取的已占用CIDR列表,找出未被占用的子网。请问Ansible中有没有直接实现Fn::Cidr功能的模块?
解答
Ansible官方没有直接对应Fn::Cidr的专用模块,但可以通过内置的ansible.utils.ipaddr过滤器/查找插件实现完全等效的功能,不需要额外安装依赖。
实现步骤
- 利用
ansible.utils.ipaddr生成指定规则的候选子网列表 - 通过集合运算筛选出未被占用的子网
示例Playbook
- name: 生成候选子网列表(等效Fn::Cidr) ansible.builtin.set_fact: # 基于VPC CIDR生成所有/29子网,再截取前15个 candidate_subnets: "{{ lookup('ansible.utils.ipaddr', vpc_cidr, 'subnet', subnet_mask) | list | first | slice(num_subnets) | list }}" vars: vpc_cidr: "10.0.0.0/16" num_subnets: 15 subnet_mask: 29 - name: 筛选未被占用的子网 ansible.builtin.set_fact: available_subnets: "{{ candidate_subnets | difference(cidr_list) }}" - name: 输出可用子网 ansible.builtin.debug: msg: "未被占用的子网: {{ available_subnets }}"
说明
ansible.utils是Ansible核心自带的集合(Ansible 2.10及以上版本支持),无需额外安装lookup('ansible.utils.ipaddr', ..., 'subnet', subnet_mask)会生成指定VPC CIDR下所有符合掩码要求的子网slice(num_subnets)用于截取指定数量的子网,对应Fn::Cidr的第二个参数difference过滤器用于对比已占用CIDR列表,直接得到未使用的子网
内容的提问来源于stack exchange,提问作者armaka
相关产品推荐
相关产品推荐

