我创建了一个ansible模块,但我不想将所有内容都保存在一个文件中,而是将其拆分为包。在这方面,我的自定义模块依赖于这些包。当我运行我的剧本时。我收到一条错误消息
'ModuleNotFoundError'
。
我已经相应地设置了配置变量'DEFAULT_MODULE_PATH=./my_project/library'
。
我之前读到过,这个“库”目录会被复制到远程主机,然后执行脚本。
但是,当我查看远程主机上从ansible复制的脚本时,那里安装了各种python模块(/tmp/ansible_xxx.../),例如'module_utils'和'ansible_collections',以及我的主模块。但是我在“library”目录中创建的附加 python 包不存在。结果,调用失败,因为脚本找不到相应的包。
如何才能将我的依赖包与主脚本一起部署到远程主机? 或者配置中是否有我遗漏的设置,以便依赖项也被复制?
注意:我想避免在剧本中运行额外的任务来在远程计算机上安装所需的 python 模块,因为这会使代码不必要地膨胀。另外,之后我可能必须删除它们。
为了更好地理解,下面是一个示例:
目录结构:
my_project/
├── inv/...
├── playbooks/
│ └── test_module.yml
├── library/
│ ├── my_custom_module.py
│ └── utils/
│ ├── __init__.py
│ └── helper.py
my_custom_module.py:
from ansible.module_utils.basic import AnsibleModule
from utils.helper import some_function
def main():
module_args = dict(
param=dict(type='str', required=True)
)
module = AnsibleModule(argument_spec=module_args)
param = module.params['param']
# Verwende Funktionen aus deinen Abhängigkeiten
result = some_function(param)
# Rückgabe an Ansible
module.exit_json(changed=True, result=result)
if __name__ == '__main__':
main()
playbooks/test_module.yml:
- name: Test Custom-Modul
hosts: localhost
tasks:
- name: call Custom-Modul
my_custom_module:
param: "test-value"
我运行它:
ansible-playbook -i localhost, my_project/playbooks/test_module.yml
这导致了以下错误:
ModuleNotFoundError: No module named 'utils'
据我了解,他们需要进入
module_utils
,所以有必要使用推荐的结构module_utils
。
还有一些参考资料
module_utils
导入?ansible.module_utils
来解析我的自定义目录?...
的提示帮助了我。您可以使用此目录为您自己的模块提供附加库。module_utils
感谢您的确认。