如何用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
代码说明
- 静态规则定义:提前声明固定的安全组规则,无论
rules是否存在都会保留。 - 动态规则解析:
- 先判断
rules变量是否存在且非空(过滤空字符串) - 将
rules按行拆分,跳过空行 - 每行按逗号分割为4个字段,验证格式后转换为Ansible安全组规则格式(协议转小写、端口转整数)
- 先判断
- 规则合并:将静态规则与动态规则列表拼接,最终传递给模块。
使用示例
传入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
相关产品推荐
相关产品推荐

