ansible中的tag标签
概述tags 是给 play / task / handler / role 打上标记执行 playbook 时可以只运行带指定标签的任务跳过其他任务排除某些标签任务不执行批量分组执行拆分部署流程初始化、配置、重启、清理等ansible中关于tags的相关命令只执行指定标签任务ansible-playbook -t [tag1,tag2…] [playbook]执行时排除标签–skip-tagsansible-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文件rootmaster:/data00/ansible# cat tag1.yamlname: tag使用hosts: estasks:name: task1debug:msg: “执行tasks1”打上tag标签tags: tag_task1name: task2debug:msg: “执行tasks2”打上tag标签tags: tag_task2name: task3debug:msg: “执行tasks3”打上tag标签tags: tag_task3查看所有的tagrootmaster:/data00/ansible# ansible-playbook --list-tags tag1.yamlplaybook: tag1.yamlplay #1 (es): tag使用 TAGS: []# 当前playbook所有的tagsTASK TAGS: [tag_task1, tag_task2, tag_task3]执行指定的tagrootmaster:/data00/ansible# ansible-playbook -t tag_task1 tag1.yamlPLAY [tag使用] ***************************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.120.9]只执行了指定tag对应的taskTASK [task1] *****************************************************************************************************************************************************************************************************ok: [10.37.120.9] {“msg”: “执行tasks1”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.120.9 : ok2 changed0 unreachable0 failed0 skipped0 rescued0 ignored0也可以同时指定多个tagrootmaster:/data00/ansible# ansible-playbook -t tag_task1,tag_task2 tag1.yamlPLAY [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 : ok3 changed0 unreachable0 failed0 skipped0 rescued0 ignored0也可以通过-t all指定所有的tagrootmaster:/data00/ansible# ansible-playbook -t all tag1.yamlPLAY [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 : ok4 changed0 unreachable0 failed0 skipped0 rescued0 ignored0给task打上多个tag也可以给ansible playbook中的单个task打上多个tag我们想运行某个task时只需要匹配上其中一个tag即可执行对应的task编写playbookrootmaster:/data00/ansible# cat tag2.yamlname: tag使用hosts: estasks:name: task1debug:msg: “执行tasks1”通过列表的方式可以指定多个tagtags:tag_task1task1tagname: task2debug:msg: “执行tasks2”tags:tag_task2task2tagname: task3debug:msg: “执行tasks3”tags:tag_task3task3tag查看所有的标签rootmaster:/data00/ansible# ansible-playbook --list-tags tag2.yamlplaybook: tag2.yamlplay #1 (es): tag使用 TAGS: []TASK TAGS: [tag, tag_task1, tag_task2, tag_task3, task1, task2, task3]指定tag执行指定task1执行rootmaster:/data00/ansible# ansible-playbook -t task1 tag2.yamlPLAY [tag使用] ***************************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.120.9]发现这里只执行了task1TASK [task1] *****************************************************************************************************************************************************************************************************ok: [10.37.120.9] {“msg”: “执行tasks1”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.120.9 : ok2 changed0 unreachable0 failed0 skipped0 rescued0 ignored0指定tag标签执行tag给所有的task都匹配上了所以所有的task都执行了rootmaster:/data00/ansible# ansible-playbook -t tag tag2.yamlPLAY [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 : ok4 changed0 unreachable0 failed0 skipped0 rescued0 ignored0给playbook使用tagtags可以写在play 同级作用当前 play 下所有 tasks、handlers 自动继承该标签其优先级低于task编写playbook文件rootmaster:/data00/ansible# cat tag3.yamlname: tag使用hosts: esplaybook级别的tagstags: es_alltasks:name: 安装esdebug:msg: “执行安装es”tags:es_installname: 修改es的配置文件debug:msg: “执行修改es的配置文件”tags:es_configname: 重启esdebug:msg: “执行重启es”tags:es_restart查看所有的tagsrootmaster:/data00/ansible# ansible-playbook --list-tags tag3.yamlplaybook: tag3.yaml这里有显示play的tag显示使用的es_allplay #1 (es): tag使用 TAGS: [es_all]TASK TAGS: [es_all, es_config, es_install, es_restart]指定task级别的tag执行rootmaster:/data00/ansible# ansible-playbook -t es_config tag3.yamlPLAY [tag使用] ***************************************************************************************************************************************************************************************************TASK [修改es的配置文件] ******************************************************************************************************************************************************************************************ok: [10.37.120.9] {“msg”: “执行修改es的配置文件”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.120.9 : ok1 changed0 unreachable0 failed0 skipped0 rescued0 ignored0指定playbook级别的tag执行发现所有的task都执行了rootmaster:/data00/ansible# ansible-playbook -t es_all tag3.yamlPLAY [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 : ok4 changed0 unreachable0 failed0 skipped0 rescued0 ignored0handler使用tagansible中的handler也可以使用tags标签但是使用中有几个坑点需要注意notify 触发 handler 不受 handler tags 过滤只要 task 执行并 changedhandler 必运行不管 -t 有没有包含 handler 的标签。只有手动 -t handler_tag 时才会跳过 tasks直接执行 handler。play 级别的 tags 会自动继承到 handlers。多个 handler 同名 notify 只会执行一次与标签无关。示例编写playbook文件rootmaster:/data00/ansible# cat tag4.yamlname: tag使用hosts: dbtasks:name: copy test1文件copy:src: /data00/ansible/test1.txtdest: /tmp/test1.txtmode: 600notify:handler3tags:copyhandlers:name: notify handlerdebug:msg: “handler触发了”tags:handler1name: handler2debug:msg: “handler2触发了”tags:handler2name: handler3debug:msg: “handler3触发了”tags:handler3查看所有的标签能够发现这里并没有显示handler的tagrootmaster:/data00/ansible# ansible-playbook --list-tags tag4.yamlplaybook: tag4.yamlplay #1 (db): tag使用 TAGS: []TASK TAGS: [copy]指定task的tag执行看看是否能够触发handler能够发现这里并没有指定handler的tag但是handler的tag依旧是执行了其实很好理解handler的触发只要文件被改变了handler肯定是会被触发的rootmaster:/data00/ansible# ansible-playbook -t copy tag4.yamlPLAY [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 : ok3 changed1 unreachable0 failed0 skipped0 rescued0 ignored0指定tag运行指定的handler这里发现指定handler的tag运行时其实handler并没有被触发这是因为handler 自身的 tags 仅用于过滤无法单独拉起自身handler必须被task notify时才会被触发。rootmaster:/data00/ansible# ansible-playbook -t handler2 tag4.yamlPLAY [tag使用] ***************************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.99.63]PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.99.63 : ok1 changed0 unreachable0 failed0 skipped0 rescued0 ignored0给ansible role打上tag在引入 role 时直接绑定 tags当前整个 role 所有任务、handler 都会带上该标签执行 -t 可单独运行这个 role。示例site.ymlname: 多角色部署hosts: dbroles:给 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 标签名 才会运行