2016-04-08 28 views
0

想象一下,您有一個包含1個組和100多個主機的簡單庫存文件。從安裝模塊收集信息並創建新的庫存文件

[All] 
server1 
server2 
. 
. 
. 
server100 

現在我要創造更多的人羣使用的操作系統,主要的OS版本或服務器... 如果我們運行:

# 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 

第一它的作品不錯,但有一個問題,我創建這個簡單的shell腳本文件:

#!/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 

但其只顯示主機名和其他參數爲空 我試着使用python,但因爲它不是一個有效的json文件,它也給錯誤。

現在問題是否您知道更好的方式從設置模塊獲取所需信息並使用該輸出創建具有較小組的新庫存文件? 你知道我們可以傳遞給ansible並給出有效的json的任何開關或選項嗎?

謝謝。

+0

「輸出非常像json」:對不起,我把你弄丟了。 Ansible是基於python的,所以我的猜測是這是一個python字典。 – Wtower

+0

謝謝你,你說它非常喜歡json –

回答

1

最簡單的方法是編寫一個dynamic inventory腳本;而不是有一個靜態的主機ini文件,你的腳本會從其他地方的主機中讀取,然後做所有的處理來創建組和其他東西,並將所有這些返回給Ansible。

除上述文檔外,Ansible contrib目錄中還有a bunch of examples。這些例子都是用Python編寫的,但只要你可以在標準輸出上輸出JSON結構,你就可以使用任何你想要的語言。