我有一个requirements.yml文件,列出了Ansible Role的依赖关系:
---
- 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正确处理我的依赖关系?
答案 0 :(得分:2)
我只是devel
中的fixed this。应该发布Ansible的2.4版本。
答案 1 :(得分:0)
事实证明,空白的meta / main.yml不足以将角色作为依赖项处理。我的假设是,如果文件为空,则角色对象初始化时没有元数据字段,因为the line mentioned in the verbose output是:
role_dependencies = role.metadata.get('dependencies') or []
“role”在此行之前使用,因此将是一个实例,而这是第一次提到“元数据”。
这部分代码正在处理安装嵌套依赖项,因为上面的行正在进行检查以确定它是否应该处理嵌套依赖项。
if not no_deps and installed:
role_dependencies = role.metadata.get('dependencies') or []
...
如果此行还检查了元数据的存在,例如:
if not no_deps and installed and metadata:
然后(正确地)跳过此部分。但是,由于Ansible不进行此检查,元数据是'NoneType'对象,它确实没有属性'get'。
这意味着meta / main.yml文件中至少需要一个键才能作为依赖项进行处理。有一个meta / main.yml文件:
---
galaxy_info:
足以达到此目的。