如何打包 Ansible 模块的共享代码
How to package shared code for Ansible modules
我不得不编写一些共享代码的 Ansible 模块,所以我尝试聪明地使用 setuptools 将它们打包。
安装的可执行文件使用 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 模块通用共享代码的方式。
我不得不编写一些共享代码的 Ansible 模块,所以我尝试聪明地使用 setuptools 将它们打包。
安装的可执行文件使用 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 模块通用共享代码的方式。