在Ansibleangular色中,默认值和variables之间有什么区别?
当创build一个新的Ansibleangular色时,模板创build一个空的main.yml
文件的vars
和一个defaults
目录。 当定义我的angular色时,我可以在其中任何一个中放置variables定义,并且可以在我的任务中使用它们。
将定义放入defaults
和vars
之间有什么区别? 什么应该进入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.yml
和vars/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设置一个特定的值,导致这个空间不能保持为空。