首页 > 解决方案 > 如何在外部定义未命名的项目列表

问题描述

这是我想从packages.yml文件中使用的变量结构:

---
- name: Some description 1,
  package: package1

- name: Some description 1,
  package: package2

我的期望是,我导入文件并将列表存储在 packages 变量中:

- name: Import packages vars
  include_vars:
    file: packages.yml
    name: packages

然后我只想打印名称:

- name: iteration
  debug:
    msg: "name: {{ item.name }}"
  with_items: "{{ packages }}"

但得到错误:

任务 [导入包变量] ******************************************** ********致命:[默认]:失败!=> {"ansible_facts": {"packages": {}}, "ansible_included_var_files": [], "changed": false, "message": "/vagrant/packages.yml 必须存储为字典/散列"}

我试图得到的最初目的:

第一个。通过声明一个没有此列表名称的项目列表来简化属性定义。我的意思是,我不想在外部文件中将它们定义为:

---
- packages:
    - name: Some description 1,
      package: package1

    - name: Some description 1,
      package: package1

虽然这可以在没有 include_vars 的情况下轻松解决,但通过 vars_files 指令:

  vars_files:
    - packages.yml

第二。在 yml 文件中有一个未命名的项目列表,我想在剧本本身中给它一个名字。packages这就是我在剧本中通过“”在“导入包变量”任务中尝试做的事情

- name: Import packages vars
  include_vars:
    file: packages.yml
    name: packages    

通过这种方式,我将命名列表的责任转移给了它的消费者。List 本身不应该担心它的客户是如何命名的。

如果可能,我该如何完成?

标签: ansible

解决方案


正如错误消息所说,的内容packages.yml必须是字典或哈希,而不是顶层的列表。

您可以将列表分配给文件中的占位符变量,然后使用该set_fact模块将该值分配给您的剧本中的另一个变量。

packages.yml

list:
  - name: Some description 1,
    package: package1

  - name: Some description 1,
    package: package2

剧本:

- include_vars:
    file: packages.yml
    name: included_vars

- set_fact:
    packages: "{{ include_vars.list }}"

虽然,鉴于文件名为packages.ymlpackages作为顶级变量名是有意义的。


推荐阅读