Simple Ansible模块无法运行,并显示“不支持的参数”错误。可能有些傻

时间:2019-04-05 14:29:38

标签: python-2.7 ansible

我正在尝试学习如何构建模块。目标是能够发送要由模块处理的变量,并将结果作为另一个变量返回,以便在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。

1 个答案:

答案 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"
    }
}