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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:31:01