Ansible: Как написать YAML Playbook в виде массива данных JSON или Python? - PullRequest
0 голосов
/ 31 мая 2019

У меня есть некоторый опыт работы с 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 голосов
/ 31 мая 2019

Как правило, вы не можете представлять YAML как JSON, потому что JSON является подмножеством YAML.Например, теги и привязки YAML не могут быть выражены в JSON, а ограничения на ключи в объекте JSON чрезвычайно строги, тогда как YAML может иметь любой узел в качестве ключа в отображении.

Python может полностью представлять YAML, если неттогда ruamel.yaml не может выполнить обход данных YAML.И поэтому вы можете генерировать все структуры данных YAML с нуля, используя обычные конструкции Python, а затем выводить их в YAML.Для помеченных конструкций это, однако, не совсем тривиально.Вы также должны учитывать, что ни одна библиотека не дает вам полного контроля над синтаксическим представлением, и отступы обычно одинаковы для всех отображений и всех последовательностей (или даже одинаковы для всех коллекций).

Если ваш YAML не 'Если в тегах, как в вашем примере, нет, то YAML может быть загружен как обычные конструкции Python, такие как dicts, списки и примитивы, такие как строки, целые числа, float, datetime.datetime, boolean.Вы можете просто загрузить 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'}}]}]
...