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

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过滤器/查找插件实现完全等效的功能,不需要额外安装依赖。

实现步骤

  1. 利用ansible.utils.ipaddr生成指定规则的候选子网列表
  2. 通过集合运算筛选出未被占用的子网

示例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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:45:33