我在寻找你的想法很好地处理一个from_json
过滤器故障,当它发生。
我在ansible角色通用的任务,我用它来调用Sonatype的关系仓库管理器不同的Groovy脚本
- name: Calling Groovy script {{ script_name }}
uri:
url: "{{ nexus_api_scheme }}://{{ nexus_api_hostname }}:{{ nexus_api_port }}\
{{ nexus_api_context_path }}{{ nexus_rest_api_endpoint }}/{{ script_name }}/run"
user: 'admin'
password: "{{ current_nexus_admin_password }}"
headers:
Content-Type: "text/plain"
method: POST
force_basic_auth: yes
validate_certs: "{{ nexus_api_validate_certs }}"
body: "{{ args | to_json }}"
register: script_run
我呼吁所有的脚本返回一个JSON地图
{
"name": "name of the script"
"result": "whatever was used as a groovy return statement"
}
注意:有没有办法什么都加入到这个地图可以从常规,我只能在将数据传输回ansible result
现在,我想用result
,如果我的脚本调用会导致错误,变更或ansible ok状态进一步细节。 一些常规的脚本是完全“ansible知道”,并会在返回result
转义JSON字符串我可以用它来检查错误/变化。 但是,(时间是......)一些其他脚本不是“ansible感知”(或我不能改变他们自己),并会在返回result
一个简单的字符串(不含在大多数情况下,任何有用的信息)。
现在我真正的问题:如果我得到一个JSON结果我想用它来检查是否存在故障或变化。 如果它不是一个JSON结果,我只依靠一个成功的HTTP 200(直到脚本可以被固定)。
我几乎没有与下面的选项到我的任务:
failed_when: >-
script_run.status != 200
or
(script_run.json.result | from_json | default({})).error | default(false) | bool
changed_when: >-
(script_run.json.result | from_json | default({})).changed | default(false) | bool
可惜的是,当result
是一个简单的字符串, from_json
将触发一个错误( Expecting value: line 1 column 1 (char 0)
之前可以应用默认和我的剧本到此为止。
我目前的解决方法是添加另一个条件检查,如果result
与开始{
试图读取JSON之前,但我不是这个真的很高兴(因为JSON字符串可能仍然被破坏,仍然导致错误)
如果您有任何的关于如何优雅地用缺省值处理这个JSON解码错误的经验/想法或nicelly检查字符串是否可以被解码为ansible JSON,我愿意接受任何建议。