![](/img/trans.png)
[英]How can I execute an Ansible role multiple times with different vars from one playbook?
[英]In an Ansible playbook, what is a better way to iterate over a list of objects and call a different role depending on that object's data?
我正在使用Ansible來讀取包含字典列表的YAML文件。 然后,我需要遍歷此列表並根據每個列表對象中的數據調用不同的角色。 我有一個可行的解決方案,但是對我來說似乎太笨拙了,以至於我想找出是否有更好的方法。
我已經定義了一個YAML文件結構來為我的劇本提供輸入,然后使用include_vars
模塊將該文件讀入一個變量。 然后,我使用with_items
為需要支持的每個角色循環遍歷數組一次(當前為6,但可能會增加),並使用when
子句僅在對象中的數據對該角色正確時才包含include_role
。
---
objects:
- type: type1
name: obj_type1
- type: type2
name: obj_type2
- type: type3
name: obj_type3
---
- hosts: cf-host
gather_facts: False
vars:
objects_file: ''
tasks:
- name: Read objects_file
include_vars:
file: "{{ objects_file }}"
- name: Handle type1
include_role:
name: type1_role
vars:
- type1_role_name: "{{ item.name }}"
with_items: "{{ objects }}"
when: item.type == "type1"
- name: Handle type2
include_role:
name: type2_role
vars:
- type2_role_name: "{{ item.name }}"
with_items: "{{ objects }}"
when: item.type == "type2"
- name: Handle type3
include_role:
name: type3_role
vars:
- type3_role_name: "{{ item.name }}"
with_items: "{{ objects }}"
when: item.type == "type3"
---
- name: Print name
debug:
msg: "Type 1 - Name is {{ type1_role_name }}"
其他角色相同,但msg
設置為“類型X-名稱為{{typeX_role_name}}”。
如果列表中的每個項目與角色所對應的類型都不匹配,則會導致該項目中每個項目的跳過任務。 這也意味着我必須多次遍歷同一列表(與我需要支持的類型一樣多)。 如前所述,我已經需要支持6種不同的類型,並且這個數目可能會增加。
隨着列表和受支持的類型越來越大,此解決方案似乎伸縮性很差,並且性能很差。 有沒有更好的方法來做我需要做的事情?
使用這個答案: https : //stackoverflow.com/a/53859851/9744341作為基礎,我能夠提出一個更好的解決方案,對此我感到滿意。 在這種情況下,如果其他人有相同的需求:
---
- hosts: cf-host
gather_facts: False
vars:
objects_file: ''
role_name_lookup:
type1:
role_name: type1_role
tasks_from: type1_tasks
type2:
role_name: type2_role
tasks_from: type2_tasks
type3:
role_name: type3_role
tasks_from: main
tasks:
- name: Read objects_file
include_vars:
file: "{{ objects_file }}"
- name: Call roles to create infra
include_role:
name: "{{ role_name_lookup[item.type].role_name }}"
tasks_from: "{{ role_name_lookup[item.type].tasks_from }}"
vars:
inputs: "{{ item }}"
with_items: "{{ objects }}"
---
- name: Print name
debug:
msg: "Type 1 - Name is {{ inputs.name }}"
其他角色相同,但msg
設置為Type X - Name is {{ inputs.name }}
改為Type X - Name is {{ inputs.name }}
。
這段代碼適合您的目的嗎?
- name: Include roles
include_role:
name: "{{ item.type }}_role"
with_items: "{{ objects }}"
- name: Print name
debug:
msg: "{{ item.type }} - Name is {{ role_name }}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.