Ansible如何避免为未使用主机收集facts?指定标签运行失败问题
解决Ansible指定Tag运行Play时仍连接宕机主机的问题
直接可行的解决方案
要让Ansible完全忽略Play1、只运行Play2,你可以试试这些方法:
直接指定要运行的Play(推荐,Ansible 2.12+)
从Ansible 2.12版本开始,支持--play参数,你可以通过Play的名称或者索引来指定只运行它:# 通过Play名称指定 ansible-playbook playbook.yml --play="Play2" # 或者通过索引(从1开始计数) ansible-playbook playbook.yml --play=2这个方法最直接,完全跳过其他所有Play,根本不会触发任何和vm1相关的操作。
区分Play级和任务级Tag,避免冲突
如果坚持用--tags,要检查你的Play1里有没有任务也用了pl2这个Tag。Ansible的--tags会匹配所有带该Tag的对象(包括Play和单个任务),如果Play1里有任务标记了pl2,运行命令时会执行这个任务,进而尝试连接vm1。
你可以给Play的Tag加上专属前缀(比如play_pl1、play_pl2),和任务级Tag区分开,然后执行:ansible-playbook playbook.yml --tags=play_pl2临时规避宕机主机的Facts收集失败
如果你暂时不想修改Playbook结构,也可以给Play1加上ignore_unreachable: yes或者gather_facts: no,这样即使Play1被误触发,也不会因为vm1宕机而中断执行:- name: Play1 hosts: vm1 gather_facts: no ignore_unreachable: yes tags: pl1 ...
问题出现的核心原因
你遇到的情况,大概率是以下两个原因之一:
- Tag作用范围混淆:
--tags=pl2会匹配所有带有pl2标签的Play和任务。如果你的Play1里有某个任务也标记了pl2,Ansible就会执行这个任务——而它属于Play1,hosts是vm1,自然会尝试连接宕机的vm1收集Facts,最终失败。 - 全局任务未被过滤:如果你的Playbook里有playbook级别的
pre_tasks/post_tasks,且这些任务的hosts包含vm1、又没有设置对应的Tag过滤,那么即使你指定运行Play2,这些全局任务也会执行,进而触发vm1的Facts收集。
内容的提问来源于stack exchange,提问作者eddyP23
相关产品推荐
相关产品推荐

