Ansibleプレイブックで、オブジェクトのリストを反復処理し、そのオブジェクトのデータに応じて異なるロールを呼び出すためのより良い方法は何ですか?

クリス

Ansibleを使用して、辞書のリストを含むYAMLファイルを読み込みます。次に、このリストを繰り返し処理し、各リストオブジェクト内のデータに応じて異なるロールを呼び出す必要があります。私にはうまく機能している解決策がありますが、それは私にはとても厄介なようで、もっと良い方法があるかどうかを知りたいと思いました。

プレイブックへの入力を提供するためにYAMLファイル構造を定義し、そのファイルをinclude_varsモジュールで変数に読み込みました次にwith_items、サポートする必要のあるロール(現在は6ですが、増える可能性があります)ごとに配列を1回ループし、オブジェクト内のデータがそのロールに対して正しい場合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 }}"

他の役割は同じですがmsgType 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 }}"

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