在Ansibleangular色中,默认值和variables之间有什么区别?

当创build一个新的Ansibleangular色时,模板创build一个空的main.yml文件的vars和一个defaults目录。 当定义我的angular色时,我可以在其中任何一个中放置variables定义,并且可以在我的任务中使用它们。

将定义放入defaultsvars之间有什么区别? 什么应该进入defaults ,什么应该变成vars ? 使用两个数据是否合理?

我知道两者在优先级和优先级上存在差异,但是我想知道应该在哪里去。

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

这是这样的:

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

我可以把它放到defaults/main.yml或者在vars/main.yml ,从执行的angular度来看,它没有什么区别 – 但是它应该去哪里呢?

关于variables优先的Ansible文档总结了这个niceley:

如果在不同地方定义了多个相同名称的variables,则它们按照一定顺序获得,即:

  • 额外的variables(-e在命令行中)总是赢
  • 然后是库存中定义的连接variables(ansible_ssh_user等)
  • 然后是“最重要的一切”(命令行开关,游戏中的variables,包括variables,angular色variables等)
  • 然后是库存中定义的其余variables
  • 然后发现有关系统的事实
  • 那么“angular色违约”就是最“​​默认”的,并且优先于一切。

因此,假设你有一个“tomcat”angular色,你可以在一系列虚拟主机上安装Tomcat,但是你需要不同版本的Tomcat在不同的主机上运行,​​在其他情况下需要运行不同的用户。 defaults/main.yml文件可能看起来像这样:

 tomcat_version: 7.0.56 tomcat_user: tomcat 

由于这些仅仅是默认值,这意味着如果这些variables没有在所讨论的主机的其他地方定义,就会被使用。 您可以通过extra-vars,通过库存文件中的事实等来覆盖这些variables,以便为这些variables指定不同的值。

编辑:请注意,上面的列表是为Ansible 1.x. 在Ansible 2.x中,列表已被扩展。 与往常一样, Ansible文档提供了有关2.x的variables优先级的详细描述。

var定义的angular色variables具有很高的优先级 – 只能通过将它们传递到命令行,特定任务或块中来覆盖它们。 因此,几乎所有的variables都应该在defaults情况下定义。

在文章“ variables优先 – 哪里把你的angular色variables ”作者给出了一个例子,以什么投入vars :系统特定的常量,并没有太大的变化。 所以你可以使用相同的variables名称,但不同的值的vars/debian.ymlvars/centos.yml ,并有条件地包含它们。

variables和默认值携手并进。 这里是一个例子

 -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

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