在python云堆栈模块中调试ansible跟踪以查找可能的错误
对于用于上载ssh密钥的Ansible任务,请考虑以下问题:在python云堆栈模块中调试ansible跟踪以查找可能的错误,python,python-3.x,python-2.7,ansible,apache-cloudstack,Python,Python 3.x,Python 2.7,Ansible,Apache Cloudstack,对于用于上载ssh密钥的Ansible任务,请考虑以下问题: File "/home/foo/.ansible/tmp/ansible-tmp-1539175437.69-201636907966313/AnsiballZ_cs_sshkeypair.py", line 113, in <module> _ansiballz_main() File "/home/foo/.ansible/tmp/ansible-tmp-1539175437.69-2016369079
File "/home/foo/.ansible/tmp/ansible-tmp-1539175437.69-201636907966313/AnsiballZ_cs_sshkeypair.py", line 113, in <module>
_ansiballz_main()
File "/home/foo/.ansible/tmp/ansible-tmp-1539175437.69-201636907966313/AnsiballZ_cs_sshkeypair.py", line 105, in _ansiballz_main
invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
File "/home/foo/.ansible/tmp/ansible-tmp-1539175437.69-201636907966313/AnsiballZ_cs_sshkeypair.py", line 48, in invoke_module
imp.load_module('__main__', mod, module, MOD_DESC)
File "/tmp/ansible_cs_sshkeypair_payload_Jb1ZG5/__main__.py", line 267, in <module>
File "/tmp/ansible_cs_sshkeypair_payload_Jb1ZG5/__main__.py", line 258, in main
File "/tmp/ansible_cs_sshkeypair_payload_Jb1ZG5/__main__.py", line 133, in register_ssh_key
File "/tmp/ansible_cs_sshkeypair_payload_Jb1ZG5/__main__.py", line 211, in get_ssh_key
File "/tmp/ansible_cs_sshkeypair_payload_Jb1ZG5/__main__.py", line 227, in _get_ssh_fingerprint
File "/usr/local/lib/python2.7/dist-packages/sshpubkeys/keys.py", line 157, in hash_md5
fp_plain = hashlib.md5(self._decoded_key).hexdigest()
TypeError: md5() argument 1 must be string or buffer, not None
fatal: [localhost]: FAILED! => {
"changed": false,
"module_stderr": "Traceback (most recent call last):\n File \"/home/foo/.ansible/tmp/ansible-tmp-1539175437.69-201636907966313/AnsiballZ_cs_sshkeypair.py\", line 113, in <module>\n _ansiballz_main()\n File \"/home/foo/.ansible/tmp/ansible-tmp-1539175437.69-201636907966313/AnsiballZ_cs_sshkeypair.py\", line 105, in _ansiballz_main\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n File \"/home/foo/.ansible/tmp/ansible-tmp-1539175437.69-201636907966313/AnsiballZ_cs_sshkeypair.py\", line 48, in invoke_module\n imp.load_module('__main__', mod, module, MOD_DESC)\n File \"/tmp/ansible_cs_sshkeypair_payload_Jb1ZG5/__main__.py\", line 267, in <module>\n File \"/tmp/ansible_cs_sshkeypair_payload_Jb1ZG5/__main__.py\", line 258, in main\n File \"/tmp/ansible_cs_sshkeypair_payload_Jb1ZG5/__main__.py\", line 133, in register_ssh_key\n File \"/tmp/ansible_cs_sshkeypair_payload_Jb1ZG5/__main__.py\", line 211, in get_ssh_key\n File \"/tmp/ansible_cs_sshkeypair_payload_Jb1ZG5/__main__.py\", line 227, in _get_ssh_fingerprint\n File \"/usr/local/lib/python2.7/dist-packages/sshpubkeys/keys.py\", line 157, in hash_md5\n fp_plain = hashlib.md5(self._decoded_key).hexdigest()\nTypeError: md5() argument 1 must be string or buffer, not None\n",
"module_stdout": "",
"msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
"rc": 1
}
Ubuntu 18.04 LTS,Python 3
FROM ubuntu:18.04
ENV WORKDIR /work
WORKDIR $WORKDIR
COPY . $WORKDIR/example/
RUN mv example/.ssh/ ~/ && ls -alh ~/.ssh/ && \
apt-get -y update && apt-get -y install software-properties-common && apt-add-repository ppa:ansible/ansible && \
apt-get -y update && \
apt-get -y install python3-pip && pip3 install ansible cs sshpubkeys && \
echo "List installed Python packages:" && pip3 list && python3 --version && ansible --version
系统似乎删除了临时生成的Python脚本。是否有保留它们以供调试的选项
旁注:example/.ssh/
包含目标系统未知的新ssh密钥
假设:虽然最终的动态文件名为
AnsiballZ_cs_sshkeypair.py
,但它是否来自Pythoncs
(Apache云堆栈绑定)模块?临时脚本默认情况下将被删除,因为它们基本上只是从Ansible主机传输的模块文件(包装成AnsiballZ)的副本。在这种情况下,我猜远程主机与Ansible主机相同,但这并不重要,因为概念是相同的。ansiballz包装模块的命名方案与您假设的基本相同
但实际上,您可以通过将ANSIBLE\u KEEP\u REMOTE\u FILES=1
预先添加到playbook调用来覆盖自动删除,如下所示:
ANSIBLE_KEEP_REMOTE_FILES=1 ansible-playbook <playbookname>.yml -vvv
设置开发环境。然后,您可以使用Python解释器直接调用该模块,并使用pdb等工具。我建议您准备以下格式的json文件
{"ANSIBLE_MODULE_ARGS": { "key1": "value1", "key2"... }}
然后,您应该能够像这样调用模块:
python <module-name-plus-path> <json-file-plus-path>
python
我希望有帮助
编辑:我忘了一件事。看看这本书。如果你真的想深入了解这件事,这将对你有很大帮助。谢谢@kb-0!这是一个非常有用的反馈。此级别的Ansible洞察无法在当前项目中实施。。。奇怪的是,每次运行“重做”步骤时都会生成文件/root/.ansible/tmp/ansible-tmp-1540197991.746526-125643635688315/AnsiballZ_cs_instance.py。是否有一个选项可以禁用临时文件的时间戳,以便我可以插入断点?不幸的是,Ansiballz包装捕获pdb stacktraces,并且总是失败,并使用BDBguit()表示包装关闭调试外壳,然后返回module.fail_json()。当我在开发自定义模块时忘记了代码中的跟踪信息时,有好几次我都感到很沮丧。使用pdb之类的东西的唯一方法(据我所知)是通过本机Python调用模块。
{"ANSIBLE_MODULE_ARGS": { "key1": "value1", "key2"... }}
python <module-name-plus-path> <json-file-plus-path>