首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ansible-galaxy依赖于空的meta/main.yml失败

ansible-galaxy依赖于空的meta/main.yml失败
EN

Stack Overflow用户
提问于 2017-08-01 16:43:39
回答 2查看 2.9K关注 0票数 2

我有一个requirements.yml文件,其中列出了Ansible角色的依赖关系:

代码语言:javascript
复制
---

- 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。

使用以下命令安装依赖项时:

代码语言:javascript
复制
ansible-galaxy install --role-file requirements.yml --roles-path foo

在安装了第一个依赖项之后,它会出现以下错误:

代码语言:javascript
复制
ERROR! Unexpected Exception: 'NoneType' object has no attribute 'get'

使用非常详细的输出,可以定位错误:

代码语言:javascript
复制
galaxy.py", line 394

在实验之后,再运行该命令几次,就可以一次运行一个依赖项。因此,嵌套依赖项将失败;因为父进程可能会安装然后出错,或者ansible-galaxy会认为父进程已经安装并跳过依赖项。

问题是:我如何阻止这个错误的发生,并让ansible-galaxy正确处理我的依赖关系?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-01 16:43:39

事实证明,空的meta/main.yml不足以将角色处理为依赖项。我的假设是,如果文件为空,则角色对象初始化时没有元数据字段,就像the line mentioned in the verbose output一样:

代码语言:javascript
复制
role_dependencies = role.metadata.get('dependencies') or []

“角色”在这一行之前使用,因此将是一个实例,而这是第一次提到“元数据”。

这部分代码处理安装嵌套依赖项,因为上面的代码行正在进行检查,以确定它是否应该处理嵌套依赖项。

代码语言:javascript
复制
if not no_deps and installed:
  role_dependencies = role.metadata.get('dependencies') or []
  ...

如果此行还检查是否存在元数据,例如:

代码语言:javascript
复制
if not no_deps and installed and metadata:

那么这一部分将被(合理地)跳过。然而,由于Ansible不做这种检查,元数据是'NoneType‘对象,它实际上没有'get’属性。

这意味着meta/main.yml文件至少需要一个键才能作为依赖项处理。有一个meta/main.yml文件:

代码语言:javascript
复制
---

galaxy_info:

对于这个目的来说是足够的。

票数 0
EN

Stack Overflow用户

发布于 2017-09-01 02:01:39

我只是在devel中使用fixed this。应该会发布Ansible的2.4版本。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45432994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档