Ansible:尝试将条件放在 vars 文件上

1 library conditional ansible

我正在开发一个项目,该项目将使用许多设备,这些设备需要配置相同的播放,但不同的变量。我有一个 vars 文件,其中包含许多库,每个设备一个。库名称与设备名称匹配,例如:

(设备 1)

- {xxx: "AAA", yyy: "BBB", zzz: "CCC"}
- {xxx: "AAA", yyy: "BBB", zzz: "CCC"}
Run Code Online (Sandbox Code Playgroud)

(设备 2)

- {xxx: "AAA", yyy: "BBB", zzz: "CCC"}
- {xxx: "AAA", yyy: "BBB", zzz: "CCC"}
Run Code Online (Sandbox Code Playgroud)

该剧本身应该找出哪个库与设备匹配,使用该库的变量而不使用其他变量。我目前的尝试是这样完成的:

- name: do this
  command: "do some of item.xxx with some item.zzz
- include_vars: device-library.yaml
  when: "{{item}} == {{ansible_hostname}}"
Run Code Online (Sandbox Code Playgroud)

但我总是得到:

致命:[xxx.xxx.xxx.xxx]:失败!=> {"failed": true, "msg": "ERROR!'item' 未定义"}

当这个项目只是一台设备时,我们with_items: stuff.yaml一直在使用,而且效果很好。

我的问题是:我必须用什么来代替{{item}},还是有更好的方法?

tec*_*raf 7

从这个声明:

该剧本身应该找出哪个库与设备匹配,使用该库的变量而不使用其他变量。

我的结论是,您正在尝试复制 Ansible 最基本的功能之一。

你应该做什么:

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

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

有关更多信息,请参阅文档