想象一下,您有一个包含1个组和100多个主机的简单库存文件。
[All]
server1
server2
.
.
.
server100
现在我想通过操作系统,主要操作系统版本或...创建更多组来使用服务器 如果我们跑:
# ansible server1 -m setup
.
.
.
"ansible_distribution": "CentOS",
"ansible_distribution_major_version": "6",
"ansible_distribution_release": "Final",
"ansible_distribution_version": "6.5",
.
.
.
.
所以我使用此命令创建一个新文件以获取所有服务器信息
# ansible All -m setup > all.out
输出非常像json所以我们假设这是一个json文件,但无效:
# jsonlint all.out
[Error: Parse error on line 1:
server1 | SUCCESS =>
^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined']
首先使用json解析我使用此命令:
grep -Po '(?<="ansible_hostname": ")[^"]*' all.out
首先它工作正常,但是我有一个问题,我创建这个简单的shellscript文件:
#!/bin/bash
while read line
do
echo $(grep -Po '(?<="ansible_hostname": ")[^"]*')
echo $(grep -Po '(?<="ansible_distribution": ")[^"]*')
echo $(grep -Po '(?<="ansible_distribution_major_version": ")[^"]*')
echo $(grep -Po '(?<="ansible_distribution_release": ")[^"]*')
echo $(grep -Po '(?<="ansible_distribution_version": ")[^"]*')
done < all.out
但它唯一显示的主机名和其他参数为null 我试着使用python,但因为它不是一个有效的json文件,它也会给出错误。
现在的问题是,您是否知道从设置模块获取所需信息的更好方法,并使用该输出创建包含较小组的新库存文件? 你知道我们可以传递给ansible并给出一个有效的json的任何开关或选项吗?
谢谢你。答案 0 :(得分:1)
最简单的方法是写一个dynamic inventory脚本;而不是拥有一个静态的主机ini文件,你的脚本将从其他地方读入主机,然后进行所有处理以创建组和诸如此类的东西,并将所有这些返回给Ansible。
除上述文档外,Ansible contrib
目录中还有a bunch of examples。这些示例都是用Python编写的,但只要您可以在stdout上输出JSON结构,就可以使用任何您喜欢的语言。