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

如何用Jinja实现Ansible EC2安全组静态与CSV动态规则生成

Ansible安全组规则的动态+静态组合实现(Jinja模板)

核心逻辑

始终保留一条静态规则(TCP 8085端口,允许10.10.10.0/24访问);若传入rules变量(CSV格式),则将其解析为动态规则并与静态规则合并。

模板实现代码

在amazon.aws.ec2_group模块的rules参数中直接嵌入Jinja逻辑:

- name: 配置EC2安全组
  amazon.aws.ec2_group:
    name: my-custom-sg
    description: 包含静态+动态规则的安全组
    vpc_id: vpc-xxxxxx  # 替换为你的VPC ID
    rules: >-
      {% set static_rule = [{
        "proto": "tcp",
        "from_port": 8085,
        "to_port": 8085,
        "cidr_ip": "10.10.10.0/24"
      }] %}
      {% set dynamic_rules = [] %}
      {% if rules is defined and rules | trim != '' %}
        {% for line in rules.splitlines() | reject('equalto', '') %}
          {% set parts = line.split(',') %}
          {% if parts | length == 4 %}
            {% set _ = dynamic_rules.append({
              "proto": parts[0] | lower,
              "from_port": parts[1] | int,
              "to_port": parts[2] | int,
              "cidr_ip": parts[3]
            }) %}
          {% endif %}
        {% endfor %}
      {% endif %}
      {{ static_rule + dynamic_rules }}
    state: present

代码说明

  1. 静态规则定义:提前声明固定的安全组规则,无论rules是否存在都会保留。
  2. 动态规则解析:
    • 先判断rules变量是否存在且非空(过滤空字符串)
    • 将rules按行拆分,跳过空行
    • 每行按逗号分割为4个字段,验证格式后转换为Ansible安全组规则格式(协议转小写、端口转整数)
  3. 规则合并:将静态规则与动态规则列表拼接,最终传递给模块。

使用示例

传入rules变量时执行playbook:

ansible-playbook your-playbook.yml --extra-vars 'rules="TCP,22,22,10.10.10.10/0\nTCP,8080,8080,0.0.0.0/0"'

此时安全组会包含:

  • 静态规则:TCP 8085 → 10.10.10.0/24
  • 动态规则:TCP 22 → 10.10.10.10/0、TCP 8080 → 0.0.0.0/0

不传入rules变量时,安全组仅保留静态规则。

内容的提问来源于stack exchange,提问作者user630702

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:24:46