概述
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
- name: task1
- name: tag使用
-
查看所有的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
- name: task1
- name: 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: esplaybook级别的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
- name: 安装es
- name: tag使用
-
查看所有的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
- handler3
handlers:
- name: notify handler
debug:
msg: "handler触发了"
tags:- handler1
- name: handler2
debug:
msg: "handler2触发了"
tags:- handler2
- name: handler3
debug:
msg: "handler3触发了"
tags:- handler3
- name: copy test1文件
-
-
查看所有的标签
能够发现这里并没有显示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