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
相关产品推荐
相关产品推荐

