ansible-galaxy与空元/ main.yml

时间:2017-08-01 08:43:39

标签: ansible ansible-2.x ansible-galaxy

我有一个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正确处理我的依赖关系?

2 个答案:

答案 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:

足以达到此目的。