python - Get value of a fact set with 'set_fact' inside a callback plugin -


ansible 2.3

i have callback plugin notifies external service when playbook finished. during play, callback plugin collects different information play variables , error messages, sent http request. example:

{     "status": 1,      "activity": 270,     "error": "task xyz failed message: failure message",     "files": [ "a.txt", "b.cfg" ] } 

some of information comes variables set during play itself, relevant play: path file, list of changed resources, etc.

right i'm doing particularly ugly collect need based on task names:

def v2_runner_on_ok(self, result):      if result._task.action == 'archive':         if result._task.name == 'create archive foo':             self.body['path'] = result._result['path']      if result._task.action == 'ec2':         if result._task.name == 'start instance bar':             self.body['ec2_id'] = result._result['id']     # every task generates "interesting" info 

obviously doesn't scale , breaks if task name changes.

to keep generic i've been thinking agreeing on fact name, add_to_body, added body dictionary whenever exists. approach because it's particularly easy register couple of variables during play , use them assemble fact @ end of play. example:

---  - name: demo play   hosts: localhost   gather_facts: false    tasks:      - name: create temporary file 1       tempfile:         path: '/tmp'       register: reg_tmp_1      - name: create temporary file 2       tempfile:         path: '/tmp'       register: reg_tmp_2      - name: set add_to_body fact       set_fact:         add_to_body: "{{ { 'reg_tmp_1': reg_tmp_1.path,                            'reg_tmp_2': reg_tmp_2.path } }}"      - debug: var=add_to_body 

however can't find way access value of fact after set_fact action, neither looking @ result object nor trying access hostvars current host (which apparently not possible inside callback plugin).

what suggest work around limitation?

hmm, mix things in here.
if want call api in v2_runner_on_ok after each task, should handle add_to_body in task context.
in example set add_to_body after several tasks – way you'd better write action plugin (e.g. send_to_my_service) , call instead of set_fact required parameters.

here's example how can use add_to_body in task context:

--- - hosts: localhost   gather_facts: no    tasks:     - command: echo hello world       vars:         add_to_body:           - path     - file:         dest: /tmp/zzz         state: touch       vars:         add_to_body:           - dest 

callback:

def v2_runner_on_ok(self, result):     if 'add_to_body' in result._task.vars:         res = dict()         in result._task.vars['add_to_body']:             if in result._result:                 res[i] = result._result[i]             else:                 display.warning('add_to_body: asked add "{}", property not found'.format(i))         display.v(res) 

Comments

Popular posts from this blog

php - Permission denied. Laravel linux server -

google bigquery - Delta between query execution time and Java query call to finish -

python - Pandas two dataframes multiplication? -