Ansible:尝试在 vars 文件上添加条件

Ansible:尝试在 vars 文件上添加条件

我正在开发一个项目,该项目将使用多个设备,这些设备需要配置相同的播放,但变量不同。我有一个 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 的最基本功能之一。

你应该做什么:

  1. host_vars在你的 Ansible 项目目录中创建一个子目录;
  2. 将包含变量定义的文件移动到host_vars目录;
  3. 确保上述文件名与 Ansible 用于引用目标机器的主机名完全匹配(无.yaml扩展名);
  4. 从你的剧本中删除所有手动包含指令;
  5. 运行剧本。

或者,为了覆盖多台服务器,您可以使用子目录执行相同操作group_vars,并根据清单文件中定义的组名命名文件。

參閱文档了解更多信息。

相关内容