Ansible:如何将YAML Playbook编写为JSON或Python数据数组?

时间:2019-05-31 19:57:36

标签: ansible yaml

我对JSON和Python有一定的经验,因此我想将Ansible YAML剧本可视化为常规的Python或JSON内联数据结构。是否可以将YAML文件的全部内容编写为由列表和字典组成的内联数据结构?如果是这样,我还可以使用空格使其更易于阅读吗?

示例:

---
- hosts: webservers
  remote_user: root
  gather_facts: true

  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf

哪个会成为:

---
[{hosts: webservers, remote_user: root, gather_facts: true, tasks: [{name: ensure apache is at the latest version, yum: {name: httpd, state: latest}}], [name: write the apache config file, template: {src: /srv/httpd.j2, dest: /etc/httpd.conf}]}]

1 个答案:

答案 0 :(得分:0)

通常,您不能将YAML表示为JSON,因为JSON是子集 YAML。例如。 YAML标签和锚点不能用JSON表示,并且 JSON对象中的键限制非常严格,而 YAML本质上可以将任何节点作为映射中的键。

Python可以完全代表YAML,否则ruamel.yaml可以 不是双向YAML文件。这样您就可以生成所有YAML数据 使用常规Python构造从头开始构建结构,然后转储 他们到YAML。对于标记的结构,但这还不完全 不重要的。您还必须考虑到没有图书馆能为您提供完整的信息 控制句法表示,通常缩进 所有映射和所有序列都相同(甚至对所有都相同) 集合。)

如果您的YAML不包含代码(例如您的示例),则可以将YAML作为 常规的Python结构,例如字典,列表和基元,例如 字符串,整数,浮点数,datetime.datetime,布尔值。你可以 加载YAML并打印数据结构:

import sys
import ruamel.yaml

yaml_str = """---
- hosts: webservers
  remote_user: root
  gather_facts: true

  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf
"""

yaml = ruamel.yaml.YAML(typ='safe')
data = yaml.load(yaml_str)
print(data)

给出:

[{'hosts': 'webservers', 'remote_user': 'root', 'gather_facts': True, 'tasks': [{'name': 'ensure apache is at the latest version', 'yum': {'name': 'httpd', 'state': 'latest'}}, {'name': 'write the apache config file', 'template': {'src': '/srv/httpd.j2', 'dest': '/etc/httpd.conf'}}]}]