私はansibleを使用してリストのリストをループしていくつかのパッケージをインストールしようとしています。ただし、{{item}}は、サブリスト自体ではなく、サブリスト内のすべての要素を返します。外部のansibleからのマニフェストリストからのyamlファイルがあり、次のようになります。
---
modules:
- ['module','version','extra']
- ['module2','version','extra']
- ['module3','version','extra']
私のタスクは次のようになります。
task:
- include_vars: /path/to/external/file.yml
- name: install modules
yum: name={{item.0}} state=installed
with_items: "{{ modules }}"
私がそれを実行すると、次のようになります:
fatal: [localhost]: FAILED! => {"failed": true, "msg": "ERROR! int object has no element 0"}
私が試みるとき:
- debug: msg="{{item}}"
with_items: "{{module}}"
サブリストだけではなく、すべての要素(モジュール、バージョン、エクストラなど)を出力します(これは私が期待するものです)
残念ながら、これは意図した動作です。こちらをご覧ください with_temsとネストされたリストに関する議論
この問題を解決する別の方法は、リストのリストの代わりに複雑なアイテムを使用することです。次のように変数を構造化します。
- modules:
- {name: module1, version: version1, info: extra1}
- {name: module2, version: version2, info: extra2}
- {name: module3, version: version3, info: extra3}
その後、引き続きwith_items
、 このような:
- name: Printing Stuffs...
Shell: echo This is "{{ item.name }}", "{{ item.version }}" and "{{ item.info }}"
with_items: "{{modules}}"
@helloVは既にwith_items
を使用してこれを行うことはできないという答えを提供しました。現在のデータ構造をwith_nested
で使用して目的の出力を取得する方法を示します。
プレイブックの例を次に示します。
---
- hosts:
- localhost
vars:
- modules:
- ['module1','version1','extra1']
- ['module2','version2','extra2']
- ['module3','version3','extra3']
tasks:
- name: Printing Stuffs...
Shell: echo This is "{{ item.0 }}", "{{ item.1 }}" and "{{ item.2 }}"
with_nested:
- modules
これで、stdout_lines
として次のものが得られます。
This is module1, version1 and extra1
This is module2, version2 and extra2
This is module3, version3 and extra3
置換with_items: "{{ modules }}"
with:
ansible 2.5以降( with_list
移植ガイド ):
loop: "{{ modules }}"
ansible 2.0以降:
with_list: "{{ modules }}"
ansible pre-2.0の場合:
with_items:
- "{{ modules }}"
この方法では、3つのレベルのネストされたリストがあり、デフォルトの動作ではそのうちの2つだけがフラット化されます。