【发布时间】: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 时,这是非常糟糕的情况。
【问题讨论】:
-
Curl 实际上不是一个选项,从 WildFly 获取数据的唯一允许方法是 CLI,但是是的,我设法将符号 '=>' 更改为 ':' 并获得更像 Json 格式&正在尝试转换它,谢谢提示。
标签: python ansible command-line-interface wildfly