如何打包 Ansible 模块的共享代码

How to package shared code for Ansible modules

我不得不编写一些共享代码的 Ansible 模块,所以我尝试聪明地使用 setuptools 将它们打包。

Here is the setup.py

Here is one of the modules

安装的可执行文件使用 pkg_resources.load_entry_point,如果我从 CLI 手动 运行 它,我可以像这样 JSON 提供它。

$ siptrack_list.py|jq
{"ANSIBLE_MODULE_ARGS": {"pattern": "vmlnx-web0"}}
{
  "invocation": {
    "module_args": {
      "pattern": "vmlnx-web0",
      "search_all": false,
      "max_results": 10,
      "regexp": false
    }
  },
  "output": [
    {
      "oid": "1238720",
      "name": "vmlnx-web02"
    },
    {
      "oid": "1238562",
      "name": "vmlnx-web01"
    },
    {
      "oid": "1771701",
      "name": "vmlnx-web03"
    }
  ],
  "changed": false,
  "returned": [
    {
      "oid": "1238720",
      "name": "vmlnx-web02"
    },
    {
      "oid": "1238562",
      "name": "vmlnx-web01"
    },
    {
      "oid": "1771701",
      "name": "vmlnx-web03"
    }
  ]
}

而且有效!我在 JSON.

中得到结果

但是如果我 运行 它使用 ansible 或 ansible-playbook 可执行文件我得到这个错误。

fatal: [127.0.0.1]: FAILED! => {"changed": false, "msg": "Error: Module unable to decode valid JSON on stdin.  Unable to figure out what parameters were passed"}

这是我使用的剧本。

---

- hosts: 127.0.0.1
  connection: local
  gather_facts: False

  tasks:
    - name: List siptrack devices
      siptrack_list:
        pattern: vmlnx-web02
        max_results: 1
      register: results

    - debug:
        msg: "{{ results }}"

所以我很想找出我在这里遗漏了什么。因为我喜欢使用 setuptools。这个想法是将可执行文件符号链接到 Ansible 库目录中。或者有人对如何在 Ansible 模块之间共享代码有其他想法吗?

使用ansible调用模块也会报错

$ ansible -m siptrack_list -a 'pattern=vmlnx-we' -c local 127.0.0.1
127.0.0.1 | FAILED! => {
    "changed": false, 
    "msg": "Error: Module unable to decode valid JSON on stdin.  Unable to figure out what parameters were passed"
}

我以前没有采用过这种方法。相反,我们所做的是将库分组为逻辑组,并将它们捆绑在 Ansible 角色下。这些角色在内部 GitHub 上发布,并使用 Galaxy 进行引用。该库将在角色 "first run" 之后对整个剧本可用。因此,您只需在 运行 任何其他任务之前包含该角色,库就可用了。

尽管标题令人困惑,但我认为我会 post 这个问题的真正答案。我从来没有能够按照我想要的方式使用 setuptools,但我确实在文档中找到了一种将共享代码打包到 ansible 模块中的官方方法。

https://docs.ansible.com/ansible/latest/dev_guide/developing_module_utilities.html

这甚至是 Ansible 本身提供 openstack 模块通用共享代码的方式。