如何让Ansible自动同步自定义模块的依赖包到远程主机
如何让Ansible自动同步自定义模块的依赖包到远程主机
我完全懂你遇到的这个困扰——Ansible默认只会同步library目录下的主模块文件,不会自动带上子目录里的依赖包,导致远程执行时主模块找不到自己的utils模块,确实挺闹心的。而且你不想在playbook里加额外任务来装依赖,这个需求非常合理,毕竟额外任务会让playbook变臃肿,还要考虑后续清理的问题。
下面给你两个可行的解决方案,都能让Ansible自动把依赖包同步到远程主机,完全不用额外安装步骤:
方法一:把依赖包放到module_utils目录下(推荐)
Ansible原生会自动同步项目根目录下module_utils里的所有文件和子目录到远程主机的临时执行目录,这是最省心的原生支持方式。
具体操作步骤:
- 调整你的项目目录结构,把
utils目录从library移到module_utils下:my_project/ ├── inv/... ├── playbooks/ │ └── test_module.yml ├── library/ │ └── my_custom_module.py └── module_utils/ └── utils/ ├── __init__.py └── helper.py - 修改
my_custom_module.py里的导入语句,改成从ansible.module_utils路径导入:from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.utils.helper import some_function # 这里调整导入路径 - 直接运行原来的playbook就行,Ansible会自动把
module_utils/utils同步到远程临时目录,主模块就能顺利找到依赖了。
方法二:将主模块和依赖打包成zip文件(无需改导入路径)
如果不想调整导入语句的路径,你可以把主模块和utils目录打包成一个后缀为.py的zip文件,Ansible会识别这个zip作为模块上传,远程执行时Python能直接从zip里加载依赖。
具体操作步骤:
- 进入你的
library目录:cd my_project/library - 把主模块和utils目录打包成
my_custom_module.py(注意后缀是.py,哪怕本质是zip文件):zip -r my_custom_module.py my_custom_module.py utils/ - 现在你的
library目录里会有一个打包后的my_custom_module.py,原来的源文件可以备份或者删掉。 - 运行playbook时,Ansible会上传这个zip文件到远程,主模块里原来的
from utils.helper import some_function导入语句完全不用改,Python会自动从zip包里找到utils模块。
为什么原来的方式不行?
Ansible默认只会扫描library目录下的.py文件作为独立模块,不会递归同步子目录。所以你放在library/utils里的依赖包不会被上传到远程的临时执行目录(比如/tmp/ansible_xxx/),主模块自然找不到这些依赖。
这两个方法都能完美满足你的需求:不用在playbook里加额外任务安装依赖,Ansible会自动把依赖同步到远程,执行完后临时目录会被自动清理,完全不用手动删除。
备注:内容来源于stack exchange,提问作者craftself
相关产品推荐
相关产品推荐

