首页/系统与基础设施/自动化运维速查/标签组织与选择性执行方法
Ansible 核心70 条

标签组织与选择性执行方法

标签用于按名字切执行范围:可贴在任务、块、角色与 play 上并向下传递,运行时选择执行或跳过,另有“总是执行”和“默认不执行”两类保留标签。设计上先约定少量固定层次(基线、配置、发布、危险动作),并注意被跳过的前置步骤。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‌​‌‌‌‌​​‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​‌​‌‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌​‌‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌‌​‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

标签用来切执行范围

标签是给任务、块、角色、play 贴的名字,运行时按名字挑选要执行的部分:只跑配置类任务、跳过破坏性步骤、单独重跑某一层。它的价值在长剧本里尤其明显——整份剧本跑一次要十几分钟,但只想改一个配置片段时,靠标签能把范围压到几秒钟,同时避免重复执行有风险的动作。

基本信息

贴标签位置任务、块、角色引用、play 都可以带标签,含在块或角色上的标签会作用于其内部任务
选择执行命令行按标签筛选执行或跳过标签,两者可同时使用
特殊标签有一个总是执行的保留标签,用于收集事实与安全检查类任务,具体名称以官方文档为准
清单预览只看剧本里有哪些标签,便于决定筛选条件
继承关系块与角色的标签会向下传递到内部任务
命名建议按“层次”而不是按“偶尔用途”命名,避免标签爆炸

典型使用场景

  • 只改配置:日常调参只跑配置相关标签,跳过安装与初始化步骤
  • 跳过危险操作:常规执行时排除重建、清空数据这类标签
  • 分层验证:先跑基线标签,再跑业务标签,逐步放开
  • 排障重跑:只重跑某个子系统的标签,避免整份剧本重来
  • 多团队分工:平台组与业务组各自认领自己的标签范围
  • 灰度习惯化:把“先跑检查类标签、再跑变更类标签”固化成流程

打标签与筛选

打标签与筛选
- hosts: web
  roles:
    - role: common
      tags: [baseline]        # 角色级标签会传递给它内部所有任务
    - role: nginx
      tags: [web, nginx]

  tasks:
    - name: 下发配置
      ansible.builtin.template:
        src: app.conf.j2
        dest: /etc/app/app.conf
      tags: [config]          # 任务级标签

    - name: 重建索引(有风险,默认跳过)
      ansible.builtin.command: /usr/local/bin/rebuild-index.sh
      tags: [rebuild, never]  # 保留标签:默认不执行,需显式指定

# 用法
# ansible-playbook -i inventory site.yml --list-tags        # 看有哪些标签
# ansible-playbook -i inventory site.yml --tags config      # 只跑配置
# ansible-playbook -i inventory site.yml --skip-tags rebuild # 跳过重建
# ansible-playbook -i inventory site.yml --tags web,config  # 多个标签取并集

标签设计对照

设计方式优点问题
按层次(基线、配置、发布)范围清晰,任何剧本都能复用同一套筛选口径需要团队先约定层次划分
按组件(nginx、mysql)定位到具体子系统,适合排障组件数量增长后标签迅速膨胀
按动作风险(重建、清空)可以一键排除危险操作风险等级会随场景变化,需定期复核
按环境(生产、测试)表面直观环境本就该由清单区分,用标签容易混乱
万能标签(all、通用)写起来省事失去筛选意义,等同没打标签
保留标签中的“默认不执行”那一类很适合包裹危险动作:平时全量执行不会碰到它,需要时显式指定标签才会运行。这比靠注释提醒可靠得多。
筛选执行会跳过未选中的任务,其中可能包含前置条件(创建目录、安装包)。跳过的前置步骤缺失时,后续任务会以难以理解的方式失败。用标签切范围前,先确认被跳过的部分不会成为必要条件。

怎么避免标签失控

标签混乱的根源是随用随加。可行做法是先在团队内定三到五类固定标签(例如基线、配置、发布、验证、危险操作),新增标签必须能归入某一类;再定期用清单预览检查是否有长期无人使用的标签,清理掉。标签数量稳定,筛选口径才会稳定。

易错点

  • 标签随用随加、命名口径不一,最后没人记得某个标签到底覆盖哪些任务
  • 只跑标签筛选却跳过了前置步骤,后续任务因缺少目录或依赖包而失败
  • 把危险动作与日常动作打同一个标签,一次常规执行就触发了高影响操作
  • 用标签区分环境,与按清单区分环境的做法冲突,容易在错误的清单上跑错标签
  • 以为标签能减少变量计算或事实采集开销,实际上只影响任务是否执行

数据来源与参考

  • Ansible 官方文档 Tags(含 always 与 never 保留标签)
  • ansible-playbook 命令行参考 --tags、--skip-tags、--list-tags
  • Ansible 官方文档 Roles 中标签的传递行为

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/playbook-tags-selective-execution.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‌​‌‌‌‌​​‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​‌​‌‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌​‌‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌‌​‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​