如何确保自定义 ansible 模块中的依赖关系,而无需手动复制所需的库?

问题描述 投票:0回答:1

我创建了一个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'
  1. 我创建了一个测试剧本
  2. 我创建了一个具有依赖关系的测试模块
  3. ansible.cfg中自定义的变量DEFAULT_MODULE_PATH
  4. 我传输了在远程主机上检查的脚本
python ansible devops ansible-module
1个回答
0
投票

据我了解,他们需要进入

module_utils
,所以有必要使用推荐的结构
module_utils

还有一些参考资料


...

module_utils
的提示帮助了我。您可以使用此目录为您自己的模块提供附加库。

感谢您的确认。

© www.soinside.com 2019 - 2024. All rights reserved.