2016-09-22 3 views
1

Я знаю, что могу напечатать зЬй с использованием debug модуля анзибль, как показано ниже:Как получить удаленный стандартный вывод из анзибль питон PlayBook апи

--- 
- 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?, я могу запустить анзибль пьес с код python.

Итак, вопрос в том, как я могу получить содержимое переменной out в этой пьесе, используя Ansible python api?

+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") 
Смежные вопросы