将ansible任务的输出以正确的JSON格式写入文件

时间:2019-06-07 08:46:43

标签: json regex ansible ansible-2.x

我正在尝试将shell任务输出写入json,但存在将其解析为有效的一个json文件的问题。

这是shell任务输出的示例: {"firstname": "John", "lastname": "Smith", "user": "john"}

- name: 'Execute script'
  shell: /tmp/script.sh
  register: script_output

- name: 'Output to json'
  local_action:
    module: lineinfile
    dest: output.json
    line: '{{ script_output.stdout }}'
    create: yes

在执行剧本之后,json文件具有以下内容:

{"firstname": "John", "lastname": "Smith", "user": "john"}
{"firstname": "John", "lastname": "Smith", "user": "john"}
{"firstname": "John", "lastname": "Smith", "user": "john"}

如何以附件中的json有效格式格式化输出?

[
    {"firstname": "John", "lastname": "Smith", "user": "john"},
    {"firstname": "John", "lastname": "Smith", "user": "john"},
    {"firstname": "John", "lastname": "Smith", "user": "john"}
]

2 个答案:

答案 0 :(得分:0)

没有可解决的json module。但是您可以为此使用第三方模块,例如ansible-jsonpatch

答案 1 :(得分:0)

这是一个简单的情况,您可以使用@JGK答复的内容,也可以只定义一个列表并将这些json元素添加到其中。没有任何模块!

即:

  - vars:
      elem:
      - {"firstname": "John", "lastname": "Smith", "user": "john"}
      - {"firstname": "John", "lastname": "Smith", "user": "john"}
      - {"firstname": "John", "lastname": "Smith", "user": "john"}

  - set_fact:
      my_list: []

  - name: add to list
    set_fact:
      my_list: "{{ my_list + [item] }}"
    loop: "{{ elem }}"

  - debug:
      msg: "{{ my_list }}"

  - copy:
      content: "{{ my_list }}"
      dest: ./x.json
    delegate_to: localhost

这是使用json python模块或jq验证的结果:

$ jq . x.json
[
  {
    "lastname": "Smith",
    "user": "john",
    "firstname": "John"
  },
  {
    "lastname": "Smith",
    "user": "john",
    "firstname": "John"
  },
  {
    "lastname": "Smith",
    "user": "john",
    "firstname": "John"
  }
]

Python:

$ python -m json.tool x.json 
[
    {
        "firstname": "John",
        "lastname": "Smith",
        "user": "john"
    },
    {
        "firstname": "John",
        "lastname": "Smith",
        "user": "john"
    },
    {
        "firstname": "John",
        "lastname": "Smith",
        "user": "john"
    }
]