我有一个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正确处理我的依赖关系?
发布于 2017-08-01 16:43:39
事实证明,空的meta/main.yml不足以将角色处理为依赖项。我的假设是,如果文件为空,则角色对象初始化时没有元数据字段,就像the line mentioned in the verbose output一样:
role_dependencies = role.metadata.get('dependencies') or []“角色”在这一行之前使用,因此将是一个实例,而这是第一次提到“元数据”。
这部分代码处理安装嵌套依赖项,因为上面的代码行正在进行检查,以确定它是否应该处理嵌套依赖项。
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:对于这个目的来说是足够的。
发布于 2017-09-01 02:01:39
我只是在devel中使用fixed this。应该会发布Ansible的2.4版本。
https://stackoverflow.com/questions/45432994
复制相似问题