在特定情况下将命令输出转换为字典

时间:2019-01-22 19:20:18

标签: ansible

我扮演以下角色:

- name: get answer from server
  command: "curl http://my_server:8888" 
  register: response

现在,response.stdout看起来像:

Server: 10.8.7.1
Domain: com
State: Health
Type: B

Server: 10.8.7.2
Domain: eu
State: Health
Type: A

Server: 10.8.7.3
Domain: com
State: Health
Type: C

Server: 10.8.7.4
Domain: com
State: Bad
Type: C

如何将其转换为字典列表(如{"Server": "10.8.7.1", "Domain": "com","State": "Health","Type": "B"})?

我考虑编写自己的python模块,但是我相信您可以知道一些更优雅的方法。

1 个答案:

答案 0 :(得分:0)

不了解优雅,但是如果curl的输出稳定且可预测,则可以执行以下操作:

- name: get answer from server
  shell: curl http://my_server:8888 | sed -e 's/^/  /' -e 's/  Server/- Server/'
  register: response
- debug:
    var: response.stdout | from_yaml
  • 请注意,因为要引入管道,所以需要从shell切换到comannd
  • 我们正在使用sed命令将输出格式化为类似于YAML的内容
  • 因此,我们可以将response.stdout传递到from_yaml过滤器中,该过滤器会将字符串解码为字典列表

再次,不确定优雅。对我来说有点脏,但是,嘿,把工作做好了:)

关于干净的实现方式-如果可能,请以某种结构化格式(最好是JSON)在远程服务器上获取文件,然后可以使用Ansible uri模块读取该文件。