Ansible17:Playbook之tags

簡介

在大型項目當中,一般一個playbook會有很是多的task。而咱們每次執行這個playbook時,都會將全部task運行一遍。而事實上,在實際使用過程當中,咱們可能只是想要執行其中的一部分任務而已,並不想把整個playbook完整跑一遍。這個時候就須要用到tags。rest

經過tags,咱們能夠給playbook中的某一些任務打上「標籤」,而在執行playbook的時候,咱們能夠經過選定標籤的方式指定只執行哪一些任務或者不執行哪一些任務。code

爲task打tag

下面是一個安裝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_httpdconf_httpd以及start_httpd繼承

使用tag

執行指定tag的task

有了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,即除了指定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

查看playbook中的全部tag

能夠經過--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]

打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:在調用時使用
    ```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

    # 全部未打tag的任務都不會被執行
    ansibl-playbook --skip-tags untagged install_web.yaml
    ```
  • all:表示全部任務都會被執行,在默認狀況下,不指定任何標籤,則使用的就是該標籤

相關文章
相關標籤/搜索