ansible中的tag标签

概述

tags 是给 play / task / handler / role 打上标记,执行 playbook 时可以:

  • 只运行带指定标签的任务,跳过其他任务
  • 排除某些标签任务不执行
  • 批量分组执行,拆分部署流程(初始化、配置、重启、清理等)

ansible中关于tags的相关命令

# 只执行指定标签任务
ansible-playbook -t [tag1,tag2...]  [playbook]

# 执行时排除标签(--skip-tags)
ansible-playbook --skip-tags [tag1,tag2...] [playbook]

# 查看当前 playbook 所有标签
ansible-playbook --list-tags [playbook]

# 只执行无标签任务
ansible-playbook --skip-tags all [playbook]

tags使用案例

给单个task打上tag(最常用)

给ansible playbook中的单个task打上tag,这样我们可以在运行时指定tag运行对应的task,在生产环境中很常用

  • 编写playbook文件
root@master:/data00/ansible# cat tag1.yaml 
- name: tag使用
  hosts: es
  tasks:
    - name: task1
      debug:
        msg: "执行tasks1"
      # 打上tag标签
      tags: tag_task1
    - name: task2
      debug:
        msg: "执行tasks2"
      # 打上tag标签
      tags: tag_task2
    - name: task3
      debug:
        msg: "执行tasks3"
      # 打上tag标签
      tags: tag_task3
  • 查看所有的tag
root@master:/data00/ansible# ansible-playbook --list-tags tag1.yaml 

playbook: tag1.yaml

  play #1 (es): tag使用 TAGS: []
      # 当前playbook所有的tags
      TASK TAGS: [tag_task1, tag_task2, tag_task3]
  • 执行指定的tag
root@master:/data00/ansible# ansible-playbook -t tag_task1 tag1.yaml 

PLAY [tag使用] ***************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [10.37.120.9]

# 只执行了指定tag对应的task
TASK [task1] *****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行tasks1"
}

PLAY RECAP *******************************************************************************************************************************************************************************************************
10.37.120.9                : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • 也可以同时指定多个tag
root@master:/data00/ansible# ansible-playbook -t tag_task1,tag_task2 tag1.yaml 

PLAY [tag使用] ***************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [10.37.120.9]

TASK [task1] *****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行tasks1"
}

TASK [task2] *****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行tasks2"
}

PLAY RECAP *******************************************************************************************************************************************************************************************************
10.37.120.9                : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • 也可以通过-t all指定所有的tag
root@master:/data00/ansible# ansible-playbook -t all tag1.yaml 

PLAY [tag使用] ***************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [10.37.120.9]

TASK [task1] *****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行tasks1"
}

TASK [task2] *****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行tasks2"
}

TASK [task3] *****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行tasks3"
}

PLAY RECAP *******************************************************************************************************************************************************************************************************
10.37.120.9                : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

给task打上多个tag

也可以给ansible playbook中的单个task打上多个tag,我们想运行某个task时,只需要匹配上其中一个tag即可执行对应的task

  • 编写playbook
root@master:/data00/ansible# cat tag2.yaml 
- name: tag使用
  hosts: es
  tasks:
    - name: task1
      debug:
        msg: "执行tasks1"
      # 通过列表的方式可以指定多个tag
      tags: 
        - tag_task1
        - task1
        - tag
    - name: task2
      debug:
        msg: "执行tasks2"
      tags: 
        - tag_task2
        - task2
        - tag
    - name: task3
      debug:
        msg: "执行tasks3"
      tags: 
        - tag_task3
        - task3
        - tag
  • 查看所有的标签
root@master:/data00/ansible# ansible-playbook --list-tags tag2.yaml 

playbook: tag2.yaml

  play #1 (es): tag使用 TAGS: []
      TASK TAGS: [tag, tag_task1, tag_task2, tag_task3, task1, task2, task3]
  • 指定tag执行
# 指定task1执行
root@master:/data00/ansible# ansible-playbook -t task1 tag2.yaml 

PLAY [tag使用] ***************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [10.37.120.9]

# 发现这里只执行了task1
TASK [task1] *****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行tasks1"
}

PLAY RECAP *******************************************************************************************************************************************************************************************************
10.37.120.9                : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

# 指定tag标签执行
# tag给所有的task都匹配上了,所以所有的task都执行了
root@master:/data00/ansible# ansible-playbook -t tag tag2.yaml 

PLAY [tag使用] ***************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [10.37.120.9]

TASK [task1] *****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行tasks1"
}

TASK [task2] *****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行tasks2"
}

TASK [task3] *****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行tasks3"
}

PLAY RECAP *******************************************************************************************************************************************************************************************************
10.37.120.9                : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

给playbook使用tag

tags可以写在play 同级,作用:当前 play 下所有 tasks、handlers 自动继承该标签,其优先级低于task

  • 编写playbook文件
