Callback plugin with Ansible 2.0

I inherited a callback plugin that was woirking with Ansible 1.9. We upgraded to 2.1 and it no longer works.

Looks like it’s trying to access the playbook object but it’s not getting passed into “v2_playbook_on_stats.” My Python is rusty so I’m not sure how I can go about accessing that data. I’m tryijng to access the “extra-vars” variable but it’s giving me the following error:

[WARNING]: Failure using method (v2_playbook_on_stats) in callback plugin
(</home/deployment/scripts/playbooks-2.0/callback/log_to_mongo.CallbackModule object at 0x2b8cf90>): ‘NoneType’ object has no
attribute ‘extra_vars’

class CallbackModule(object):
“”"
An ansible callback module for saving Ansible output to a database log
“”"
def init(self):
self.playbook = None
self.playbook_name = None
self.play = None
self.task = None

CALLBACK_VERSION = 2.0
CALLBACK_TYPE = ‘notification’
CALLBACK_NAME = ‘log_to_mongo’
CALLBACK_NEEDS_WHITELIST = False

def v2_playbook_on_stats(self, stats):
global jira_ticket
global deployed_modules
global ocd_job_id
global environment_id

deployed_modules =
jira_ticket = self.playbook.extra_vars[‘jira_ticket’]
ocd_job_id = self.playbook.extra_vars[‘ocd_job_id’]
environment_id = self.playbook.extra_vars[‘environment_id’]

I think the mechanism changed in Ansible 2. You might have to get your play object in v2_playbook_on_play_start and then use that variable in on_stats . Something like

class CallbackModule(object):
def init(self):
super(CallbackModule,self).init()
self.play = None

def v2_playbook_on_play_start(self, play):
self.play = play

def v2_playbook_on_stats(self, stats):
extra_vars = self.play._variable_manager.extra_vars
jira_ticket = extra_vars[‘jira_ticket’]

THANK YOU!!!

Now how the heck do I track down all these changes? I like v2 but it broke a lot of things.

Sam,

Does this page help: https://docs.ansible.com/ansible/porting_guide_2.0.html#callback-plugins?

Not really. This is highly frustrated, but I’m speaking for myself.

So for example, I can’t figure out where certain methods are. Other folks are also expressing the same feelings.

Case in point:

To get extra vars I can use the following line in v2.

extra_vars = self.play._variable_manager.extra_vars

jira_ticket = extra_vars[‘jira_ticket’]

Old method:

jira_ticket = self.playbook.extra_vars[‘jira_ticket’]

Now I’m trying to chase down where the var cache are located.