Variables Ansible 2.8角色-使用vars/main目录
我正在尝试将Ansible角色变量拆分为多个文件-根据,应该可以创建Variables Ansible 2.8角色-使用vars/main目录,variables,ansible,roles,ansible-2.x,Variables,Ansible,Roles,Ansible 2.x,我正在尝试将Ansible角色变量拆分为多个文件-根据,应该可以创建vars/main目录,并且该目录中的所有.yml文件都应该自动加载 然而,就我而言,这似乎并没有发生 我的目录结构: vars └── main ├── gce_settings.yml ├── vsphere_settings.yml └── vsphere_zone.yml 但是,当我尝试使用vsphere_settings.yml中定义的变量时,Ansible抱怨该变量未定义: {“msg”:“
vars/main
目录,并且该目录中的所有.yml文件都应该自动加载
然而,就我而言,这似乎并没有发生
我的目录结构:
vars
└── main
├── gce_settings.yml
├── vsphere_settings.yml
└── vsphere_zone.yml
但是,当我尝试使用vsphere_settings.yml中定义的变量时,Ansible抱怨该变量未定义:
{“msg”:“该任务包含一个带有未定义变量的选项。错误为:'vsphere_user'未定义
如果我将变量声明移动到vars/main.yml
,一切都会按预期进行。但是,当然,我更愿意将变量分离到多个文件中
我在官方Ansible文档中找不到任何关于这个“功能”的参考,我也不知道如何解决它。有人能给我指出正确的方向吗
我的翻译:
Ubuntu 16.04上的ansible 2.8.5
在您询问之前:是的,我确实确保在尝试加载
vars/main/*.yml时,main.yml
不存在。TL;DR version:这是ansible中的一个bug,是由于vars/main
中存在空的.yml文件造成的。它已经有一个PR了。请参阅
实际结果(如注释中所述)实际上取决于文件的处理顺序(默认情况下,我的Ansible会按字母顺序处理它们,但这可能取决于版本或底层操作系统):
- 如果先处理空文件,则会收到一条错误消息:
error!无法组合变量,应为dict,但得到了“NoneType”和“AnsibleMapping”
- 如果在处理其他文件之后处理空文件,则不会出现错误消息,但此时设置的所有变量都将被销毁
更多细节:由于我不知道如何在Ansible中解决这个问题,所以我转到代码并开始添加print
语句以查看发生了什么
在我的例子中,我在vars/main
目录中有一些空的.yml文件(我计划稍后填充的文件)。嗯……看起来当代码遇到这样一个空文件时,它会破坏它迄今为止构建的整个字典
要么我错过了一些非常重要的东西,要么这是一个bug…复制步骤:
- 创建角色
- 创建
vars/main
目录,并用一些.yml文件填充它
- 添加一个空的.yml文件(命名为以便在其他文件之后处理)
- 尝试打印第一个文件中的变量
稍后编辑:是的,这是一个bug…请参见。下面的示例
$ cat play.yml
- hosts: localhost
roles:
- role1
$ cat roles/role1/tasks/main.yml
- debug:
var: var1
$ cat roles/role1/vars/main/var1.yml
var1: test_var1
给予
你应该在你的问题中编辑这个,而不是发表一个答案@β.εηοιτ.βε-因为这正式解决了我的问题(“这是一个bug,而且已经有一个PR了”),我决定用它来做一个答案。希望这能帮助其他人在同样的问题上绊倒。我将编辑答案并移动最终结果(“这是一只虫子为了让事情变得更清楚,这是无关的,不是bug。你在问题中提到的是角色变量。你缺少的是一个事实,链接答案中myrdd提到的所有路径实际上都是相对于角色文件夹的。链接的问题确实指的是剧本,但它是相同的代码路径和相同的行为(当新的数据没有时,combine_vars会破坏字典)。事实上,甚至bcoca也将一个角色问题()作为我链接的问题的副本关闭。@β.εηοιτ.βε-很抱歉,我错过了你评论的第二部分。当然,我上面测试的所有内容都与角色文件夹有关(答案应该清楚).但是当你说“这不是一个bug”“,你基于什么?我遗漏了什么?因为我已经链接了两个github问题,它们似乎说这是一个bug…如果我下面的示例对你不起作用,请发布详细信息。谢谢你,弗拉基米尔-我已经为问题添加了更多的详细信息,我还发布了另一个示例(包括复制步骤)在我的回答中。谢谢你——事实上,这就是事情的工作方式。我似乎偶然发现了一个由空的.yml文件引起的错误。有关详细信息,请参阅我的回答。
$ cat play.yml
- hosts: localhost
roles:
- role1
$ cat roles/role1/tasks/main.yml
- debug:
var: var1
$ cat roles/role1/vars/main/var1.yml
var1: test_var1
"var1": "test_var1"