在子任務上使用帶有標籤的 Ansible include_tasks
Ansible 2.8.1
在我的劇本
tasks/
目錄中:main.yml dev.yml
在
main.yml
我有一個這樣的塊:- include_tasks: dev.yml when: ec2_tag_env == 'dev'
它工作正常
但是,如果我嘗試使用標籤呼叫 dev.yml 中的特定任務。它不會在執行期間限定任務
例如,這個標記的任務在
dev.yml
:- name: Pull the latest image docker_image: name: "{{ dev_image }}" source: pull tags: - container
當我使用它執行劇本時
-t container
,它將不符合條件,因為該include_tasks
步驟沒有該標籤。添加標籤
include_tasks
當然可以解決問題,但我需要跟踪標籤,因為它們被添加到子任務並在這裡添加它們:- include_tasks: dev.yml when: ec2_tag_env == 'dev' tags: - container
問題
- 是否有可能讓 Ansible 只“知道”
include_tasks
塊內有哪些任務並提取適用的標籤?- 實現這一目標的最佳實踐是什麼?
我寧願不必做的事情:
- 把一切
main.yml
。我在這本劇本中有很多任務,我真的很想把它們整理成文件。- 手動標記我的所有
include_tasks
塊及其所有子標籤。管理聽起來像是一場噩夢。
問:“是否有可能讓 Ansible 只‘知道’ include_tasks 塊中的任務並提取適用的標籤?”
include_task
A:在控制流到達語句並包含文件後,包含任務中的內容將可用。請參閱以下行下的範例。例如,此類標籤不會包含在可用標籤列表中。請參閱ansible-playbook的選項*--list-tags
。在這方面,答案是否定的。但是,如果在include_task的級別上也指定了這樣的標籤(在控制流到達語句之後),那麼這些標籤可能是可用的。此外,特殊標籤始終使此類標籤可用。include_task
*問:“實現這一目標的最佳實踐是什麼?”
答:有兩種選擇:
- 要麼使用*
import_tasks
*. 當 playbook 啟動時會讀取導入。- 或者,始終使用特殊標籤。Ansible 將始終包含文件中的任務。
澄清差異。鑑於下面的文件
shell> cat install.yml - debug: msg: Task 2 tags: t2 - debug: msg: Task 3 tags: t3
- 劇本
shell> cat pb1.yml - hosts: localhost tasks: - debug: msg: Task 1 tags: t1 - include_tasks: file: install.yml
按預期工作
shell> ansible-playbook pb1.yml PLAY [localhost] ***************************************************************************** TASK [debug] ********************************************************************************* ok: [localhost] => msg: Task 1 TASK [include_tasks] ************************************************************************* included: /export/scratch/tmp8/test-828/install.yml for localhost TASK [debug] ********************************************************************************* ok: [localhost] => msg: Task 2 TASK [debug] ********************************************************************************* ok: [localhost] => msg: Task 3 PLAY RECAP *********************************************************************************** localhost: ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
使用標籤時*
-t t1,t2
*,執行了t1標籤的任務,但是t2標籤的任務卻沒有,因為文件不包含shell> ansible-playbook pb1.yml -t t1,t2 PLAY [localhost] ***************************************************************************** TASK [debug] ********************************************************************************* ok: [localhost] => msg: Task 1 PLAY RECAP *********************************************************************************** localhost: ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
請注意,啟動時,應用程序對包含文件中的標籤一無所知
shell> ansible-playbook pb1.yml --list-tags playbook: pb1.yml play #1 (localhost): localhost TAGS: [] TASK TAGS: [t1]
- 始終標記任務include_tasks
shell> cat pb2.yml - hosts: localhost tasks: - debug: msg: Task 1 tags: t1 - include_tasks: file: install.yml tags: always
啟動時,應用程序仍然對包含文件中的標籤一無所知,但任務將始終包含在內
shell> ansible-playbook pb2.yml --list-tags playbook: pb1.yml play #1 (localhost): localhost TAGS: [] TASK TAGS: [always, t1]
*
-t t1,t2
*現在使用標記時,標記為 t1 和 t2 的任務都會執行shell> ansible-playbook pb2.yml -t t1,t2 PLAY [localhost] ***************************************************************************** TASK [debug] ********************************************************************************* ok: [localhost] => msg: Task 1 TASK [include_tasks] ************************************************************************* included: /export/scratch/tmp8/test-828/install.yml for localhost TASK [debug] ********************************************************************************* ok: [localhost] => msg: Task 2 PLAY RECAP *********************************************************************************** localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- 當控制流到達include_task語句時,該標籤始終會導致始終包含文件install.yml 。但是這個標籤只適用於include_task。它不被文件內的任務繼承。如果要將標籤應用於文件中的任務,請使用參數apply。例如
shell> cat pb3.yml - hosts: localhost tasks: - debug: msg: Task 1 tags: t1 - include_tasks: file: install.yml apply: tags: install tags: always
請注意,在此處啟動時,應用程序對應用的標籤和包含文件中的標籤一無所知
shell> ansible-playbook pb3.yml --list-tags playbook: pb3.yml play #1 (localhost): localhost TAGS: [] TASK TAGS: [always, t1]
應用標籤引起的唯一區別是所有包含的任務都可以由該標籤觸發,例如
shell> ansible-playbook pb3.yml -t install PLAY [localhost] ***************************************************************************** TASK [include_tasks] ************************************************************************* included: /export/scratch/tmp8/test-828/install.yml for localhost TASK [debug] ********************************************************************************* ok: [localhost] => msg: Task 2 TASK [debug] ********************************************************************************* ok: [localhost] => msg: Task 3 PLAY RECAP *********************************************************************************** localhost: ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
但是,應用的標籤不會幫助您單獨觸發包含的任務。在include_task級別上,如果沒有相同的標籤或特殊標籤always ,應用的標籤也毫無意義,這也很好理解。