优雅的方式来处理与默认值from_json过滤器故障(Elegant way to handle f

2019-10-28 10:23发布

我在寻找你的想法很好地处理一个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,我愿意接受任何建议。

Answer 1:

(这是复制/从注释粘贴以上)

我发现,在写复杂的东西failed_when / changed_when可以得到容易失控。 您是否尝试过创建一个过滤器,然后像做failed_when: script_run | my_role_failed failed_when: script_run | my_role_failed

https://gist.github.com/tuxfight3r/37048ba536575277f5f4d26813d69489

过滤器住在你的ansible角色里面,下filter_plugins/ ,所以分布不应该是一个问题。 你可以去尽可能创造空ansible角色只定义过滤器,然后将它们包括在其他角色(通过meta/main.yml )并在那里使用。



文章来源: Elegant way to handle from_json filter failure with default value
标签: ansible