在大型项目当中,一般一个playbook会有很是多的task。而咱们每次执行这个playbook时,都会将全部task运行一遍。而事实上,在实际使用过程当中,咱们可能只是想要执行其中的一部分任务而已,并不想把整个playbook完整跑一遍。这个时候就须要用到tags。rest
经过tags,咱们能够给playbook中的某一些任务打上“标签”,而在执行playbook的时候,咱们能够经过选定标签的方式指定只执行哪一些任务或者不执行哪一些任务。code
下面是一个安装httpd的简单示例:server
# cat /etc/ansible/playbook/install_web.yml - name: configure webservers hosts: all remote_user: ansible tasks: - name: Install httpd yum: name: httpd state: present tags: install_httpd - name: Cofiguration httpd copy: src: /root/httpd.conf dest: /etc/httpd/conf/httpd.conf tags: conf_httpd notify: - restart httpd - name: Start httpd service: name: httpd state: started enabled: no tags: start_httpd handlers: - name: restart httpd service: name=httpd state=restart
在上面的示例中,咱们为两个task定义了三个tags:install_httpd
、conf_httpd
以及start_httpd
。继承
有了tags以后,咱们就能够只运行playbook中指定标签的task了:ip
# ansible-playbook --tags="start_httpd" install_web.yml PLAY [configure webservers] ************************************************************************************************************************************************* TASK [Gathering Facts] ****************************************************************************************************************************************************** ok: [10.1.61.187] TASK [Start httpd] ********************************************************************************************************************************************************** changed: [10.1.61.187] PLAY RECAP ****************************************************************************************************************************************************************** 10.1.61.187 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
也能够一次指定多个tag执行:rem
# ansible-playbook --tags="conf_httpd,start_httpd" install_web.yml PLAY [configure webservers] ************************************************************************************************************************************************* TASK [Gathering Facts] ****************************************************************************************************************************************************** ok: [10.1.61.187] TASK [Cofiguration httpd] *************************************************************************************************************************************************** ok: [10.1.61.187] TASK [Start httpd] ********************************************************************************************************************************************************** ok: [10.1.61.187] PLAY RECAP ****************************************************************************************************************************************************************** 10.1.61.187 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
经过下面的方式能够排除指定了tag的task,即除了指定tag的task不执行,其余task都执行:it
# ansible-playbook --skip-tags="install_httpd" install_web.yml PLAY [configure webservers] ************************************************************************************************************************************************* TASK [Gathering Facts] ****************************************************************************************************************************************************** ok: [10.1.61.187] TASK [Cofiguration httpd] *************************************************************************************************************************************************** ok: [10.1.61.187] TASK [Start httpd] ********************************************************************************************************************************************************** ok: [10.1.61.187] PLAY RECAP ****************************************************************************************************************************************************************** 10.1.61.187 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
执行效果跟上面同样。io
能够经过--list-tags
参数列出指定的playbook中全部的tagclass
# ansible-playbook --list-tags install_web.yml playbook: install_web.yml play #1 (all): configure webservers TAGS: [] TASK TAGS: [conf_httpd, install_httpd, start_httpd]
这种方式就是上面示例中的方法:
tags: conf_httpd
能够经过列表的方式为一个任务指定多个标签:
tags: - install_httpd - install_web tags: ['install_httpd','install_web'] tags: install_httpd,install_web
当为一个play指定一组标签后,该play下的全部task都会自动继承该标签,各task也能够自定义本身的标签。
- name: configure webservers hosts: all remote_user: ansible tags: - httpd tasks: ...
除了用户自定义tag,ansible也内置了几个tag,这些tag都包含特殊含义:
always:一旦某个task被打上了always的tag,则不管是playbook的完整执行,仍是指定tag执行,无论你指定的tag是啥,该任务老是会被执行。除非明确指定"--skip-tags=always"选项,才不会执行该task。
never:该标签与always正好相反,老是不会执行,除非明确指定"--tags=never"选项。
tagged:在调用时使用
```sh
# 全部打了tag的任务都会被执行,包含never tag的除外,没有标签的不会被执行
ansible-playbook --tags tagged install_web.yaml
# 全部打了tag的任务都不会被执行,包括always tag也不会被执行
ansible-playbook --skip-tags tagged install_web.yaml
```
untagged:在调用时使用
```sh
# 全部未打tag的任务都会被执行,打了always tag的也会被执行
ansibl-playbook --tags untagged install_web.yaml
all:表示全部任务都会被执行,在默认状况下,不指定任何标签,则使用的就是该标签