對 Ansible 劇本資源打標簽
在處理大型或復雜的劇本時,如果只希望運行部分劇本或部分任務。可以將標簽應用于可能要跳過或運行的特定資源。
通過標簽來標記資源,在資源上使用tags關鍵字,然后是要應用的標記列表。在Ansible中tags標記可用于下列資源:
- 每個任務,這是使用標簽的最常見方式之一。
- 整個劇本,在劇本級別使用標簽指令。
- 標記include_tasks任務。include_tasks加載的所有任務都與此標簽關聯。
- 角色,角色中的所有任務都與此標簽關聯。
- 任務塊,塊中的所有任務都與此標簽關聯。
看一個Demo,上面的標記依次來看體驗下。在這之前,先準備一個角色,角色做一個echo的動作,
$ansible-galaxy init tag_role --init-path=roles
- tag_role was created successfully
$ansible-galaxy list | grep tag
- tag_role, (unknown version)
$cat roles/tag_role/tasks/main.yml
---
# tasks file for tag_role
- name: tags rolesshell: echo 'tasks for tag_role'
編寫一個劇本,在不同劇本資源執行塊打上標簽
---
- name: tags Demo 1hosts: servera# 標記整個劇本tags:- play-tag-1roles:- role: tag_role# 標記角色tags:- role-tagstasks:- name: task 1 tagshell: echo 'tags to task 1'# 標記每個任務tags:- task-tags-1- name: include or import a tasks fileinclude_tasks:file: tasks_file# 標記include_tasks任務 tags:- include-import- block:- name: task 1 in blockshell: echo 'task 1 in block'- name: task 2 in blockshell: echo 'task 2 in block'# 標記任務塊 tags:- block-tags
- name: tags Demo 2hosts: servera# 標記整個劇本tags:- play-tag-2tasks:- name: task 2 tagshell: echo 'tags to task 2'tags:- task-tag-2
執行上面編寫劇本,默認情況下打了標簽,如果沒有顯示的指令或者設置特殊的標簽,劇本默認依舊按照沒打標簽的順序執行
$ansible-playbook tags.yaml
PLAY [tags Demo 1] ************************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [servera]
TASK [tag_role : tags roles] **************************************************************************
changed: [servera]
TASK [task 1 tag] *************************************************************************************
changed: [servera]
TASK [include or import a tasks file] ****************************************************************
included: /home/student/DO447/labs/task-execution/tasks_file for servera
TASK [task 1] *****************************************************************************************
changed: [servera]
TASK [task 2] *****************************************************************************************
changed: [servera]
TASK [task 1 in block] ********************************************************************************
changed: [servera]
TASK [task 2 in block] ********************************************************************************
changed: [servera]
PLAY [tags Demo 2] ************************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [servera]
TASK [task 2 tag] *************************************************************************************
changed: [servera]
PLAY RECAP ********************************************************************************************
servera : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
$
管理標記的資源
要列出 Playbook 中的所有標記,使用–list-tags選項
$ansible-playbook tags.yaml --list-tagsplaybook: tags.yamlplay #1 (servera): tags Demo 1 TAGS: [play-tag-1]TASK TAGS: [block-tags, include-import, play-tag-1, role-tags, task-tags-1]play #2 (servera): tags Demo 2 TAGS: [play-tag-2]TASK TAGS: [play-tag-2, task-tag-2]
$
可以看到,上面的劇本的標簽構成:
- 劇本tags Demo 1 包含標簽TASK TAGS: [block-tags,include-import, play-tag-1, role-tags, task-tags-1]
- 劇本tags Demo 2 包含標簽play-tag-2, task-tag-2
當希望運行特定的劇本資源時,給對應的資源標記打標簽,然后使用ansible-playbook運行playbook時,添加–tags選項來篩選 playbook 僅運行帶有特定標簽的play 或任務。
$ansible-playbook tags.yaml --tags=play-tag-2
PLAY [tags Demo 1] *************************************************************************************************
PLAY [tags Demo 2] *************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [servera]
TASK [task 2 tag] **************************************************************************************************
changed: [servera]
PLAY RECAP *********************************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
運行指令里添加了 --tags=play-tag-2,即只運行劇本tags Demo 2,當需要運行多個標簽時,之間逗號隔開
$ansible-playbook tags.yaml --tags=block-tags,role-tags
PLAY [tags Demo 1] *************************************************************************************************
TASK [tag_role : tags roles] ***************************************************************************************
changed: [servera]
TASK [task 1 in block] *********************************************************************************************
changed: [servera]
TASK [task 2 in block] *********************************************************************************************
changed: [servera]
PLAY [tags Demo 2] *************************************************************************************************
PLAY RECAP *********************************************************************************************************
servera : ok=3 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
$
當希望運行大多數劇本資源,個別劇本資源不運行,可以在運行ansible-playbook命令時,使用–skip-tags選項跳過帶有特定標簽的任務。
$ansible-playbook tags.yaml --list-tagsplaybook: tags.yamlplay #1 (servera): tags Demo 1 TAGS: [play-tag-1]TASK TAGS: [block-tags, include-import, play-tag-1, role-tags, task-tags-1]play #2 (servera): tags Demo 2 TAGS: [play-tag-2]TASK TAGS: [play-tag-2, task-tag-2]
$ansible-playbook tags.yaml --skip-tags play-tag-1
PLAY [tags Demo 1] *************************************************************************************************
PLAY [tags Demo 2] *************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [servera]
TASK [task 2 tag] **************************************************************************************************
changed: [servera]
PLAY RECAP *********************************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
$
特殊的標簽
如果有些劇本資源,你希望它始終運行,或是希望它始終不運行,即使在你使用tags、skip-tags指定標簽的情況下,Ansible 這兩種場景中提供了特殊標記:
- always:帶有 always 標記的資源始終都會運行,除非明確指定–skip-tags always選項。
- never:帶有 never 特殊標記的資源不會運行,除非明確指定–tags never選項。
看一個Demo
$cat tags-all.yaml
---
- name: tags Demo 1hosts: serveratags:- play-tag-1- neverroles:- role: tag_roletags:- role-tagstasks:- name: task 1 tagshell: echo 'tags to task 1'tags:- task-tags-1- name: include or import a tasks fileinclude_tasks:file: tasks_filetags:- include-import- block:- name: task 1 in blockshell: echo 'task 1 in block'- name: task 2 in blockshell: echo 'task 2 in block'tags:- block-tags
- name: tags Demo 2hosts: serveratags:- alwaystasks:- name: task 2 tagshell: echo 'tags to task 2'
可以看到劇本1設置never標簽,所以默認總不會執行,劇本2設置always,所以默認總會執行
$ansible-playbook tags-all.yaml
PLAY [tags Demo 1] *************************************************************************************************
PLAY [tags Demo 2] *************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [servera]
TASK [task 2 tag] **************************************************************************************************
changed: [servera]
PLAY RECAP *********************************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
$
執行輸出可以看到,劇本1沒有執行,劇本2默認執行,這里,可能有小伙伴會說,如果我希望打標簽的資源全部執行或者全部不執行,但是我的標簽太多了,都寫上很麻煩,況且我還有一些沒有打標簽的任務,我應該如何處理,Ansible在這些場景中提供了一些指令參數。
命令行指定標簽時的特定參數:
- tagged 標記將運行任何帶有顯式標記的資源
- untagged 標記將運行不帶有顯式標記的資源
- all 參數將包括 Play 中的所有任務,無論是否帶有標記,這是默認行為。
在來看看Demo