小编典典

Ansible 角色中的默认值和变量有什​​么区别?

all

当创建一个新的 Ansible
角色时,模板会创建vars一个defaultsmain.yml文件目录。在定义我的角色时,我可以在其中任何一个中放置变量定义,它们将在我的任务中可用。

defaults将定义放入和有什么区别vars?应该进入defaults什么,应该进入vars什么?将两者用于相同的数据是否有意义?

我知道两者之间的优先级/优先级有所不同,但我想了解应该去哪里。

假设我的角色将在目标系统上创建一个目录列表。我想提供一个要创建的默认目录列表,但希望允许用户在使用角色时覆盖它们。

这是它的样子:

---
- directories:
  - foo
  - bar
  - baz

从执行的角度来看,我可以将它放入defaults/main.yml或 中vars/main.yml,这不会有任何区别 - 但它应该放在哪里?


阅读 74

收藏
2022-07-29

共1个答案

小编典典

Ansible
关于变量优先级的文档很好地总结了这一点:

如果在不同的地方定义了多个同名变量,则按一定的顺序取胜,即:

  • 额外的变量(命令行中的-e)总是赢
  • 然后是库存中定义的连接变量(ansible_ssh_user 等)
  • 然后是“大多数其他东西”(命令行开关,正在播放的变量,包含变量,角色变量等)
  • 然后是库存中定义的其余变量
  • 然后是关于系统的事实发现
  • 然后是“角色默认值”,这是最“默认”的,失去了一切的优先权。

因此,假设您有一个“tomcat”角色,用于在一堆 webhosts 上安装 Tomcat,但您需要在几个主机上使用不同版本的
tomcat,在其他情况下需要它以不同用户身份运行,等等。defaults/main.yml文件可能看起来像这样的东西:

tomcat_version: 7.0.56
tomcat_user: tomcat

由于这些只是默认值,这意味着如果这些变量没有在其他任何地方为相关主机定义,它们将被使用。您可以通过额外变量、库存文件中的事实等覆盖这些变量,为这些变量指定不同的值。

编辑:请注意,上面的列表适用于 Ansible 1.x。在 Ansible 2.x 中,该列表已被扩展。与往常一样,Ansible
文档
提供了 2.x 变量优先级的详细描述。

2022-07-29