web-dev-qa-db-ja.com

ansible with_itemsリストのリストはフラット化されています

私は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}}"

サブリストだけではなく、すべての要素(モジュール、バージョン、エクストラなど)を出力します(これは私が期待するものです)

14
Neybar

残念ながら、これは意図した動作です。こちらをご覧ください with_temsとネストされたリストに関する議論

6
helloV

この問題を解決する別の方法は、リストのリストの代わりに複雑なアイテムを使用することです。次のように変数を構造化します。

- 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}}"
13
gameweld

@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
4
heemayl

置換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つだけがフラット化されます。

4
techraf