как использовать json-файл, состоящий из информации о хосте, в качестве входных данных для доступного инвентаря

Я пытаюсь использовать следующий файл json в качестве входных данных для инвентаризации доступного хоста, но при запуске плейбука получаю сообщение об ошибке. Файл JSON:

{
   "instances":{
       "host": 10.66.70.33
   }
}

Пособие:

хосты: "{{instance.host}}"
remote_user: root #vars:

Когда я запускаю книгу игр, я получаю следующие ошибки. Я не уверен, что делаю не так. Я новичок в Ansible. Пожалуйста, посоветуйте, я думаю, я делаю какую-то глупую ошибку.

[ПРЕДУПРЕЖДЕНИЕ]: не удалось сопоставить предоставленный шаблон хоста, игнорируется: все [ПРЕДУПРЕЖДЕНИЕ]: при условии, что список хостов пуст, доступен только localhost ОШИБКА! Поле "хосты" имеет недопустимое значение, которое включает неопределенную переменную. Ошибка была: "экземпляры" не определены.

Я использую следующую инструкцию:

ansible-playbook -i <path>/test.json <path>test_playbook.yml

person DSAK    schedule 08.02.2018    source источник


Ответы (3)


yaml фактически анализировать файл JSON, и делал это в течение многих лет.

Это почти не задокументировано, но вы можете увидеть в разделе параметров yaml документации плагина, .json указано как допустимое расширение.

Формат JSON имеет ту же семантику, что и формат YAML. Примечание. не того же формата, что и динамический инвентарь!

Итак, ваш JSON должен выглядеть так:

{
   "instances": {
      "hosts": {
         "10.66.70.33": null
      }
   }
}

Примечание: это «хосты», а не «хост», и каждый адрес является ключом словаря / хэша со значениями, являющимися зависящими от хоста переменными.

Взяв первый пример из Работа с инвентарем документы,

all:
  hosts:
    mail.example.com:
  children:
    webservers:
      hosts:
        foo.example.com:
        bar.example.com:
    dbservers:
      hosts:
        one.example.com:
        two.example.com:
        three.example.com:

будет выглядеть,

{
  "all": {
    "hosts": {
      "mail.example.com": null
    },
    "children": {
      "webservers": {
        "hosts": {
          "foo.example.com": null,
          "bar.example.com": null
        }
      },
      "dbservers": {
        "hosts": {
          "one.example.com": null,
          "two.example.com": null,
          "three.example.com": null
        }
      }
    }
  }
}

Эти null выглядят странно, но в примере YAML вы увидите конечное двоеточие, которое действительно означает, что каждый из этих хостов является фактически словарными / хеш-ключами.

Для любопытных: код загрузки JSON-затем-YAML находится в parsing / utils / yaml.py, а фактический анализ находится в parsing / inventory / yaml.py.

person tantrix    schedule 03.09.2019
comment
Поговорим о неочевидном !! Спасибо за раскрытие / документирование этой функции - person lost; 24.06.2020

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

  • advanced_host_list - анализирует "список хостов" с диапазонами
  • auto - загружает и запускает плагин инвентаризации, указанный в конфигурации YAML.
  • aws_ec2 - источник инвентаря ec2
  • сконструирован - использует Jinja2 для создания варов и групп на основе существующего инвентаря.
  • host_list - анализирует строку «список хостов»
  • ini - использует ANI-файл INI в качестве источника инвентаризации.
  • k8s - источник инвентаря Kubernetes (K8s)
  • openshift - источник инвентаря OpenShift
  • openstack - источник инвентаря OpenStack
  • script - выполняет сценарий инвентаризации, который возвращает JSON.
  • virtualbox - источник инвентаря virtualbox
  • yaml - использует специальный файл YAML в качестве источника инвентаризации.

С другой стороны, вы можете обернуть этот JSON в простой скрипт Python следующим образом:

  1. Убедитесь, что плагин скрипта включен в вашем ansible.cfg файле:

    [inventory]
    enable_plugins = host_list, script, yaml, ini
    
  2. Создайте сценарий оболочки (файл инвентаризации), только читает ваш JSON и печатает его в консоли (я предполагаю, что JSON и сценарий оболочки находятся на одном пути):

    #!/usr/bin/env python
    import os
    
    __location__ = os.path.realpath(
        os.path.join(os.getcwd(), os.path.dirname(__file__)))
    
    with open(os.path.join(__location__, "hosts.json")) as f:
        print f.read()
    
  3. Используйте в своем инвентаре JSON следующее (улучшения производительности):

    {
        "_meta": {
            "hostvars": { }
        },
    
        "instances": {
            "hosts": ["10.66.70.33"]
        }
    }
    
  4. При запуске playbook просто помните, что группа, на которую вы хотите настроить таргетинг, должна быть «экземплярами», например, это моя playbook:

    ---
    - hosts: instances
      tasks:
        - debug:
            msg: Hi there
    

Затем просто запустите playbook, как и вы, указав сценарий оболочки python, в моем случае это было:

ansible-playbook -i inventory/hostswrapper.py test-stkovfl.yml

Надеюсь, это поможет!

person kajahno    schedule 08.02.2018
comment
Как упоминалось ранее, JSON фактически анализирует как YAML, то есть анализатор YAML может читать оба формата. - person Thomas Hirsch; 18.09.2019

поздно, но я надеюсь, что это может вам помочь!

Я взял эту информацию здесь


Инвентарь Json почти такой же, как инвентарь Yaml. Вам следует помнить об этих json-ключах:

  • hosts: массив json для определения вашего хоста s. Обратите внимание на множественное число
  • vars: объект json для определения переменных с их значениями на уровне группы
  • children: позволяет определить внутреннюю группу хостов
  • _meta: для определения метаданных, таких как переменные, специфичные для хоста

Например:

{
  "all": {                                               # group called `all`
    "hosts": ["webmin.mydomain.com"],                    # hosts that compose `all` group
    "vars": {                                            # vars for `all` hosts
      "vendor": "vultr"                                  # var definition called `vendor`
    },
    "children": {                                        # inner group definition 
      "ipc": {                                           # called `ipc` ...
        "hosts": ["ipc-appserver-01", "ipc-db-01"],      # hosts that compose `ipc` group
        "vars": {                                        # vars only for `ipc` hosts
          "os": "centos7.6"                              # var def for `ipc` group called `os`
        }
      }                                                  # you could define more inner host groups
    }
  },
  "_meta": {                                             # metadata
    "hostvars": {                                        
      "ipc-appserver-01": {                              # vars only for `ipc-appserver-01` host
        "role": "php"                                    # var called `role`
      }
    }
  }
}
person Juan-Kabbali    schedule 05.03.2021