簡體   English   中英

在Ansible劇本中,有什么更好的方法可以遍歷對象列表並根據該對象的數據調用不同的角色?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM