Python API 2.0


Python API 2.0は2.0からもっと複雑ですが、より多くの離散的で読み取り可能なクラスが得られます.
#!/usr/bin/env python
import jsonfrom collections import namedtuplefrom ansible.parsing.dataloader import DataLoaderfrom ansible.vars import VariableManagerfrom ansible.inventory import Inventoryfrom ansible.playbook.play import Playfrom ansible.executor.task_queue_manager import TaskQueueManagerfrom ansible.plugins.callback import CallbackBase
class ResultCallback(CallbackBase):"""結果を実行するためのコールバックプラグインの例
                    
      ,    ``json``    
              
"""
def v2_runner_on_ok(self, result, **kwargs):
    """     json  

                           
    """
    host = result._host
    print json.dumps({host.name: result._result}, indent=4)

Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check'])
initialize needed objects
variable_manager = VariableManager()loader = DataLoader()options = Options(connection='local', module_path='/path/to/mymodules', forks=100, become=None, become_method=None, become_user=None, check=False)passwords = dict(vault_pass='secret')
#ResultCallbackをインスタンス化して結果を処理するresults_callback = ResultCallback()
#在庫を作成してvar managerinventory=Inventory(loader=loader,variable_manager=variable_manager,host_list='localhost')variable_manager.set_inventory(inventory)
create play with tasks
play_source = dict(name = "Ansible Play",hosts = 'localhost',gather_facts = 'no',tasks = [dict(action=dict(module='shell', args='ls'), register='shell_out'),dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}')))])play = Play().load(play_source, variable_manager=variable_manager, loader=loader)
actually run it
tqm = Nonetry:tqm = TaskQueueManager(inventory=inventory,variable_manager=variable_manager,loader=loader,options=options,passwords=passwords,stdout_callback=results_callback, # Use our custom callback instead of the default callback plugin)result = tqm.run(play)finally:if tqm is not None:tqm.Cleanup()Python API pre 2.0これは簡単です.
import ansible.runner
runner = ansible.runner.Runner(module_name='ping',module_args='',pattern='web*',forks=10)datastructure = runner.run()実行メソッドは、各ホストの結果を返し、連絡可能かどうかに応じてグループ化します.モジュールに関するドキュメントに示すように、戻りタイプはモジュール固有です.
{"dark":{"web 1.example.com":"failure message"},"contacted":{"web 2.example.com":1}}1つのモジュールは任意のタイプのJSONデータを返すことができるので、Ansibleはフレームワークとして強力なアプリケーションとスクリプトを迅速に構築することができます.
詳細APIの例
次のスクリプトは、すべてのホストの通常の稼働時間情報を印刷します.
#!/usr/bin/python
import ansible.runnerimport sys
construct the ansible runner and execute on all hosts
results = ansible.runner.Runner(pattern='*', forks=10,module_name='command', module_args='/usr/bin/uptime',).run()
if results is None:print "No hosts found"sys.exit(1)
print "UP ***"for (hostname, result) in results['contacted'].items():if not 'failed' in result:print "%s >>> %s"% (hostname, result['stdout'])
print "FAILED ***"for (hostname, result) in results['contacted'].items():if 'failed' in result:print "%s >>> %s"% (hostname, result['msg'])
print "DOWN *****"for (hostname, result) in results['dark'].items():print"%s>>>%s"%(hostname,result)上級プログラマーは、実行可能なコマンドラインツール(lib/ansible/cli/)を実装するためにAPI(すべての使用可能なオプション)を使用するため、ansible自体にソースを読み込むこともできます.
http://docs.ansible.com/ansible/latest/dev_guide/developing_api.html