我正在尝试使用以下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
答案 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脚本中,如下所示:
确保在ansible.cfg
文件中启用了脚本插件:
[inventory]
enable_plugins = host_list, script, yaml, ini
创建包装器脚本(库存文件),只读取您的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()
在您的JSON广告资源(performance improvements)中使用以下内容:
{
"_meta": {
"hostvars": { }
},
"instances": {
"hosts": ["10.66.70.33"]
}
}
在运行游戏手册时,请注意您要定位的群组应为&#34;实例&#34;,例如这是我的剧本:
---
- hosts: instances
tasks:
- debug:
msg: Hi there
然后就像你一样运行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 键:
例如:
freq<-table(chain)
freq[2]
freqc<-freq[2]
freqc