从ansible安装模块收集信息并创建新的库存文件

时间:2016-04-08 14:19:18

标签: json ansible

想象一下,您有一个包含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的任何开关或选项吗?

谢谢你。

1 个答案:

答案 0 :(得分:1)

最简单的方法是写一个dynamic inventory脚本;而不是拥有一个静态的主机ini文件,你的脚本将从其他地方读入主机,然后进行所有处理以创建组和诸如此类的东西,并将所有这些返回给Ansible。

除上述文档外,Ansible contrib目录中还有a bunch of examples。这些示例都是用Python编写的,但只要您可以在stdout上输出JSON结构,就可以使用任何您喜欢的语言。