【问题标题】:Convert Jboss (WildFly) cli output to json in Ansible在 Ansible 中将 Jboss (WildFly) cli 输出转换为 json
【发布时间】:2018-07-12 20:16:40
【问题描述】:

我正在努力通过其 cli 将我的部署过程自动化到 WildFly。 cli 本身不是幂等的,所以如果我想使用 ansible 添加一些服务器属性,它只会在它已经存在的情况下抛出错误(官方 cli 文档仅提供 3 种方法添加、读取、删除https://docs.jboss.org/author/display/WFLY10/CLI+Recipes - 否替换或强制添加)。所以我需要在之前创建一些条件,最简单的就是准备好了(只要存在):

Ansible 代码:

- name: Check Server Runtime properties
  shell: ./jboss-cli.sh --commands="connect {{ wf_server }},/core-service=platform-mbean/type=runtime:read-attribute(name=system-properties)" $AUTH_DATA
  args:
    chdir: "{{ wf_path }}/bin"
  register: srp_chk
- name: Configure Some properties
  shell: ./jboss-cli.sh --commands="connect {{ wf_server }},/system-property={{ item.mkey }}:add(value=\"{{ item.mval }}\")" $AUTH_DATA
  args:
    chdir: "{{ wf_path }}/bin"
  when: "not '{{ item.mkey }}' in srp_chk.stdout"
  with_items:
   - { mkey: some.property1, mval: "{{ some_value1 }}" }
   - { mkey: some.property2, mval: "{{ some_value2 }}" }

在我需要更改 some_value1 或 some_value2 之前它可以正常工作。在这种情况下,您可以得到,我需要删除属性并重新创建。

所以我们几乎接近我的问题:)

我知道这些值可以在 srp_chk.stdout 中找到,我可以为 ex 创建相同的检查:

when: "not '{{ item.mval }}' in srp_chk.stdout" 

但是如果我有更复杂的结构并且我需要在 Ansible 中比较两个 json?

我的问题从这里开始 :))

在我的示例中,srp_chk.stdout 以 Json 格式输出 Jboss cli,但在一行中,不幸的是,当我尝试 Jinja2 过滤器“from_json”时,它给出了错误:

the field 'args' has an invalid value ([]), and could not be converted to an dict

“to_json”和“to_nice_json”给出了一些奇怪的不可读数据和错误:

template error while templating string: expected token 'end of print statement', got 'outcome'.

“结果” - 是我的字符串的内容。

所以,我有变量 srp_chk.stdout_lines,它在 json 格式方面更具可读性,并且有这样的内容:

"stdout_lines": [
            "{", 
            "    \"outcome\" => \"success\",", 
            "    \"result\" => {", 
            "        \"PID\" => \"76462\",", 
            "        \"[Standalone]\" => \"\",", 
            "        \"awt.toolkit\" => \"sun.awt.X11.XToolkit\",", 
            "        \"some.property1\" => \"some.value1\",", 
            "        \"some.property2\" => \"some.value2\",",

等等。但它的列表。

问题: 如何将此列表转换为 json 数据,以便在 Ansible 中我可以从变量“srp_chk.stdout_lines.result.some.property1”中获取“some.value1”?

附:请不要建议总是删除和添加属性,因为在每次部署时我都需要重新加载我的服务器 - 当我们谈论 PROD 时,这是非常糟糕的情况。

【问题讨论】:

  • 您的示例数据甚至无法接近 JSON 语法。您应该尝试找到以 JSON 格式获取数据的方法。谷歌建议thisthis
  • Curl 实际上不是一个选项,从 WildFly 获取数据的唯一允许方法是 CLI,但是是的,我设法将符号 '=>' 更改为 ':' 并获得更像 Json 格式&正在尝试转换它,谢谢提示。

标签: python ansible command-line-interface wildfly


【解决方案1】:

WildFly 的下一个版本(又名 12)将支持输出到 JSON https://issues.jboss.org/browse/WFCORE-3363

【讨论】:

    【解决方案2】:

    我在 shellscript 中编写了一个非常简单粗暴的 Ansible 模块,使用 sed 将 jboss-cli 输出转换为 JSON 并将其作为事实提供。

    您可以使用它来获取已经作为事实的 JBoss 配置数据,从而允许在“何时”条件中使用它们,而不是试图让 Ansible 将输出解析为 JSON(它不是直接输出的)通过 jboss-cli)。或者,您可以检查完成的文本替换以将该输出转换为 JSON(粗略地)并以其他方式使用它。

    如果你觉得它有用,就在这里:

    https://github.com/spuk-/jbossclifacts

    【讨论】:

      猜你喜欢
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多