在Ansible AWX运行时EE中如何在同一Playbook内先安装模块再执行依赖任务
在Ansible AWX运行时EE中如何在同一Playbook内先安装模块再执行依赖任务
这个问题我之前帮同事排查过,核心原因是Ansible的静态解析机制在搞鬼!简单来说,Ansible在真正开始执行playbook的任务前,会先扫描整个playbook里所有用到的模块,提前检查这些模块是否存在。而你安装模块的任务是在执行阶段才跑的,所以解析阶段就会直接判定模块缺失,报错退出,根本轮不到后面安装模块的任务执行。
给你几个实用的解决办法,都是在AWX EE环境里验证过的:
方法一:动态加载依赖任务文件
把需要用到新模块的任务单独放到一个任务文件里,用include_tasks来动态加载——注意一定要用include_tasks而不是import_tasks,因为import是静态加载,会在初始解析阶段就扫描文件内容,达不到我们要的效果。
举个具体的例子:
- 主playbook内容:
--- - name: 安装模块并执行核心任务 hosts: localhost gather_facts: no tasks: - name: 安装所需的Python模块 ansible.builtin.pip: name: 你的模块名称 state: present # 如果EE里有多个Python环境,可能需要指定pip路径,比如 executable: pip3 - name: 动态加载依赖模块的任务 ansible.builtin.include_tasks: tasks/核心任务集合.yml
- 新建
tasks/核心任务集合.yml文件,把你原来的"desired code"放进去:
- name: 使用刚安装的模块执行任务 你的模块名称: 参数1: 值1 参数2: 值2
这样Ansible在初始解析时只会扫描主playbook的内容,不会去管被include的文件,等安装完模块再加载执行核心任务时,模块已经存在了,自然不会报错。
方法二:拆分为两个独立的Play
把安装模块和执行核心任务分成两个独立的play,每个play在执行前都会重新检查模块存在性。第一个play安装完成后,第二个play启动时模块已经在EE环境里了,就能正常执行。
示例playbook:
--- - name: 第一步:安装所需模块 hosts: localhost gather_facts: no tasks: - name: 安装目标Python模块 ansible.builtin.pip: name: 你的模块名称 state: present - name: 第二步:执行依赖模块的核心任务 hosts: localhost gather_facts: no tasks: - name: 运行核心业务任务 你的模块名称: 参数1: 值1 参数2: 值2
额外注意事项
在AWX的EE环境里,有时候需要确保pip安装的路径和Ansible使用的Python环境一致,如果安装后还是找不到模块,可以尝试给pip模块加上executable: pip3参数,或者指定virtualenv路径(不过大部分官方EE环境都是统一的Python环境,一般不需要)。
备注:内容来源于stack exchange,提问作者Alex Manea
相关产品推荐
相关产品推荐

