【发布时间】:2015-09-17 22:24:02
【问题描述】:
我在 AWS 中有一组现有的 VPC,每个都有自己的 CIDR 块:
vpc1:20.0.0.0/16 vpc2:20.10.0.0/16
现在,我正在尝试编写一个剧本,它会提取现有的 VPC 列表,然后找到一个可用的 CIDR(例如,在上面的示例中,下一个可用的 CIDR 将是 20.20.0.0/16,尽管我'我不太关心保持顺序)。
我知道这样做适用于两个列表:
- name: Loop over all possible CIDRs
debug: msg="Found a free CIDR {{ item }}"
with_items: all_potential_cidrs
when: "\"{{ item }}\" not in {{ currently_used_cidrs }}"
但是,我获取现有 CIDR 列表的方式是:
- name: Get list of VPCs and their CIDR blocks
command: aws ec2 describe-vpcs --output json
register: cli_output
- name: Register variables
set_fact:
current_vpcs: "{{ cli_output.stdout | from_json }}"
该命令返回以下数据(JSON 格式):
{
"Vpcs": [
{
"VpcId": "vpc-4aad0c23",
"InstanceTenancy": "default",
"Tags": [
{
"Value": "vpc1",
"Key": "Name"
}
],
"State": "available",
"DhcpOptionsId": "dopt-ff6b238f",
"CidrBlock": "20.0.0.0/16",
"IsDefault": false
},
{
"VpcId": "vpc-d4101abc",
"InstanceTenancy": "default",
"Tags": [
{
"Value": "vpc2",
"Key": "Name"
}
],
"State": "available",
"DhcpOptionsId": "dopt-eaaab38c",
"CidrBlock": "20.10.0.0/16",
"IsDefault": false
}
]
}
这允许获取所有 CIDR 块,如下所示:
- name: Print filtered VPCs and their subnets
debug: msg="VPC ID {{ item.VpcId }}, VPC CIDR block {{ item.CidrBlock }}"
with_items: current_vpcs.Vpcs
但是,由于“CidrBlock”是列表项的属性,我无法在需要列表的“when”语句中使用它:
when: "{{ item }}" not in {{ list_of_cidrs }}"
如何获取每个“Vpcs”项目的“CidrBlock”属性并将其转换为自己的列表,以便将其传递给“何时:...不在...”语句?
【问题讨论】:
标签: python yaml ansible cidr vpc