ansible-galaxy 依赖空 meta/main.yml 失败
ansible-galaxy fails on dependency with empty meta/main.yml
我有一个 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 正确处理我的依赖项?
事实证明,空白 meta/main.yml 不足以将角色处理为依赖项。我的假设是,如果文件为空,则角色对象初始化时没有元数据字段,因为 the line mentioned in the verbose output 是:
role_dependencies = role.metadata.get('dependencies') or []
"role" 在此行之前使用,因此将是一个实例,而这是 "metadata".
的第一次提及
这部分代码正在处理安装嵌套依赖项,因为上面的行正在检查以确定它是否应该处理嵌套依赖项。
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:
足以满足此目的。
我刚刚 fixed this 在 devel
。应该制作 Ansible 的 2.4 版本。
我有一个 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 正确处理我的依赖项?
事实证明,空白 meta/main.yml 不足以将角色处理为依赖项。我的假设是,如果文件为空,则角色对象初始化时没有元数据字段,因为 the line mentioned in the verbose output 是:
role_dependencies = role.metadata.get('dependencies') or []
"role" 在此行之前使用,因此将是一个实例,而这是 "metadata".
的第一次提及这部分代码正在处理安装嵌套依赖项,因为上面的行正在检查以确定它是否应该处理嵌套依赖项。
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:
足以满足此目的。
我刚刚 fixed this 在 devel
。应该制作 Ansible 的 2.4 版本。