如何在Ansible块中导入Playbook与角色并复用when条件?
可行,实现方法如下
因为原Playbook里的import_playbook是顶层导入操作,而block属于单个Play内部的任务块,所以需要调整结构,把两个操作整合到同一个Play的任务中,用block统一控制条件:
--- - hosts: myserver gather_facts: no ignore_errors: True tasks: - block: # 用include_playbook替代import_playbook,使其能放入block内 - name: 导入执行myplaybook.yml include_playbook: myplaybook.yml # 将原Play中的角色调用转为include_role任务,纳入block统一管控 - name: 执行execute-script角色 include_role: name: execute-script vars: script_name: myscript.py args: "{{ arg1 }}" # 统一设置条件,无需重复编写 when: - env_tag == 'azure' - my_var is defined
关键说明:
import_playbook只能在Playbook顶层使用,无法放入block,所以改用include_playbook作为Task嵌入block(Ansible 2.5+支持该用法)。- 原独立Play中的
roles调用转为include_role任务,这样就能被block的条件统一控制。 - 原Play的
ignore_errors: True保留在顶层Play,若只需对block内任务生效,可移到block字段上。
如果需要保留import_playbook的静态导入特性(解析阶段即完成导入),也可以通过提取条件变量的方式避免重复,虽然没用到block但同样能解决问题:
--- vars: azure_run_condition: - env_tag == 'azure' - my_var is defined - import_playbook: myplaybook.yml when: "{{ azure_run_condition }}" - hosts: myserver gather_facts: no ignore_errors: True roles: - role: execute-script vars: script_name: myscript.py args: "{{ arg1 }}" when: "{{ azure_run_condition }}"
内容的提问来源于stack exchange,提问作者fr0zt
相关产品推荐
相关产品推荐

