首页 文章

ansible-galaxy对空元/ main.yml的依赖失败

提问于
浏览
0

我有一个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 回答

  • 0

    我只是fixed thisdevel . 应该发布Ansible的2.4版本 .

  • 2

    事实证明,空白的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:
    

    足以达到这个目的 .

相关问题