2016-04-08 2 views
0

1つのグループと100を超えるホストを持つ単純なインベントリファイルがあるとします。設定可能なモジュールから情報を収集し、新しいインベントリファイルを作成する

[All] 
server1 
server2 
. 
. 
. 
server100 

今私たちが実行した場合、OS、主要な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ファイルであると仮定ではなく、次のとおりです。

最初の解析JSONのため
# jsonlint all.out 
[Error: Parse error on line 1: 
server1 | SUCCESS => 
^ 
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined'] 

私は、このコマンドを使用します。

grep -Po '(?<="ansible_hostname": ")[^"]*' all.out 

は最初それが良い動作しますが、それは私はこの単純なシェルスクリプトファイルの作成に問題があります。

#!/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ファイルではないのでエラーも出ます。

ここで、セットアップモジュールから必要な情報を取得し、その出力を使用してより小さいグループの新しいインベントリファイルを作成するより良い方法を知っていますか? 私たちが有能な人に渡して有効なjsonを渡すことができるスイッチやオプションを知っていますか?

ありがとうございました。

+0

"出力は非常にjsonに似ています":申し訳ありませんが、私はここであなたを失いました。 AnipalはPythonをベースにしているので、私の推測はPython Dictです。 – Wtower

+0

あなたは非常にjsonのように言ってくれてありがとう –

答えて

1

これを行う最も簡単な方法は、dynamic inventoryスクリプトを記述することが考えられます。のではなく、ホストの静的なiniファイルを持って、あなたのスクリプトは、グループやその他もろもろを作成するために、すべての処理を行い、その後、どこか別の場所からホストに読み、Ansibleにそのすべてを返します。上記のドキュメントに加えて

a bunch of examplesはAnsible contribディレクトリにあります。例はすべてPythonで書かれていますが、限り、あなたは標準出力に出力JSON構造をできる限りたい任意の言語を使用することができます。

関連する問題