【问题标题】:How to package shared code for Ansible modules如何为 Ansible 模块打包共享代码
【发布时间】:2019-09-09 19:11:05
【问题描述】:

我不得不编写一些共享代码的 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"
}

【问题讨论】:

  • 旁注:- debug: msg: "{{ results }}"可以写成- debug: var: results

标签: python ansible setuptools


【解决方案1】:

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

【讨论】:

  • 好的,你能澄清一下吗?首先,我不明白在这种情况下什么是“逻辑组”。其次,听起来您是在说捆绑在 Ansible 角色中的 Python 库将在 PYTHONPATH 中提供给使用该角色的任何剧本,因此所述剧本中使用的任何模块都可以从角色中导入库?这听起来很牵强,为什么一个角色会影响 PYTHONPATH。
  • 我只是说您可能不想将所有库都包含在一个角色中,而是希望根据逻辑推理将它们分成几个角色。
  • 该角色将仅对 playbook 可用。
  • 好吧,我想我明白了,你的意思是你将python模块放在角色的库中,所以角色单独可以使用模块。然后,您可以通过包含角色来使用您的游戏中的模块。我决定走一条更简单的路线,只在我的 git repo 中创建一个库目录,我将模块和共享代码放在其中。所以任何用户都可以 git clone 仓库并将 repo/library 添加到他们的库路径中。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-04-14
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多