Molecule prepare步骤如何调用存放在其他目录的Ansible角色
解决方案
你要实现的跨目录调用角色的需求完全可行,该报错和权限无关,是Ansible角色搜索路径的解析优先级和Molecule执行上下文的问题。以下是按推荐优先级排序的实现方式:
- 最优方案:通过Molecule依赖配置预安装role-2
该方案和你部署环节的逻辑完全对齐,不会出现测试/生产环境不一致的问题。操作步骤如下:- 在你的Molecule场景目录(默认是
molecule/default/)下新建requirements.yml文件,内容如下:
--- roles: - name: role-2 src: ../../../role-2 # 此处路径为相对于当前requirements.yml的role-2父目录路径,也可以写绝对路径- 修改同目录下的
molecule.yml,添加依赖配置:
配置完成后Molecule会在执行prepare.yml前自动将role-2安装到自身的角色搜索目录,无需额外修改环境变量。dependency: name: galaxy options: role-file: requirements.yml - 在你的Molecule场景目录(默认是
- 次选方案:修正ANSIBLE_ROLES_PATH的路径配置
你之前配置的路径不生效大概率是相对路径计算错误,Molecule执行时的默认工作目录是场景目录(即molecule/default/),相对路径要基于该目录计算。推荐用绝对路径或者动态获取当前工作目录的方式配置,示例如下:
注意你之前添加的provisioner: name: ansible env: ANSIBLE_ROLES_PATH: "{{ lookup('env', 'PWD') }}/../../../role-2-parent-dir:~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles"become和become_user参数仅作用于角色内部任务的执行用户,不影响Ansible搜索角色的过程,Ansible是用执行molecule test命令的用户来搜索角色的,因此这两个参数对解决角色找不到的问题没有作用。 - 兜底方案:直接指定角色绝对路径
如果不想修改全局配置,可以直接在import_role中填写role-2的绝对路径,示例如下:
该方法不需要修改任何其他配置,直接生效。- name: Install role-2 import_role: name: /home/your-user/projects/role-2
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

