在 Ansible 扮演的角色中,违约和 vars 有什么区别?

在创建新的 Anble 角色时,模板将创建一个 vars和一个 defaults目录,其中包含一个空的 main.yml文件。在定义我的角色时,我可以将变量定义放在其中的任何一个中,它们将在我的任务中可用。

将定义放入 defaultsvars有什么区别?什么应该进入 defaults,什么应该进入 vars?对同一数据同时使用这两种方法有意义吗?

我知道这两者之间的优先级/优先级有所不同,但我想知道应该把什么放在哪里。

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

这看起来是这样的:

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

我可以把它放在 defaults/main.yml或者 vars/main.yml中,从执行的角度来看,这没有什么不同——但是它应该放在哪里呢?

70597 次浏览

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

如果在不同的地方定义了同名的多个变量,它们将按照一定的顺序获胜,即:

  • 额外的 vars (命令行中的-e)总是获胜
  • 然后是在库存中定义的连接变量(anable _ ssh _ user 等)
  • 然后是“几乎所有其他东西”(命令行开关、正在运行的 vars、包括 vars、 role vars 等)
  • 然后是库存中定义的其他变量
  • 然后就发现了一个系统的事实
  • 然后是“角色违约”,这是最“缺陷”的,失去了对所有事情的优先权。

因此,假设您有一个“ Tomcat”角色,用于在一系列网络主机上安装 Tomcat,但是您需要在几个主机上安装不同版本的 Tomcat,需要它在其他情况下作为不同的用户运行,等等。defaults/main.yml文件可能是这样的:

tomcat_version: 7.0.56
tomcat_user: tomcat

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

编辑: 请注意,上面的列表是针对可视化1.x 的。在 Ansible,这个名单已经扩大了。一如既往,可移植文件为2.x 提供了变量优先级的详细描述。

var中定义的角色变量具有很高的优先级——它们只能通过在命令行、特定任务或块中传递它们来覆盖。因此,几乎所有的变量都应该在 defaults中定义。

在文章“ 变量优先级-在哪里放置您的角色变量”中,作者给出了在 vars中放入什么的一个示例: 不会发生太大变化的系统特定常量。因此,您可以使用相同的变量名称但不同的值来创建 vars/debian.ymlvars/centos.yml,并有条件地包含它们。

变量和默认值密切相关

-name: install package
yum: name=xyz\{\{package_version}} state=present

在你的默认文件中,你会看到这样的东西:

package_version: 123

可以做的是,它将取 package_version的值并把它放在包名的旁边,这样它就会在某个地方读到:

-name: install package
yum: name=xyz123 state=present

这样,它将安装 xyz123,而不是 xyz123.4或其他在 xyz 的伟大存储库中的东西。

最后它会做 yum install -y xyz123

所以基本上默认值就是存在的值,如果你没有为变量设置一个特定的值,因为空间不能保持为空。

恕我直言,安赛布尔如此重视 角色Vars的配置是不切实际和不明智的。vars/main.ymldefaults/main.yml中的配置应该是低优先级的,并且可能具有相同的优先级。

在现实生活中有没有我们想要这种行为的例子?

有些例子说明我们不想这样。

这里要说明的是,defaults/main.yml中的配置不能是动态的。在 vars/main.yml中的配置可以。例如,您可以动态地包含特定 OS 和版本的配置,如 格林格,后期所示

但是,由于优先级在 Ansible 是如此奇怪和不切实际,吉林盖伊需要引入 伪变量,就像在 变量中看到的那样

- name: Define postgresql_packages.
set_fact:
postgresql_packages: "\{\{ __postgresql_packages | list }}"
when: postgresql_packages is not defined

这是一个具体的现实例子,表明优先级是不切实际的。

这里要说明的另一点是,我们希望角色是可配置的。角色可以是外部的,由其他人管理。一般来说,您不希望角色中的配置具有高优先级。

基本上,任何进入“ role default”(角色内部的默认文件夹)的内容都是最具可塑性和容易覆盖的。角色的 vars 目录中的任何内容都会覆盖命名空间中该变量的以前版本。这里要遵循的思想是,范围越明确,命令行的优先级就越高——额外的 vars 总是获胜。主机和/或库存变量可以赢得角色缺省值,但是不能显式地包含 vars 目录或 include _ vars 任务。 医生