如何在Ansible中拆分AWS安全组的逗号分隔端口值并转换格式?
问题:如何拆分安全组端口标签并生成对应安全组规则?
我通过Ansible从AWS拉取带有vpn_ports标签的安全组信息,执行的任务如下:
amazon.aws.ec2_group_info: filters: "tag:vpn_ports": "*" register: sec_group_info_output
随后用set_fact生成的自定义输出为:
"vpn_groups": { "sg-123456": "5432,22,53", "sg-987654": "22", "sg-18374923": "22,3389" }
我需要将其转换为列表格式(注:字典无法存在重复键,因此你想要的重复键字典格式不可行):
[ {"group_id": "sg-123456", "port": "5432"}, {"group_id": "sg-123456", "port": "22"}, {"group_id": "sg-123456", "port": "53"}, {"group_id": "sg-987654", "port": "22"}, {"group_id": "sg-18374923", "port": "22"}, {"group_id": "sg-18374923", "port": "3389"} ]
最终目标是为每个安全组ID的每个拆分端口创建对应的安全组规则,具体实现步骤如下:
步骤1:生成拆分端口后的安全组-端口列表
先将每个安全组的vpn_ports标签值按逗号拆分,再生成包含group_id和单个port的条目列表:
# 第一步:将每个安全组的端口拆分为列表,存储临时数据 - name: 处理安全组端口标签,拆分为端口列表 set_fact: sg_with_port_list: "{{ sg_with_port_list | default([]) + [ {'group_id': item.group_id, 'ports': item.tags.vpn_ports.split(',')} ] }}" with_items: "{{ sec_group_info_output.security_groups }}" # 第二步:展开嵌套的端口列表,生成扁平化的group_id-port条目 - name: 生成安全组-端口对应列表 set_fact: vpn_group_ports: "{{ vpn_group_ports | default([]) + [ {'group_id': item.0.group_id, 'port': item.1} ] }}" with_subelements: - "{{ sg_with_port_list }}" - ports
执行后,vpn_group_ports变量就会得到你需要的列表格式数据。
步骤2:批量创建安全组规则
使用amazon.aws.ec2_group模块遍历上述列表,为每个端口添加安全组规则(注意根据实际需求调整协议、源地址等参数):
- name: 批量添加安全组入站规则 amazon.aws.ec2_group: group_id: "{{ item.group_id }}" rules: - proto: tcp # 若需要UDP可单独添加规则或调整为对应协议 from_port: "{{ item.port }}" to_port: "{{ item.port }}" cidr_ip: 10.0.0.0/8 # 替换为你的VPN客户端网段或其他合法源地址 loop: "{{ vpn_group_ports }}"
内容的提问来源于stack exchange,提问作者WarrenG
相关产品推荐
相关产品推荐

