如何在Ansible集合或旧风格角色中获取自身版本元数据?
如何在Ansible集合或旧风格角色中获取自身版本元数据?
我之前也碰到过这个问题,确实Ansible目前没有内置的魔术变量直接返回集合的版本号,这点挺让人挠头的。不过不用手动解析galaxy.yml,有几个实用的办法可以解决,分集合和旧角色两种情况来说:
针对Ansible集合的方案
方案1:复用变量避免重复维护
最稳妥的方式是在集合的vars/main.yml里定义版本变量,然后在galaxy.yml里复用这个值,这样两处版本始终保持一致,不用手动改两次:
- 在集合的
vars/main.yml中添加:
collection_version: "1.0.0"
- 修改
galaxy.yml引用这个变量(注意Ansible 2.10+支持在galaxy.yml中使用变量):
namespace: my-company name: test version: "{{ collection_version }}"
之后在集合的任意任务里,直接调用{{ collection_version }}就能拿到版本号了。
方案2:用lookup插件读取galaxy.yml
如果不想额外维护变量文件,可以用Ansible的yaml lookup插件直接加载galaxy.yml并提取版本,不用自己写解析逻辑:
- name: 获取当前集合的版本号 set_fact: my_collection_version: "{{ lookup('yaml', role_path ~ '/../galaxy.yml').version }}"
这里role_path指向集合内角色的路径,用../回到集合根目录找到galaxy.yml,这个方法的小缺点是依赖路径结构,不过在大多数标准集合部署场景下都能正常工作。
针对旧风格角色的方案
旧风格角色没有像集合那样的galaxy.yml统一元数据文件,最靠谱的方式是在角色内部定义版本变量:
- 在角色的
defaults/main.yml或者vars/main.yml中添加:
role_version: "2.3.1"
之后在角色的任务里直接引用{{ role_version }}即可。
如果你的角色是从Galaxy安装的,Ansible会把角色的元数据存在本地的~/.ansible/roles/角色名/meta/main.yml里,但这个路径是本地环境相关的,在运行时读取的话可靠性不高,还是自己在角色内定义变量更稳妥。
内容来源于stack exchange
相关产品推荐
相关产品推荐

