当创建一个新的 Ansible 角色时,模板会创建vars一个defaults空main.yml文件目录。在定义我的角色时,我可以在其中任何一个中放置变量定义,它们将在我的任务中可用。
vars
defaults
main.yml
defaults将定义放入和有什么区别vars?应该进入defaults什么,应该进入vars什么?将两者用于相同的数据是否有意义?
我知道两者之间的优先级/优先级有所不同,但我想了解应该去哪里。
假设我的角色将在目标系统上创建一个目录列表。我想提供一个要创建的默认目录列表,但希望允许用户在使用角色时覆盖它们。
这是它的样子:
--- - directories: - foo - bar - baz
从执行的角度来看,我可以将它放入defaults/main.yml或 中vars/main.yml,这不会有任何区别 - 但它应该放在哪里?
defaults/main.yml
vars/main.yml
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 变量优先级的详细描述。