TL;DR

TL;DR

내 변수 목록 파일 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

TL;DR

  loop: "{{ stuff }}"

전체 이야기

전자가 여전히 기본적으로 널리 사용되는 것과는 반대로 with_items:, bare는 전달된 인수에 loop:자동을 적용하지 않습니다 .flatten(level=1)

이 기능에 대한 자세한 내용은 다음을 참조하세요.

귀하의 예가with_items

  with_items: 
    - "{{ stuff }}"

결과 목록은 여전히 ​​파일에 정의한 것과 똑같습니다.

이제 다음과 함께 사용됩니다.loop

  loop:
    - "{{ stuff }}"

다음과 같은 목록 목록을 반복하고 있습니다(아래 예 상단의 단독 대시와 나머지 콘텐츠의 들여쓰기에 유의하세요. 오타가 아닙니다).

- 
  - stuff1: bill
    stuff2: sue

따라서 루프에서 얻는 첫 번째 요소는 실제로 var 파일의 전체 목록입니다.

이 문제를 해결하려면 변수를 에 올바르게 전달하십시오 loop. 즉,

  loop: "{{ stuff }}"

답변2

변수 파일의 형식이 잘못되었습니다. 최상위 수준은 목록이 아니며 다음과 같아야 합니다.

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

또한 vars 파일 경로는 Ansible 루트의 /로 시작해야 합니다.

vars_files:
  - /vars/blah.yml

관련 정보