在大型項目當中,一般一個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:表示全部任務都會被執行,在默認狀況下,不指定任何標籤,則使用的就是該標籤