如何获取ansible.module_utils来解析我的自定义目录

时间:2017-06-27 17:31:28

标签: python-2.7 ansible ansible-2.x

ansible.cfg中的某些变量似乎没有生效。 Ansible 2.2.1.0 Python 2.7.10 Mac OS版本10.12.5

我们已经创建了一个将在我们的自定义Ansible模块中使用的自定义类。班上住在这里:

  

/sites/utils/local/ansible/agt_module_utils/ldapData.py   /位点/ utils的/本地/ ansible / agt_module_utils /的初始化的.py

ldapData.py中的类名为:

class ldapDataClass(object):

在所有情况下, init .py都是一个零字节文件。 我们的Ansible模块位于:

  

/位点/ utils的/本地/ ansible / agt_modules /的初始化的.py   /sites/utils/local/ansible/agt_modules/agtWeblogic.py

atgWeblogic中的import语句如下所示:

from ansible.module_utils.ldapData import ldapDataClass

我也尝试过:

from ldapData import ldapDataClass

配置文件包含以下行:

  

library = / sites / utils / local / ansible / att_modules   module_utils = / sites / utils / local / ansible / att_module_utils

运行我们的模块时,模块目录已解析但未解析module_utils目录。当include是“来自ansible.module_utils.ldapData import ldapDataClass”时,失败就在ansible甚至连接到远程机器之前。当include是“from ldapData import ldapDataClass”时,失败在远程机器上。下面我显示“远程机器上的故障”(向右滚动以查看完整错误):

  

nverkland @ local> ansible ecomtest37 -m agtWeblogic -a“action = stop instances = tst37-shop-main”-vvv

ecomtest37 | FAILED! => {
    "changed": false, 
    "failed": true, 
    "invocation": {
        "module_name": "agtWeblogic"
    }, 
    "module_stderr": "", 
    "module_stdout": "Traceback (most recent call last):\r\n  File \"/tmp/ansible_FwHCmh/ansible_module_attWeblogic.py\", line 63, in <module>\r\n    from ldapData import ldapDataClass\r\nImportError: No module named ldapData\r\n", 
    "msg": "MODULE FAILURE"
}

如果我将ldapData.py文件移动到“ansible installed”module_utils目录(我的Mac上的/Library/Python/2.7/site-packages/ansible/module_utils/),模块运行正常。我在配置文件中错误地使用了我的“自定义”module_utils目录做了什么?

感谢。

2 个答案:

答案 0 :(得分:4)

自Ansible 2.3开始,

module_utils路径可配置:changelogPR

我猜你必须升级或重构模块。

更新:工作示例

项目树:

.
├── ansible
│   └── ansible.cfg
├── module_utils
│   └── mycommon.py
└── modules
    └── test_module.py

ansible.cfg:

[defaults]
library = ../modules
module_utils = ../module_utils

mycommon.py:

class MyCommonClass(object):

    @staticmethod
    def hello():
        return 'world'

test_module.py:

#!/usr/bin/python

from ansible.module_utils.basic import *
from ansible.module_utils.mycommon import MyCommonClass

module = AnsibleModule(
    argument_spec = dict()
)
module.exit_json(changed=True, hello=MyCommonClass.hello())

执行:

$ ansible localhost -m test_module
 [WARNING]: Host file not found: /etc/ansible/hosts

 [WARNING]: provided hosts list is empty, only localhost is available

localhost | SUCCESS => {
    "changed": true,
    "hello": "world"
}

Ansible版本:

$ ansible --version
ansible 2.3.1.0
  config file = /<masked>/ansible/ansible.cfg
  configured module search path = [u'../modules']
  python version = 2.7.10 (default, Feb  7 2017, 00:08:15) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)]

答案 1 :(得分:0)

康斯坦丁的笔记有所帮助。我设法解决了这个谜语。 在我的配置文件中,我有:

module_utils = /sites/utils/local/ansible/agt_module_utils

这导致Ansible认为我的班级位于:

import ansible.agt_module_utils.ldapData (working)
直到现在我才试图在以下地方找到课程:

import ansible.module_utils.ldapData (broken)