簡介
在大型項目當中,通常一個playbook會有非常多的task。而我們每次執行這個playbook時,都會將所有task運行一遍。而事實上,在實際使用過程中,我們可能只是想要執行其中的一部分任務而已,並不想把整個playbook完整跑一遍。這個時候就需要用到tags。
通過tags,我們可以給playbook中的某一些任務打上“標簽”,而在執行playbook的時候,我們可以通過選定標簽的方式指定只執行哪一些任務或者不執行哪一些任務。
為task打tag
下面是一個安裝httpd的簡單示例:
# 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
。
使用tag
執行指定tag的task
有了tags之后,我們就可以只運行playbook中指定標簽的task了:
# ansible-playbook --tags="start_httpd" install_web.yml
PLAY [configure webservers] *************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [192.168.0.187]
TASK [Start httpd] **********************************************************************************************************************************************************
changed: [192.168.0.187]
PLAY RECAP ******************************************************************************************************************************************************************
192.168.0.187 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
也可以一次指定多個tag執行:
# ansible-playbook --tags="conf_httpd,start_httpd" install_web.yml
PLAY [configure webservers] *************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [192.168.0.187]
TASK [Cofiguration httpd] ***************************************************************************************************************************************************
ok: [192.168.0.187]
TASK [Start httpd] **********************************************************************************************************************************************************
ok: [192.168.0.187]
PLAY RECAP ******************************************************************************************************************************************************************
192.168.0.187 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
排除指定tag的task
通過下面的方式可以排除指定了tag的task,即除了指定tag的task不執行,其他task都執行:
# ansible-playbook --skip-tags="install_httpd" install_web.yml
PLAY [configure webservers] *************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [192.168.0.187]
TASK [Cofiguration httpd] ***************************************************************************************************************************************************
ok: [192.168.0.187]
TASK [Start httpd] **********************************************************************************************************************************************************
ok: [192.168.0.187]
PLAY RECAP ******************************************************************************************************************************************************************
192.168.0.187 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
執行效果跟上面一樣。
查看playbook中的所有tag
可以通過--list-tags
參數列出指定的playbook中所有的tag
# 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]
打tag的幾種方式
- 為一個任務指定一個標簽
這種方式就是上面示例中的方法:
tags: conf_httpd
- 為一個任務指定多個標簽
可以通過列表的方式為一個任務指定多個標簽:
tags:
- install_httpd
- install_web
tags: ['install_httpd','install_web']
tags: install_httpd,install_web
- 為一個play指定一組標簽
當為一個play指定一組標簽后,該play下的所有task都會自動繼承該標簽,各task也可以自定義自己的標簽。
- name: configure webservers
hosts: all
remote_user: ansible
tags:
- httpd
tasks:
...
ansible內置tag
除了用戶自定義tag,ansible也內置了幾個tag,這些tag都包含特殊含義:
-
always:一旦某個task被打上了always的tag,則無論是playbook的完整執行,還是指定tag執行,不管你指定的tag是啥,該任務總是會被執行。除非明確指定"--skip-tags=always"選項,才不會執行該task。
-
never:該標簽與always正好相反,總是不會執行,除非明確指定"--tags=never"選項。
-
tagged:在調用時使用
# 所有打了tag的任務都會被執行,包含never tag的除外,沒有標簽的不會被執行 ansible-playbook --tags tagged install_web.yaml # 所有打了tag的任務都不會被執行,包括always tag也不會被執行 ansible-playbook --skip-tags tagged install_web.yaml
-
untagged:在調用時使用
# 所有未打tag的任務都會被執行,打了always tag的也會被執行 ansibl-playbook --tags untagged install_web.yaml # 所有未打tag的任務都不會被執行 ansibl-playbook --skip-tags untagged install_web.yaml
-
all:表示所有任務都會被執行,在默認情況下,不指定任何標簽,則使用的就是該標簽