我正在尝试学习如何构建模块。目标是能够发送要由模块处理的变量,并将结果作为另一个变量返回,以便在jinja2模板中使用。我认为我缺少一些非常基本的东西,找不到任何突出我做错事情的例子。
这是我第一次尝试构建模块,我几乎没有python经验。 我正在使用Python 2.7运行Ansible 2.7。我在网上和Ansible文档中看了几个示例,所以我想我很亲密,但是我不了解如何正确地传递变量或python命令在模块中的工作方式。
这是剧本:split.yml
- hosts: localhost
tasks:
- name: split a coumpound variable into parts
split:
excel: 'data1 data2'
register: result
- debug: var=result
这是library / split.py中的模块
#!/usr/bin/python
from ansible.module_utils.basic import *
def main():
module = AnsibleModule(argument_spec={})
splitcell = (excel.split()[0])
module.exit_json(changed=False, meta=splitcell)
if __name__ == '__main__':
main()
这是运行剧本时的错误:
致命:[localhost]:失败! => { “已更改”:错误, “调用”:{ “ module_args”:{ “ excel”:“ data1 data2” } }, “ msg”:“(拆分)模块不支持的参数:excel支持的参数包括:”} 要重试,请使用:--limit @ / root / ansible / split.retry
PLAY RECAP ****************************************************** ****************************************************** **************************************************本地主机:ok = 1个更改= 0不可达= 0
失败= 1
我还尝试了一个具有相似结果的不同功能:
剧本:processip.yml
- hosts: localhost
tasks:
- name: Test ip module
processip: ip_string="192.168.0.2/24"
register: result
- debug: var=result
模块:library / processip.py
#!/usr/bin/python
import ipaddress
from ansible.module_utils.basic import *
def main():
module = AnsibleModule(argument_spec={})
get_netmask = {ipaddress.IPv4Interface(ip_string).netmask}
module.exit_json(changed=False, meta=get_netmask)
if __name__ == '__main__':
main()
错误输出:
致命:[localhost]:失败! => { “已更改”:错误, “调用”:{ “ module_args”:{ “ ip_string”:“ 192.168.0.2/24” } }, “ msg”:“(processip)模块的不受支持的参数:ip_string受支持的参数包括:”} 要重试,请使用:--limit @ / root / ansible / processip.retry
PLAY RECAP ****************************************************** ****************************************************** **************************************************本地主机:ok = 1个更改= 0不可达= 0
失败= 1
对于尝试编号1,我只是尝试传递变量“ data1 data2”并将其在空格处拆分,然后返回列表中的第一个字符串(data1)
第二次尝试是获取IP地址192.168.0.2/24并使用python ipaddress模块对其进行处理,以返回192.168.0.2 255.255.255.0。
答案 0 :(得分:1)
您已经告诉Ansible您的模块不带任何参数:
module = AnsibleModule(argument_spec={})
如果您想接受excel
参数,则需要在代码中声明:
module = AnsibleModule(argument_spec={
'excel': {'type': 'str', 'required': True},
})
在您的代码中,您尝试访问名为excel
的变量,但是不存在这样的变量。您可以像这样获得参数值:
excel = module.params['excel']
通过这些更改,您的模块将如下所示:
#!/usr/bin/python
from ansible.module_utils.basic import *
def main():
module = AnsibleModule(argument_spec={
'excel': {'type': 'str', 'required': True},
})
excel = module.params['excel']
splitcell = (excel.split()[0])
module.exit_json(changed=False, meta=splitcell)
if __name__ == '__main__':
main()
运行示例将产生:
TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
"result": {
"changed": false,
"failed": false,
"meta": "data1"
}
}