如何使用由主机信息组成的json文件作为ansible库存的输入

时间:2018-02-08 08:02:35

标签: ansible-inventory

我正在尝试使用以下json文件作为ansible主机库存的输入,但是当我运行playbook时出现错误。 JSON文件:

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

剧本:

  

主持人:“{{instances.host}}”
  remote_user:root #vars:

当我运行剧本时,我收到以下错误。我不确定我做错了什么。我是Ansible的新手。请建议我猜我正在做一些愚蠢的错误。

  

[警告]:无法匹配提供的主机模式,忽略:全部   [警告]:提供的主机列表为空,只有localhost可用   错误!字段'hosts'具有无效值,其中包括   未定义的变量。错误是:'实例'未定义

我按照以下方式运行剧本:

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

3 个答案:

答案 0 :(得分:3)

它似乎是纯粹的JSON,它不作为库存文件支持。在inventory plugin list我没有看到JSON:

  
      
  • advanced_host_list - 解析范围
  • 的“主机列表”   
  • auto - 加载并执行YAML配置中指定的库存插件
  •   
  • aws_ec2 - ec2 inventory source
  •   
  • 构造 - 使用Jinja2构造变量和   基于现有库存的组。
  •   
  • host_list - 解析'主机列表'   字符串
  •   
  • ini - 使用Ansible INI文件作为库存来源。
  •   
  • k8s - Kubernetes(K8s)库存来源
  •   
  • openshift - OpenShift库存   来源
  •   
  • openstack - OpenStack库存来源
  •   
  • script - 执行一个   返回JSON的库存脚本
  •   
  • virtualbox - virtualbox inventory   来源
  •   
  • 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广告资源(performance improvements)中使用以下内容:

    {
        "_meta": {
            "hostvars": { }
        },
    
        "instances": {
            "hosts": ["10.66.70.33"]
        }
    }
    
  4. 在运行游戏手册时,请注意您要定位的群组应为&#34;实例&#34;,例如这是我的剧本:

    ---
    - hosts: instances
      tasks:
        - debug:
            msg: Hi there
    
  5. 然后就像你一样运行playbook,指定python包装器脚本,在我的例子中这是:

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

    希望它有所帮助!

答案 1 :(得分:1)

Ansible的yaml plugin 实际解析JSON文件,并且已经解析了多年。

几乎没有记录,但是您可以在parameters section of the yaml plugin docs中看到,.json被列为有效的扩展名。

JSON格式与YAML格式具有相同的语义。注意:不是dynamic inventory的格式相同!

所以您的JSON应该看起来像

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

注意:它是“主机”而不是“主机”,并且每个地址都是字典/哈希键,其值是特定于主机的变量。

Working with Inventory docs中的第一个示例为例,

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-then-YAML加载代码位于parsing/utils/yaml.py中,而实际解析位于parsing/inventory/yaml.py中。

答案 2 :(得分:0)

迟到了,但我希望这可以帮助你!

我从 here

获取了这些信息

Json 清单几乎与 Yaml 清单一模一样。您应该记住这些 json 键:

  • hosts: json array 来定义你的主机s注意复数
  • vars:json 对象,用于在 组级别
  • 定义变量及其值
  • children:允许您定义内部主机组
  • _meta:定义元数据,如主机特定变量

例如:

freq<-table(chain)

freq[2]
freqc<-freq[2]
freqc