Ansible远程执行带依赖模块的Python脚本失败求助
解决Ansible执行Python脚本时无法导入同目录依赖的问题
问题原因
Ansible的script模块默认只会将指定的单个脚本(比如main.py)上传到远程节点的临时目录,不会自动同步同目录下的依赖文件(比如restart_tomcat.py),因此远程执行时Python找不到对应的模块。
可行解决方案(无需自定义Ansible模块)
方案1:同步整个脚本目录到远程后执行
这是最直接的方式,确保所有依赖文件都被传到远程节点:
- 先将本地存放脚本的整个目录同步到远程节点的固定路径:
- name: 同步脚本目录到远程节点 copy: src: ./your_local_script_dir/ # 本地main.py和restart_tomcat.py所在的目录路径 dest: /tmp/ansible_tomcat_scripts/ mode: '0755'
- 切换到远程脚本目录并执行
main.py:
- name: 执行远程节点上的main.py command: python3 main.py 1 args: chdir: /tmp/ansible_tomcat_scripts/
方案2:打包脚本目录后上传解压执行
如果脚本目录文件较多,打包后传输更高效:
- 在本地打包脚本目录:
- name: 打包本地脚本目录 archive: path: ./your_local_script_dir/ dest: /tmp/tomcat_scripts.tar.gz format: gz
- 将压缩包上传到远程节点:
- name: 上传压缩包到远程节点 copy: src: /tmp/tomcat_scripts.tar.gz dest: /tmp/tomcat_scripts.tar.gz
- 在远程节点解压压缩包:
- name: 在远程节点解压脚本包 unarchive: src: /tmp/tomcat_scripts.tar.gz dest: /tmp/ remote_src: yes
- 执行解压后的脚本:
- name: 执行远程节点上的main.py command: python3 main.py 1 args: chdir: /tmp/your_local_script_dir/ # 解压后的目录名和本地一致
方案3:单独上传依赖文件并修改脚本路径
如果仅需同步单个依赖文件,可先上传依赖再修改主脚本的Python路径:
- 上传依赖文件到远程节点的固定路径:
- name: 上传依赖文件restart_tomcat.py到远程 copy: src: ./your_local_script_dir/restart_tomcat.py dest: /tmp/ansible_deps/ mode: '0644'
- 修改
main.py开头,添加依赖文件的路径到Python搜索路径:
import sys sys.path.append('/tmp/ansible_deps/') import restart_tomcat # 原脚本其余代码
- 用
script模块执行修改后的main.py:
- name: 执行main.py script: main.py 1 args: executable: python3
内容的提问来源于stack exchange,提问作者Viv
相关产品推荐
相关产品推荐

