создать доступный инвентарь YAML на Python

Я хотел бы написать доступный файл инвентаризации YAML из скрипта Python. Кажется, что ожидаемый формат от ansible - только с парами ключей, с двоеточием в конце каждого хоста и нет - впереди, например:

pe:
  hosts:
      host1:
      host2:
      host3:
      host4:

Я создал такую ​​структуру на Python:

inventory_struct = {
    'pe': {
        'hosts': [],
    },
}

и я добавляю хосты в список «хостов». Но когда я пишу файл инвентаризации с помощью:

yaml.dump(inventory_struct, outfile, default_flow_style=False, allow_unicode=True)

Я получаю этот формат, который недоступен:

pe:
   -hosts:
    - host1
    - host2
    - host3

Сообщение об ошибке при запуске playbook в этом инвентаре:

Attempted to read "../inventories/inv-xyz555" as YAML: list indices must be integers, not AnsibleUnicode

Есть ли способ сбросить структуру в ожидаемом формате YAML?

Спасибо,

бандибой


person bundyboy    schedule 11.09.2017    source источник


Ответы (4)


Просто используйте replace, чтобы избавиться от нулевой строки. Например: print (yaml.dump (inventory_struct, default_flow_style = False) .replace ('null', ''))

person Traq    schedule 22.12.2017
comment
Чтобы правильно отформатировать код, вы должны сделать отступ на 4 пробела и оставить пустую строку после сообщения и кода. - person StaceyGirl; 22.12.2017
comment
Этот фрагмент должен помочь всем, кто зайдет позже: gist.github.com/thetuxracer/4a2aea76f19e79ea - person theTuxRacer; 26.12.2018

Вы можете сделать что-то подобное

import yaml

def inventory():

  ip_list = {}
  ip_list['10.25.152.200'] = None
  ip_list['10.25.152.201'] = None

  inventory = dict(all = dict (
    children = dict(
      qa = dict(
        hosts = ip_list,
        vars = dict(
            ansible_ssh_user = 'foo',
            ansible_ssh_pass = 'bar'
          )
        )
      )
    )
  )

  return inventory

def main():
  with open('/tmp/inventory.yml', 'w') as outfile:
    yaml.dump(inventory(), outfile, default_flow_style=False)

if __name__ == "__main__":
    main()
person theTuxRacer    schedule 26.12.2018

Я заменил список хостов на словарь хостов с моими хостами в качестве ключей и None в качестве значения, похоже, помогает. Я получаю файл инвентаризации, который выглядит так:

pe:
  hosts:
    host1: null
    host2: null
    host2: null

Похоже, что Ansible не жалуется на null.

person bundyboy    schedule 11.09.2017

В основном это касается правильного словаря Python, а не YAML. YAML представляет элементы списка как значения с префиксом - и ключи объекта (словаря) как строки с : после них.

Я думаю, что вы ищете что-то вроде этого:

inventory_struct = {
    'pe': {
        'hosts': {
            'host1': '',
            'host2': '',
            'host3': '',
        },
    },
}
person shevron    schedule 11.09.2017
comment
Спасибо, это то, что я действительно сделал с None вместо пустых кавычек. Я был смущен тем, что Ansible нуждался в словаре для каждого хоста без фактического значения. - person bundyboy; 11.09.2017
comment
YAML помещает : перед значением, это называется индикатором значения. Ваш код будет фактически помещать пустую строку после индикатора значения (возможно, с использованием "" или ''), что не то же самое, что наличие пустого значения (что составляет null или ~) - person Anthon; 27.12.2018