Variables Ansible 2.8角色-使用vars/main目录

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”:“

我正在尝试将Ansible角色变量拆分为多个文件-根据,应该可以创建
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"