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 }}"
他の役割は同じですがmsg
、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 }}"
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加