root@master:/data00/ansible# cat tag3.yaml 
- name: tag使用
  hosts: es
  # playbook级别的tags
  tags: es_all
  tasks:
    - name: 安装es
      debug:
        msg: "执行安装es"
      tags: 
        - es_install
    - name: 修改es的配置文件
      debug:
        msg: "执行修改es的配置文件"
      tags: 
        - es_config
    - name: 重启es
      debug:
        msg: "执行重启es"
      tags: 
        - es_restart
  • 查看所有的tags
root@master:/data00/ansible# ansible-playbook --list-tags tag3.yaml 

playbook: tag3.yaml
  # 这里有显示play的tag,显示使用的es_all
  play #1 (es): tag使用 TAGS: [es_all]
      TASK TAGS: [es_all, es_config, es_install, es_restart]
  • 指定task级别的tag执行
root@master:/data00/ansible# ansible-playbook -t es_config tag3.yaml 

PLAY [tag使用] ***************************************************************************************************************************************************************************************************

TASK [修改es的配置文件] ******************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行修改es的配置文件"
}

PLAY RECAP *******************************************************************************************************************************************************************************************************
10.37.120.9                : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
  • 指定playbook级别的tag执行

发现所有的task都执行了

root@master:/data00/ansible# ansible-playbook -t es_all tag3.yaml 

PLAY [tag使用] ***************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [10.37.120.9]

TASK [安装es] ****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行安装es"
}

TASK [修改es的配置文件] ******************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行修改es的配置文件"
}

TASK [重启es] ****************************************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "执行重启es"
}

PLAY RECAP *******************************************************************************************************************************************************************************************************
10.37.120.9                : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

handler使用tag

ansible中的handler也可以使用tags标签,但是使用中有几个坑点需要注意:

  • notify 触发 handler 不受 handler tags 过滤,只要 task 执行并 changed,handler 必运行,不管 -t 有没有包含 handler 的标签。
  • 只有手动 -t handler_tag 时,才会跳过 tasks,直接执行 handler。
  • play 级别的 tags 会自动继承到 handlers。
  • 多个 handler 同名 notify 只会执行一次,与标签无关。

示例:

  • 编写playbook文件
root@master:/data00/ansible# cat tag4.yaml 
- name: tag使用
  hosts: db
  tasks:
    - name: copy test1文件
      copy:
        src: /data00/ansible/test1.txt
        dest: /tmp/test1.txt
        mode: 600
      notify: 
        - handler3
      tags:
        - copy
 
  handlers:
    - name: notify handler
      debug:
        msg: "handler触发了"
      tags:
        - handler1
    - name: handler2
      debug:
        msg: "handler2触发了"
      tags:
        - handler2
    - name: handler3
      debug:
        msg: "handler3触发了"
      tags:
        - handler3
  • 查看所有的标签
# 能够发现这里并没有显示handler的tag
root@master:/data00/ansible# ansible-playbook --list-tags tag4.yaml 

playbook: tag4.yaml

  play #1 (db): tag使用 TAGS: []
      TASK TAGS: [copy]
  • 指定task的tag执行,看看是否能够触发handler

能够发现,这里并没有指定handler的tag,但是handler的tag依旧是执行了,其实很好理解,handler的触发,只要文件被改变了,handler肯定是会被触发的

root@master:/data00/ansible# ansible-playbook -t copy tag4.yaml 

PLAY [tag使用] ***************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [10.37.99.63]

TASK [copy test1文件] ********************************************************************************************************************************************************************************************
changed: [10.37.99.63]

RUNNING HANDLER [handler3] ***************************************************************************************************************************************************************************************
ok: [10.37.99.63] => {
    "msg": "handler3触发了"
}

PLAY RECAP *******************************************************************************************************************************************************************************************************
10.37.99.63                : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • 指定tag,运行指定的handler

这里发现,指定handler的tag运行时,其实handler并没有被触发,这是因为handler 自身的 tags 仅用于过滤,无法单独拉起自身;handler必须被task notify时才会被触发。

root@master:/data00/ansible# ansible-playbook -t handler2 tag4.yaml 

PLAY [tag使用] ***************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [10.37.99.63]

PLAY RECAP *******************************************************************************************************************************************************************************************************
10.37.99.63                : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

给ansible role打上tag

在引入 role 时直接绑定 tags,当前整个 role 所有任务、handler 都会带上该标签,执行 -t 可单独运行这个 role。

示例:

# site.yml
- name: 多角色部署
  hosts: db
  roles:
    # 给 mysql 角色打标签 mysql、db
    - { role: mysql, tags: ["mysql", "db"] }
    # 给 nginx 角色打标签 web、nginx
    - { role: nginx, tags: nginx,web }

tag特殊内置标签

  • all:默认标签,不加 -t 等价 -t all,匹配所有任务
  • always:带此标签的任务无论 -t 是什么都会执行,只能 --skip-tags always 跳过
  • never:默认不执行,必须手动 -t 标签名 才会运行

tag优先级

tag 可以加在 4 个层级,优先级:task > handler > role > play

posted @ 2026-07-15 10:17  huangSir-devops  阅读(79)  评论(0)    收藏  举报
作者:你的名字
出处:你的博客链接
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。