要約

要約

変数リスト ファイル vars/blah.yml は次のとおりです。

---
stuff:
 - stuff1: bill
   stuff2: sue

変数の値を取得しようとしているだけです。

これが私のプレイブックです:

  hosts: all
  become: yes
  vars_files:
    - vars/blah.yml
  tasks:

  - name: test
    debug:
      var: "{{ item.stuff1 }} {{ item.stuff2 }}"
    loop :
      - "{{ stuff }}"

このエラーが発生しています。

fatal: [node1]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'stuff1'\n\nThe error appears to be in '/home/automation/plays/test1.yml': line 11, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n  - name: test\n    ^ here\n"}

何が間違っているのか誰か教えてもらえますか?

変数の書式を編集しました。それでも同じ結果になります。

答え1

要約

  loop: "{{ stuff }}"

全文

依然として広く使用されている前者とは異なりwith_items:、 bare は渡された引数にloop:自動的に適用されません。flatten(level=1)

この機能の詳細については、以下を参照してください。

もしあなたの例がwith_items

  with_items: 
    - "{{ stuff }}"

結果のリストは、ファイルで定義したものとまったく同じになります。

現在使用されているloop

  loop:
    - "{{ stuff }}"

次のようなリストのリストに対してループ処理を行っています (以下の例の先頭のダッシュ 1 つと、残りのコンテンツのインデントに注意してください。これはタイプミスではありません)。

- 
  - stuff1: bill
    stuff2: sue

したがって、ループで取得する最初の要素は、実際には var ファイル内の完全なリストです。

これを修正するには、変数を正しく渡すだけですloop。つまり、

  loop: "{{ stuff }}"

答え2

変数ファイルの形式が間違っています。最上位レベルはリストではなく、次のようになっている必要があります。

---
stuff:
  - stuff1: bill
    stuff2: sue

さらに、vars ファイルへのパスは、Ansible ルートからの / で始まる必要があります。

vars_files:
  - /vars/blah.yml

関連情報