2016-05-06 2 views
1

Я хотел бы запускать загружаемую игрушку таким образом, чтобы она выводилась в формате, удобном для машин, это означает, что я могу как-то разобрать.Машинный доступный выходной сигнал

По умолчанию анзибль PlayBook обеспечивает вывод так:

ansible-playbook playbooks/test.yml 

PLAY [all] ********************************************************************* 

TASK [setup] ******************************************************************* 
ok: [server] 
ok: [foo] 

И это даже не гарантировано сохранить этот стиль для вывода навсегда. Мне нужно иметь возможность анализировать выходные данные, есть ли способ получить выход из playbook в JSON или XML?

ответ

3

Вы можете использовать python Ansible Callbacks. Вам просто нужно определить, где находятся ваши обратные вызовы, и вы можете делать всевозможные вещи со структурированными данными.

Пример ansible.cfg:

[defaults] 
callback_plugins = ~/your/path/to/callbacks 

И написать очень простую функцию обратного вызова (log.py):

class CallbackModule(object): 
    CALLBACK_VERSION = 2.0 
    CALLBACK_TYPE = 'notification' 
    CALLBACK_NAME = 'logs' 
    CALLBACK_NEEDS_WHITELIST = True 

    def __getattr__(self, item): 
     if item.startswith('runner_on_'): 
      def fn(*args, **kwargs): 
       self.on_runner(item[len('runner_on_'):], *args, **kwargs) 

      return fn 

     if item.startswith('v2_') and self.hasattr(item[len('v2_'):]): 
      # Making it compatible with Ansible 1.9 and 2.0 as well 
      return self.__getattr__(item[len('v2_'):]) 

    def on_runner(self, status, host, payload=None, *args, **kwargs): 
     # Do something with the parameters here 
     # status is for example on of ['ok', 'changed', 'failed', 'skipped'] 
     # host is the target where it runs 
     # payload is a dict with various parameters depending on the Ansibel module being played 

     print self.task.name, status, host, payload 

Есть много крючков в этом модуле обратного вызова, так что вы имеете много вариант, как и когда собирать, обрабатывать, регистрировать.

2

Внедрение опции, которую вы можете просто изменить. Но вы можете реализовать его сами. Начиная с Ansible 2.0, выходной сигнал Ansible по умолчанию реализуется как плагин обратного вызова, который может быть переопределен в Ansible config.

В вашей точке конфигурации Ansible stdout_callback пользовательскому письменному плагину. Плагин обратного вызова по умолчанию, который отвечает за выведенный результат, можно найти here.

В качестве альтернативы вы также можете сохранить вывод по умолчанию и просто создать дополнительный плагин, который будет непосредственно записывать в пользовательский файл журнала, который позже вы сможете проанализировать.

Если вы все еще используете Ansible 1.x, вы можете использовать this plugin. В Ansible 2 он, вероятно, не работает, поскольку API плагина изменился.

Смежные вопросы