Ansible 2.5中import_tasks结合always标签与skip-tags的执行异常问询
为啥带
always标签的任务在跳过父标签时没跑? 兄弟,你碰到的这个问题其实是Ansible标签继承规则里一个容易踩坑的细节,咱们来掰扯清楚:
首先,你在import_tasks上标记了do-stuff,这就意味着导入的clever_stuff.yml里的每一个任务,都会同时拥有这个do-stuff标签和自己本身的标签——包括那个写了tags: always的"Default case"任务,它现在的标签是do-stuff+always。
那为啥always没生效?因为Ansible的标签执行逻辑是这样的:
always标签的作用是:如果任务的其他标签没有被排除(不管有没有被选中),就强制运行它。- 但如果任务的某个标签被你用
--skip-tags显式跳过了,那不管它有没有always,都会被直接跳过。
换句话说,你的"Default case"任务现在带着do-stuff标签,而你命令行里跳过了这个标签,所以Ansible直接把它排除了,always根本没机会发挥作用。
你的临时方案为啥有用?
当你把Task1-3塞进带do-stuff标签的block里时,只有block里的任务会继承do-stuff,而"Default case"只保留自己的always标签。这时候你跳过do-stuff,只会影响block里的任务,"Default case"因为没带被跳过的标签,always就会强制它运行。
更贴合你需求的替代方案
如果不想用block,还有两个实用办法:
- 换成
include_tasks代替import_tasks:include_tasks是动态导入,它的标签不会被所有子任务继承——只有导入这个动作本身带do-stuff标签,子任务的标签还是独立的。这样"Default case"就只有always标签,你跳过do-stuff时它会正常运行。不过要注意include和import的其他区别,比如import是静态解析,include是动态的,可能影响变量处理之类的。 - 给"Default case"单独加
!do-stuff标签:Ansible支持标签排除语法,你可以给这个任务写tags: [always, !do-stuff],这样即使它继承了do-stuff,也会被这个!do-stuff抵消,执行--skip-tags do-stuff时就不会跳过它了。
举个修改后的任务例子:
- Name: Default case ... stuff ... when: - my_var is not defined tags: [always, !do-stuff]
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

