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