如何多次调用Ansible Playbook?循环传参调用实现方法问询
如何循环调用Ansible Playbook并传递不同变量
你尝试用import_playbook结合loop调用主逻辑Playbook的方式不可行,因为import_playbook属于静态导入,在Playbook解析阶段就会执行,不支持运行时的循环逻辑。下面是两种可行的实现方案:
方案一:使用include_playbook结合循环
include_playbook是动态导入方式,支持在运行时结合loop传递变量。
主逻辑Playbook(main-logic.yml)
保持你的原内容不变:
- name: Register hosts: "{{ host }}" tasks: - include_role: name: ROLE_NAME vars: service: "{{ service }}"
调用用的顶层Playbook
创建顶层Playbook(例如call-main.yml),内容如下:
- name: 多次调用主逻辑Playbook hosts: localhost gather_facts: false tasks: - name: 传递不同变量调用主Playbook include_playbook: main-logic.yml loop: - host: "1" service: "s1" - host: "2" service: "s2" loop_control: loop_var: outer_item vars: host: "{{ outer_item.host }}" service: "{{ outer_item.service }}"
关键说明:
hosts: localhost:顶层Playbook需要指定一个执行主机(这里用localhost即可,仅用于触发动态调用逻辑)。loop_control: loop_var: outer_item:避免循环默认变量item与被调用Playbook内的变量冲突。- 通过
vars字段将循环项中的值传递给主Playbook所需的host和service变量。
方案二:使用变量文件管理循环项
如果需要传递的变量较多,可将循环变量单独存入文件,便于后续维护:
变量文件(play-vars.yml)
playbook_vars: - host: "1" service: "s1" - host: "2" service: "s2"
顶层Playbook
- name: 加载变量并调用主Playbook hosts: localhost gather_facts: false vars_files: - play-vars.yml tasks: - name: 按变量列表调用主Playbook include_playbook: main-logic.yml loop: "{{ playbook_vars }}" loop_control: loop_var: pb_vars vars: host: "{{ pb_vars.host }}" service: "{{ pb_vars.service }}"
注意事项
- 确保
host变量对应的主机在你的Ansible Inventory中已配置,或使用动态Inventory满足主机识别需求。 include_playbook要求Ansible版本2.5及以上,若版本过低需先升级Ansible。
内容的提问来源于stack exchange,提问作者Mohammad Abdollahzadeh
相关产品推荐
相关产品推荐

