ansible - 如何在外部定义未命名的项目列表
问题描述
这是我想从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 本身不应该担心它的客户是如何命名的。
如果可能,我该如何完成?
解决方案
正如错误消息所说,的内容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.yml
,packages
作为顶级变量名是有意义的。
推荐阅读
- python - 尝试提取数据时不断收到 401 错误
- c# - 为什么我的 return 语句在 try-finally 之后无法访问?
- python - Jupyter 不显示 matplotlib 图
- node.js - ESLint 和 prettier 不喜欢 .ejs 文件中的 i18n
- c - 当 p 指向一个数组(int)索引时,'-1[p]' 是什么?
- r - 创建类似于 devtools::check() 的输出诊断(颜色和加载符号)
- html - 如何使用 CSS FlexBox 创建复杂的页面布局
- python - Python:并非所有参数都在字符串格式期间转换
- amazon-web-services - AWS API Gateway - Lambda - 内部服务器错误
- java - 在多线程环境中使用 for 循环避免 ConcurrentModificationException