5

Ansible が提供する事実を使用する Python プログラムを書きたいと思いますansible HOST -m setup

これを呼び出すと、ほぼ純粋な JSON のみになる応答が返されます。

$ ansible localhost -m setup
localhost | success >> {
    // actual data
}

シェル出力を解析せずにこの JSON 応答を直接取得する方法はありますか (これはあまり安定していない可能性があります)。Ansible を Python 3 プログラムで直接使用することはできますか?

4

2 に答える 2

3

バージョンstable-2.2stable-2.3、および 2.4+

2.2、2.3、および 2.4 の最新の ansible リリースはすべてANSIBLE_STDOUT_CALLBACK変数をサポートしています。ansible.cfgこれを使用するには、次のようなファイルを追加する必要があります。

[defaults]
bin_ansible_callbacks = True
callback_plugins = ~/.ansible/callback_plugins

ansible を使用している場所ならどこにでも配置できます。次に、callback_pluginsディレクトリをまだ作成していない場合は作成する必要があります。最後に、カスタム json パーサーをディレクトリに追加する必要があります。ansibleにバンドルされているjsonパーサーをcallback_pluginsディレクトリにコピーし、その中の1行を編集して機能させました。

json.py最初に実行してファイルを見つけましたansible --version

$ ansible --version
ansible 2.4.0.0
    config file = /Users/artburkart/Code/ansible.cfg
    configured module search path = [u'/Users/artburkart/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
    ansible python module location = /usr/local/lib/python2.7/site-packages/ansible
    executable location = /usr/local/bin/ansible
    python version = 2.7.13 (default, Jul 18 2017, 09:17:00) [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)]

次に、「ansible python モジュールの場所」を使用してjson.py.

cp /usr/local/lib/python2.7/site-packages/ansible/plugins/callback/json.py ~/.ansible/callback_plugins/

最後に、ファイルv2_runner_on_ok内の関数を次のように編集しました ( GitHub の armab の厚意による)。json.py

def v2_runner_on_ok(self, result, **kwargs):
    host = result._host
    self.results[-1]['tasks'][-1]['hosts'][host.name] = result._result
    print(json.dumps({host.name: result._result}, indent=4))

すべての設定が完了したら、コマンドは非常に単純です。

ANSIBLE_STDOUT_CALLBACK=json ansible all -i localhost, -c local -m setup | jq

常に JSON 出力を解析したい場合は、ansible.cfg上記のファイルの末尾に次の行を追加できます。

stdout_callback = json

そうすれば、環境変数を含める必要がなくなります。

バージョン <= 最新の 2.2 安定版

インスタンスに対してクエリを実行するときは、次のコマンドを使用します。

ansible all --inventory 127.0.0.1, --connection local --module-name setup | sed '1 s/^.*|.*=>.*$/{/g'

leucosjqが提案したように、出力を にパイプすると、半有効な JSON が喜んで解析されます。例えば:

ansible all -i hosts -m setup | sed '1 s/^.*|.*=>.*$/{/g' | jq -r '.ansible_facts.ansible_distribution'
CentOS
Ubuntu
于 2016-09-09T19:32:57.090 に答える
1

Python2 で問題ない場合は、Ansible API を直接使用できます。詳細な手順については、 http ://docs.ansible.com/developing_api.html を参照してください 。とても簡単です。

また、代替のシェル中心の方法は、jq を使用することです。ここに簡単な紹介があります: http://xmodulo.com/how-to-parse-json-string-via-command-line-on-linux.html

于 2014-09-30T19:22:40.603 に答える