如何让 ansible.module_utils 解析我的自定义目录
How to get ansible.module_utils to resolve my custom directory
ansible.cfg 中的某些变量似乎没有生效。
安塞波 2.2.1.0
Python 2.7.10
Mac OS 版本 10.12.5
我们已经创建了一个自定义 class,它将在我们的自定义 Ansible 模块中使用。 class 住在这里:
/sites/utils/local/ansible/agt_module_utils/ldapData.py
/sites/utils/local/ansible/agt_module_utils/init.py
ldapData.py里面的class被命名为:
class ldapDataClass(对象):
在所有情况下,init.py 都是零字节文件。
我们的 Ansible 模块位于此处:
/sites/utils/local/ansible/agt_modules/init.py
/sites/utils/local/ansible/agt_modules/agtWeblogic.py
atgWeblogic 中的导入语句如下所示:
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 是 "from ansible.module_utils.ldapData import ldapDataClass" 时,失败发生在 ansible 甚至连接到远程机器之前。当 include 为 "from ldapData import ldapDataClass" 时,故障出在远程机器上。下面我显示失败 "on the remote machine"(向右滚动查看完整错误):
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 目录(/Library/Python/2.7/site-packages/ansible/module_utils/ 在我的 Mac ) 模块运行良好。我在我的配置文件中做错了什么导致无法使用我的 "custom" module_utils 目录?
谢谢。
module_utils
路径自 Ansible 2.3 起可配置:changelog, PR.
我猜你必须升级或重构模块。
更新:工作示例
项目树:
.
├── 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)]
Konstantin 的笔记很有帮助。我设法解开了谜语。
在我的配置文件中,我有:
module_utils = /sites/utils/local/ansible/agt_module_utils
这导致 Ansible 认为我的 class 位于:
import ansible.agt_module_utils.ldapData (working)
直到现在,我一直试图在以下位置找到 class:
import ansible.module_utils.ldapData (broken)
ansible.cfg 中的某些变量似乎没有生效。 安塞波 2.2.1.0 Python 2.7.10 Mac OS 版本 10.12.5
我们已经创建了一个自定义 class,它将在我们的自定义 Ansible 模块中使用。 class 住在这里:
/sites/utils/local/ansible/agt_module_utils/ldapData.py /sites/utils/local/ansible/agt_module_utils/init.py
ldapData.py里面的class被命名为:
class ldapDataClass(对象):
在所有情况下,init.py 都是零字节文件。 我们的 Ansible 模块位于此处:
/sites/utils/local/ansible/agt_modules/init.py /sites/utils/local/ansible/agt_modules/agtWeblogic.py
atgWeblogic 中的导入语句如下所示:
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 是 "from ansible.module_utils.ldapData import ldapDataClass" 时,失败发生在 ansible 甚至连接到远程机器之前。当 include 为 "from ldapData import ldapDataClass" 时,故障出在远程机器上。下面我显示失败 "on the remote machine"(向右滚动查看完整错误):
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 目录(/Library/Python/2.7/site-packages/ansible/module_utils/ 在我的 Mac ) 模块运行良好。我在我的配置文件中做错了什么导致无法使用我的 "custom" module_utils 目录?
谢谢。
module_utils
路径自 Ansible 2.3 起可配置:changelog, PR.
我猜你必须升级或重构模块。
更新:工作示例
项目树:
.
├── 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)]
Konstantin 的笔记很有帮助。我设法解开了谜语。 在我的配置文件中,我有:
module_utils = /sites/utils/local/ansible/agt_module_utils
这导致 Ansible 认为我的 class 位于:
import ansible.agt_module_utils.ldapData (working)
直到现在,我一直试图在以下位置找到 class:
import ansible.module_utils.ldapData (broken)