小技巧 - 執行指定的 task

要執行指定的 Tasks 時,可以藉著 tag 來幫助我們。

# Filename: install-app.yml
- name: Install application
  hosts: dbservers
  vars:
    packages:
      - postfix
      - mariadb-server

  tasks:
    - name: Ensure that packages are installed
      yum:
        name: "{{ packages }}"
        state: installed
      tags:
        - install
    - name: 
      debug:
        msg: "Debug message"

以上面的例子來說,Ensure that packages are installed 這個 task 就有加上 install 這個 tag

在執行的時候,就可以使用 -t install 來表明只執行這個 task:

ansible-playbook -i inventory -t install install-app.yml

如果沒有用 -t 指定 tag 時,這兩個 task 都會被執行到。

那麼,如果想要沒有指定 tag 時,兩個 task 都不給執行時的話,該怎麼辦呢?這時候我們可以使用關鍵字 never,使用了 never 之後,如果沒有指定 tag,就都不會執行。

我們舉另外一個例子來說明:

---
# Filename: running-selected-task.yml
- name: Running selected task example
  hosts: localhost
  gather_facts: false

  tasks:
    - debug:
        msg: "AAA"
      tags:
        - never
        - aaa
    - debug:
        msg: "BBB"
      tags:
        - never
        - bbb

這個 playbook 裡有兩個 task,一個會顯示 AAA,加上了 never 與 aaa 這兩個 tag;另一個則顯示 BBB,加上了 never 與 bbb 這兩個 tag。

先不指定 tag 來執行看看:

$ ansible-playbook -i localhost, -c local running-selected-task.yml

PLAY [Running selected task example] *********************************************************************************************

PLAY RECAP ***********************************************************************************************************************

你會發現沒有任何 task 被執行。

接著來試試看加上 -t aaa

$ ansible-playbook -i localhost, -c local -t aaa running-selected-task.yml

PLAY [Running selected task example] *********************************************************************************************

TASK [debug] *********************************************************************************************************************
ok: [localhost] => {
    "msg": "AAA"
}

PLAY RECAP ***********************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

的確就只顯示了 ‘AAA’。

然後試試看加上 -t bbb

$ ansible-playbook -i localhost, -c local -t bbb running-selected-task.yml

PLAY [Running selected task example] *********************************************************************************************

TASK [debug] *********************************************************************************************************************
ok: [localhost] => {
    "msg": "BBB"
}

PLAY RECAP ***********************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

最後,如果這兩個 task 都要執行的話呢?那就是用 -t aaa,bbb

$ ansible-playbook -i localhost, -c local -t aaa,bbb running-selected-task.yml

PLAY [Running selected task example] *********************************************************************************************

TASK [debug] *********************************************************************************************************************
ok: [localhost] => {
    "msg": "AAA"
}

TASK [debug] *********************************************************************************************************************
ok: [localhost] => {
    "msg": "BBB"
}

PLAY RECAP ***********************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

透過 tag ,我們可以只執行 playbook 裡一部份的 task,而不需要執行全部,在先期的開發上有很大的幫助。看到這裡,相信你應該知道 tag 該怎麼應用了。