Ansible17:Playbook之tags


簡介

在大型項目當中,通常一個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_httpdconf_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的幾種方式

  1. 為一個任務指定一個標簽

這種方式就是上面示例中的方法:

tags: conf_httpd
  1. 為一個任務指定多個標簽

可以通過列表的方式為一個任務指定多個標簽:

tags:
  - install_httpd
  - install_web
  
tags: ['install_httpd','install_web']

tags: install_httpd,install_web
  1. 為一個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:表示所有任務都會被執行,在默認情況下,不指定任何標簽,則使用的就是該標簽


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM