我有一个requirements.yml文件,列出了Ansible角色的依赖关系:
---
- src: git@gitrepo:group/dependency1.git
scm: git
name: name1
- src: git@gitrepo:group/dependency1.git
scm: git
name: name2
这些角色本身没有任何依赖关系,并且由于它们位于私有SCM系统上(以及其他原因),因此它们不需要任何元数据 . 但是,在Ansible依赖项中加载需要此文件存在 . 因此,依赖关系有一个空白的meta / main.yml来启用使用ansible-galaxy .
使用时安装依赖项:
ansible-galaxy install --role-file requirements.yml --roles-path foo
安装第一个依赖项后,它会出错:
ERROR! Unexpected Exception: 'NoneType' object has no attribute 'get'
使用非常详细的输出,错误定位:
galaxy.py", line 394
在实验之后,多次运行该命令将逐步通过依赖项 . 因此,嵌套的依赖项将失败;因为父节点将安装然后错误输出,或者ansible-galaxy会认为父节点已经安装并跳过依赖关系 .
问题是:如何阻止此错误发生并让ansible-galaxy正确处理我的依赖项?
2 回答
我只是fixed this在
devel
. 应该发布Ansible的2.4版本 .事实证明,空白的meta / main.yml不足以将角色作为依赖项处理 . 我的假设是,如果文件为空,则角色对象初始化时没有元数据字段,因为the line mentioned in the verbose output是:
“role”在此行之前使用,因此将是一个实例,而这是第一次提到“元数据” .
这部分代码正在处理安装嵌套依赖项,因为上面的行正在进行检查以确定它是否应该处理嵌套依赖项 .
如果此行还检查了元数据的存在,例如:
然后(正确地)跳过此部分 . 但是,由于Ansible不进行此检查,元数据是'NoneType'对象,它确实没有属性'get' .
这意味着meta / main.yml文件中至少需要一个键才能作为依赖项进行处理 . 有一个meta / main.yml文件:
足以达到这个目的 .