我正在开发一个项目,该项目将使用多个设备,这些设备需要配置相同的播放,但变量不同。我有一个 vars 文件,其中包含多个库,每个设备一个。库的名称与设备的名称匹配,例如:
(设备1)
- {xxx: "AAA", yyy: "BBB", zzz: "CCC"}
- {xxx: "AAA", yyy: "BBB", zzz: "CCC"}
(设备2)
- {xxx: "AAA", yyy: "BBB", zzz: "CCC"}
- {xxx: "AAA", yyy: "BBB", zzz: "CCC"}
该游戏本身应该找出哪个库与设备匹配,使用该库的变量而不使用其他变量。我目前的尝试是这样的:
- name: do this
command: "do some of item.xxx with some item.zzz
- include_vars: device-library.yaml
when: "{{item}} == {{ansible_hostname}}"
但我总是得到:
致命:[xxx.xxx.xxx.xxx]:失败!=> {“failed”:true,“msg”:“错误!'item'未定义”}
当这个项目只有一台设备时,我们with_items: stuff.yaml
一直在使用它,而且它运行良好。
我的问题是:我必须用什么来代替{{item}}
,或者有更好的方法吗?
答案1
从此声明中:
该游戏本身应该找出哪个库与设备匹配,使用该库的变量而不使用其他变量。
我的结论是,您正在尝试复制 Ansible 的最基本功能之一。
你应该做什么:
host_vars
在你的 Ansible 项目目录中创建一个子目录;- 将包含变量定义的文件移动到
host_vars
目录; - 确保上述文件名与 Ansible 用于引用目标机器的主机名完全匹配(无
.yaml
扩展名); - 从你的剧本中删除所有手动包含指令;
- 运行剧本。
或者,为了覆盖多台服务器,您可以使用子目录执行相同操作group_vars
,并根据清单文件中定义的组名命名文件。
參閱文档了解更多信息。