2015-04-28 15 views
5

Ben şöyle bir oyun kitabı koşucu kullanın: gayetAnsible Python API'sini kullanarak kodumdaki görev düzeyi çıktılarına nasıl erişebilirim?

{"status": 1, "result": {"127.0.0.1": {"unreachable": 0, "skipped": 0, "ok": 3, "changed": 2, "failures": 0}}} 

:

stats = callbacks.AggregateStats()           
playbook_cb = callbacks.PlaybookCallbacks(verbose=1)   
runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=1)         

pb = ansible.playbook.PlayBook(
... # basic info 
)                   
results = pb.run() 

sonuç değişkeni aşağıdaki gibi çıktısını içerir. Ama aynı zamanda dict gibi görev seviyesi çıkışı aşağıda gösterilen gerekir:

changed: [127.0.0.1] => {"changed": true, "name": "apache2", "state": "started"} 

Ben Verbosity'ini değiştirmeyi denedim, ama bu istediği bu değildi.

etrafında kazma sonra ben şöyle bir günlük dosyasına çıktı başardı:

from ansible import constants as C 
C.DEFAULT_LOG_PATH = 'project.log' 
reload(callbacks) 

Ama benim kodunda bu bilgilere erişimi gerekir.

cevap

4

Muhtemelen istediğiniz tam olarak json formatını alamıyorsunuz, ancak geri arama sınıflarını genişleterek ve ilgilendiğiniz etkinliklere kendi işleyicilerinizi yazarak aynı bilgileri edinebilirsiniz. Ayrıca

böyle Playbook örneğine sınıfları vermek emin olun:

pb = ansible.playbook.PlayBook(
    ... # basic info 
    callbacks= playbook_cb, 
    runner_callbacks=runner_cb 
)   

Bağlantılar:

Düzenleme: Bu durumda çözüm, bunun yerine AggregateStat sınıfını genişletmekti. Aşağıda @Tom_Sawyyer

tarafından nihayet
from ansible.callbacks import AggregateStats         

class CustomAggregateStats(AggregateStats):           
"""                    
Holds stats about per-host activity during playbook runs.      
"""                    
def __init__(self):                
    super(CustomAggregateStats, self).__init__()         
    self.results = {}               

def compute(self, runner_results, setup=False, poll=False,      
      ignore_errors=False):            
    """                   
    Walk through all results and increment stats.        
    """                   
    super(CustomAggregateStats, self).compute(runner_results, setup, poll, 
               ignore_errors)      

    for (host, value) in runner_results.get('contacted', {}).iteritems():  
     if 'invocation' in value:            
      if value['invocation']['module_name'] == 'service':    
       self.results['service_name'] = value['name']       

def summarize(self, host):              
    """                   
    Return information about a particular host         
    """                   
    summarized_info = super(CustomAggregateStats, self).summarize(host)   

    # Adding the info I need              
    summarized_info['result'] = self.results          

    return summarized_info 

Ve sağlanan Kod örnek:

my_stats = CustomAggregateStats() 
pb = ansible.playbook.PlayBook(
    ... # basic info 
    stats=my_stats, 
)  

verilmesi çıkışı:

{"127.0.0.1": {"skipped": 0, "ok": 3, "changed": 2, "result": {"service_name": "apache2"}, "failures": 0, "unreachable": 0}} 
İlgili konular