2016-01-26 36 views
1

如何通過API調用ansible時指定回調函數?如何將回調插件添加到Ansible 2中的PlaybookExecutor中

我有ansible 2.0.0.2,它記錄到數據庫中的回調插件database_write.py時,這是運行:

ansible-playbook -i inventory.txt playbook.yml # callback is fired ok 

該工程確定,因爲我的$ PWD我有ansible.cfg這一行:

callback_plugins = ./src/callback 

現在我試圖使用python API來執行我的playbook和我的回調函數。我基本上是複製什麼ansible-劇本CLI工具確實

# based on https://github.com/ansible/ansible/blob/v2.0.0.2-1/lib/ansible/cli/playbook.py 
pbex = PlaybookExecutor(playbooks=['../playbook.yml'], 
         inventory=inventory, 
         variable_manager=variable_manager, 
         loader=loader, 
         options=options, 
         passwords=passwords) 

results = pbex.run() 

該執行的劇本很好,但回調不會被觸發。

我猜在使用python API時,我的ansible.cfg文件沒有被考慮到?

如何指定我的回調插件到PlaybookExecutor?

(大多數文檔我發現作品ansible版本< 2.0)

預先感謝您!

回答

-1

與我的設置似乎我需要有它在/etc/ansible/ansible.cfg 設置正是如此做:

callback_plugins = <somepath> bin_ansible_callbacks =真 callback_whitelist = profile_tasks

3

2.0 API是非常原始,通常不適合最終用戶。未來也有可能改變。請參閱郵件列表上的this discussion,我發佈了類似的問題,並提出了自己的答案,顯然是正確的:您可以將回調分配給執行程序的TaskQueueManager實例(PlaybookExecutor._tqm._stdout_callback)。

pbex = PlaybookExecutor(playbooks=playbooks, inventory=inventory, 
         variable_manager=variable_manager, 
         loader=loader, options=options, 
         passwords=passwords) 
cb = ResultAccumulator() 
pbex._tqm._stdout_callback = cb 
results = pbex.run() 

(ResultAccumulator是回調插件類從here,應該從ansible.plugins.callback.CallbackBase。

1

Ansible API文檔是稀缺的。PlaybookExecutor不接受任何回調參數。 但是得到,你可以從CallbackBase創建自定義的回調 這裏是返回所有TaskResults列表的例子:

class SampleCallback(CallbackBase): 
    """Sample callback""" 

    def __init__(self): 
     super(SampleCallback, self).__init__() 
     # store all results 
     self.results = [] 

    def v2_runner_on_ok(self, result, **kwargs): 
     """Save result instead of printing it""" 
     self.results.append(result) 

pbe = PlaybookExecutor(
      playbooks=playbooks, 
      inventory=inventory, 
      variable_manager=variable_manager, 
      loader=loader, 
      options=options, 
      passwords=passwords 
     ) 
callback = SampleCallback() 
pbe._tqm._stdout_callback = callback 
return_code = pbe.run() 
results = callback.results 
相關問題