总结

总结

这是我的变量列表文件 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:,裸函数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

相关内容