2016-09-22 75 views
1

我知道我可以打印STD出使用debug模塊Ansible的象下面這樣:如何獲得遠離Ansible巨蟒劇本API標準輸出

--- 
- hosts: all 
    tasks: 
    - name: list files under /root folder 
    command: ls /root 
    register: out 

    - name: stdout 
    debug: var=out.stdout_lines 

而且從How to use Ansible 2.0 Python API to run a Playbook?答案,我可以運行Ansible劇本python代碼。

所以問題是如何使用Ansible python api獲得變量out在這個劇本中的內容?

+0

您已檢查從你所提到的答案'results'價值? –

+0

@KonstantinSuvorov我檢查過它。 「結果」只是一個數字,也許意味着任務的狀態。 – curiousY

+0

你想要stdout_lines或stdout嗎? – smiller171

回答

3

這裏是我的答案,你應該做一個callback

# -*- coding: utf-8 -*- 
import json 
from ansible.parsing.dataloader import DataLoader 
from ansible.vars import VariableManager 
from ansible.inventory import Inventory 
from ansible.playbook.play import Play 
from ansible.executor.task_queue_manager import TaskQueueManager 
from ansible.executor.playbook_executor import PlaybookExecutor 

from ansible.plugins import callback_loader 
from ansible.plugins.callback import CallbackBase 

import os 
import logging 


loader = DataLoader() 
variable_manager = VariableManager() 
inventory = Inventory(loader=loader, variable_manager=variable_manager) 
variable_manager.set_inventory(inventory) 

#get result output 
class ResultsCollector(CallbackBase): 
    def __init__(self, *args, **kwargs): 
     super(ResultsCollector, self).__init__(*args, **kwargs) 
     self.host_ok = [] 
     self.host_unreachable = [] 
     self.host_failed = [] 

    def v2_runner_on_unreachable(self, result, ignore_errors=False): 
     name = result._host.get_name() 
     task = result._task.get_name() 
     ansible_log(result) 
     #self.host_unreachable[result._host.get_name()] = result 
     self.host_unreachable.append(dict(ip=name, task=task, result=result)) 

    def v2_runner_on_ok(self, result, *args, **kwargs): 
     name = result._host.get_name() 
     task = result._task.get_name() 
     if task == "setup": 
      pass 
     elif "Info" in task: 
      self.host_ok.append(dict(ip=name, task=task, result=result)) 
     else: 
      ansible_log(result) 
      self.host_ok.append(dict(ip=name, task=task, result=result)) 

    def v2_runner_on_failed(self, result, *args, **kwargs): 
     name = result._host.get_name() 
     task = result._task.get_name() 
     ansible_log(result) 
     self.host_failed.append(dict(ip=name, task=task, result=result)) 

class Options(object): 
    def __init__(self): 
     self.connection = "smart" 
     self.forks = 10 
     self.check = False 
     self.become = None 
     self.become_method = None 
     self.become_user=None 
    def __getattr__(self, name): 
     return None 

options = Options() 


def run_adhoc(ip,order): 
    variable_manager.extra_vars={"ansible_ssh_user":"root" , "ansible_ssh_pass":"passwd"} 
    play_source = {"name":"Ansible Ad-Hoc","hosts":"%s"%ip,"gather_facts":"no","tasks":[{"action":{"module":"command","args":"%s"%order}}]} 
# play_source = {"name":"Ansible Ad-Hoc","hosts":"192.168.2.160","gather_facts":"no","tasks":[{"action":{"module":"command","args":"python ~/store.py del"}}]} 
    play = Play().load(play_source, variable_manager=variable_manager, loader=loader) 
    tqm = None 
    callback = ResultsCollector() 

    try: 
     tqm = TaskQueueManager(
      inventory=inventory, 
      variable_manager=variable_manager, 
      loader=loader, 
      options=options, 
      passwords=None, 
      run_tree=False, 
     ) 
     tqm._stdout_callback = callback 
     result = tqm.run(play) 
     return callback 

    finally: 
     if tqm is not None: 
      tqm.cleanup() 

def run_playbook(books): 
    results_callback = callback_loader.get('json') 
    playbooks = [books] 

    variable_manager.extra_vars={"ansible_ssh_user":"root" , "ansible_ssh_pass":"passwd"} 
    callback = ResultsCollector() 

    pd = PlaybookExecutor(
     playbooks=playbooks, 
     inventory=inventory, 
     variable_manager=variable_manager, 
     loader=loader, 
     options=options, 
     passwords=None, 

     ) 
    pd._tqm._stdout_callback = callback 

    try: 
     result = pd.run() 
     return callback 

    except Exception as e: 
     print e 

if __name__ == '__main__': 
    #run_playbook("yml/info/process.yml") 

    #run_adhoc("192.168.2.149", "ifconfig")