如何带条件运行Ansible的import_playbook?报错问题求解
Ansible import_playbook 条件执行报错的解决方法
你遇到的问题核心是import_playbook是在Ansible剧本解析阶段执行,这时候还没对目标主机执行任何任务,自然还没收集到ansible_facts,所以会提示找不到distribution_major_version属性。以下是几种可行的修正方案:
方案一:改用include_playbook(推荐)
include_playbook是在运行阶段加载剧本,此时已经完成了facts收集,能正常使用facts变量作为条件:
- include_playbook: "{{ playbook_folder }}/run_tasks_only_on_rhel8.yml" when: ansible_facts['distribution_major_version'] == "8"
注:Ansible 2.10+版本默认会自动收集facts,旧版本可能需要手动添加setup模块任务确保facts已收集。
方案二:先收集facts再导入(适配import_playbook)
如果坚持使用import_playbook,可以先单独编写一个play收集facts并存储为全局变量,再用该变量作为导入条件:
- name: 收集主机版本信息并设置全局变量 hosts: all tasks: - setup: - set_fact: distro_major_version: "{{ ansible_facts.distribution_major_version }}" delegate_to: localhost run_once: true - import_playbook: "{{ playbook_folder }}/run_tasks_only_on_rhel8.yml" when: distro_major_version == "8"
注:此方法适合单主机或所有目标主机版本一致的场景,run_once会仅取第一个主机的版本信息。
方案三:用inventory变量提前标记主机
在inventory文件中给RHEL8主机添加自定义标记变量,无需依赖facts收集即可实现条件导入:
[rhel8_hosts] your_rhel8_host ansible_host=192.168.1.10 is_rhel8=true [other_hosts] other_host ansible_host=192.168.1.11 is_rhel8=false
主剧本中直接使用该变量作为条件:
- import_playbook: "{{ playbook_folder }}/run_tasks_only_on_rhel8.yml" when: is_rhel8 | bool
内容的提问来源于stack exchange,提问作者Judy
相关产品推荐
相关产品推荐

