Ansible

在子任務上使用帶有標籤的 Ansible include_tasks

  • May 9, 2022

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_taskA:在控制流到達語句並包含文件後,包含任務中的內容將可用。請參閱以下行下的範例。例如,此類標籤不會包含在可用標籤列表中。請參閱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
  1. 劇本
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]

  1. 始終標記任務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

  1. 當控制流到達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 ,應用的標籤也毫無意義,這也很好理解。

引用自:https://serverfault.com/questions/1023392