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

Ansible与Jinja2嵌套循环问题:基于列表生成Bash脚本

实现Ansible Jinja2嵌套循环生成Bash脚本

我来帮你搞定这个嵌套循环的问题!核心思路就是:外层遍历prefix_list里的每个前缀项,然后动态引用对应的内部列表(比如prefix1、prefix2),再对这个内部列表做内层循环。下面直接上可运行的完整示例:

1. 确认你的defaults.yml配置

先把你给出的配置整理成规范的YAML格式(补全prefix2的内容):

# defaults.yml
##################################
# FIRST LOOP #
##################################
prefix_list:
  - prefix1
  - prefix2
##################################
# SECOND LOOP #
##################################
prefix1:
  - kola
  - wlcom
  - linkstory
prefix2:
  - kola
  - example
  - test

2. 编写Ansible Playbook

用template模块渲染Jinja2模板生成Bash脚本:

# generate_bash_script.yml
- name: Generate bash script with nested loops
  hosts: localhost
  gather_facts: false
  vars_files:
    - defaults.yml
  tasks:
    - name: Render bash script template
      template:
        src: script.j2
        dest: ./generated_script.sh
        mode: '0755'

3. 关键的Jinja2模板(script.j2)

这里的核心是用lookup('vars', item)来动态获取外层循环项对应的内部列表,实现嵌套循环:

#!/bin/bash

# Generated by Ansible nested loop template
{% for prefix in prefix_list %}
echo "Processing prefix: {{ prefix }}"
{% for app in lookup('vars', prefix) %}
    echo "  - Handling app: {{ app }}"
    # 这里可以替换成你的实际Bash命令,比如:
    # ./deploy_service.sh {{ prefix }} {{ app }}
{% endfor %}
{% endfor %}

模板关键说明

  • {% for prefix in prefix_list %}:外层循环遍历所有前缀项
  • lookup('vars', prefix):把字符串形式的prefix(比如"prefix1")转换成对应的变量值(也就是prefix1列表),这样内层循环就能遍历这个列表了
  • 你可以把内层循环里的echo替换成实际需要的操作,比如部署脚本、配置修改等

4. 生成的Bash脚本效果

运行Playbook后,generated_script.sh的内容会是这样:

#!/bin/bash

# Generated by Ansible nested loop template
echo "Processing prefix: prefix1"
    echo "  - Handling app: kola"
    # 这里可以替换成你的实际Bash命令,比如:
    # ./deploy_service.sh prefix1 kola
    echo "  - Handling app: wlcom"
    # 这里可以替换成你的实际Bash命令,比如:
    # ./deploy_service.sh prefix1 wlcom
    echo "  - Handling app: linkstory"
    # 这里可以替换成你的实际Bash命令,比如:
    # ./deploy_service.sh prefix1 linkstory
echo "Processing prefix: prefix2"
    echo "  - Handling app: kola"
    # 这里可以替换成你的实际Bash命令,比如:
    # ./deploy_service.sh prefix2 kola
    echo "  - Handling app: example"
    # 这里可以替换成你的实际Bash命令,比如:
    # ./deploy_service.sh prefix2 example
    echo "  - Handling app: test"
    # 这里可以替换成你的实际Bash命令,比如:
    # ./deploy_service.sh prefix2 test

额外注意事项

  • 如果担心prefix_list里的项没有对应的列表变量,可以加个条件判断避免报错:
    {% for prefix in prefix_list %}
    {% if prefix in vars %}
    echo "Processing prefix: {{ prefix }}"
    {% for app in lookup('vars', prefix) %}
        # ...你的逻辑
    {% endfor %}
    {% else %}
    echo "Warning: No list found for prefix {{ prefix }}"
    {% endif %}
    {% endfor %}
    
  • 也可以用vars[prefix]替代lookup('vars', prefix),写法更简洁:{% for app in vars[prefix] %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:50:47