概述
如果你有一个很大的剧本,那么只运行它的特定部分而不是运行整个剧本可能会很有用。您可以使用 Ansible 标签来做到这一点。使用标签执行或跳过选定的任务是一个两步过程:
- 将标签添加到您的任务中,可以单独添加,也可以使用从block、play、roles或import中继承的标签。
- 运行剧本时选择或跳过标签。
特殊标签:always、never
Ansible 为特殊行为保留了两个标签名称:always 和 never。
如果您将always标签分配给tasks或play,Ansible 将始终运行该tasks或play,除非执行时,显示地跳过: --skip-tags always
如果您将never标签分配给任务或播放,Ansible 将跳过该任务或播放,除非执行时,显示地执行:--tags never
使用tags添加标签
单个task添加tags
tasks:
- name: Install the servers
ansible.builtin.yum:
name:
- httpd
- memcached
state: present
tags:
- packages
- webservers
- name: Configure the service
ansible.builtin.template:
src: templates/src.j2
dest: /etc/foo.conf
tags:
- configuration
标签继承-play、block、roles、import任务添加tags
给play、block、roles层级添加tags标签,层级下的所有tasks都会继承标签。
1.play添加标签
- hosts: all
tags: ntp
tasks:
- name: Install ntp
ansible.builtin.yum:
name: ntp
state: present
- hosts: fileservers
tags: filesharing
tasks:
...
2.block添加标签
- hosts: all
tasks:
- name: ntp tasks
tags: ntp
block:
- name: Install ntp
ansible.builtin.yum:
name: ntp
state: present
- name: Enable and run ntpd
ansible.builtin.service:
name: ntpd
state: started
enabled: yes
3.roles添加标签
roles:
- role: webserver
vars:
port: 5000
tags: [ web, foo ]
4.import添加标签
静态导入 import_role、import_tasks设置tags,其中的所有tasks也会继承标签
---
- hosts: webservers
tasks:
- name: Import the foo role
import_role:
name: foo
tags:
- bar
- baz
- name: Import tasks from foo.yml
import_tasks: foo.yml
tags: [ web, foo ]
动态重用include设置标签
非继承方式
标签继承不适用于动态重用的include_role和include_tasks。默认情况下tags只应用于include_*本身。
---
# file: roles/common/tasks/main.yml
- name: Dynamic re-use of database tasks
include_tasks: db.yml
tags: db
继承方式-使用block或apply关键字
默认情况下,动态重用(include_*)的标签只应用于其本身,而不会集成到它包含的tasks上。
一般情况下,不建议playbook中既有include_*,又有import_*,这样会引起难以诊断的错误。如果既想使用include_*,也要实现标签的继承的话,有两种解决办法:1.使用block;2.使用apply关键字。
使用blcok
- block:
- name: Include tasks from db.yml
include_tasks: db.yml
tags: db
使用apply关键字
- name: Apply the db tag to the include and to all tasks in db.yaml
include_tasks:
file: db.yml
# adds 'db' tag to tasks within db.yml
apply:
tags: db
# adds 'db' tag to this 'include_tasks' itself
tags: db
选择性标记任务
如果include_*添加标签tags: mytag,其中的tasks也添加标签tags: mytag。那么执行ansible-playbook时指定运行mytag标签,则可以执行mytag标签相关的include_*中包含的有mytag标签的任务。
ansible-playbook -i hosts myplaybook.yml --tags "mytag"
执行ansible-playbook关于tags参数
指定或跳过标签
ansible-playbook提供了五个与标签相关的命令行选项:
- --tags all 运行所有任务,忽略标签(默认行为)
- --tags [tag1, tag2] 只运行带有标签tag1或标签的任务tag2
- --skip-tags [tag3, tag4] 运行除带有标签tag3或标签的任务之外的所有任务tag4
- --tags tagged 只运行至少有一个标签的任务
- --tags untagged 只运行没有标签的任务
#要在很长的剧本中仅运行configuration和packages标记的任务块
ansible-playbook example.yml --tags "configuration,packages"
#要运行除packages标记的任务之外的所有任务
ansible-playbook example.yml --skip-tags "packages"
查看执行的tags或tags相关任务详情
- --list-tags 生成可用标签列表
- --list-tasks 与"--tags tagname"、"--skip-tags tagname"一起使用时,生成标记任务的预览
#查看playbook中有哪些tags
ansible-playbook example.yml --list-tags
#查看标记被执行的tags关联的任务列表
ansible-playbook example.yml --tags "configuration,packages" --list-tasks