I started using the ansible_runner python library and i really like it.

The only thing is that I need to retrieve a registered variable. And I just can't find how.

import ansible_runner


class Infra:

    def __init__(self, extravars, envvars, private_data_dir):
        self.extravars = extravars
        self.envvars = envvars
        self.private_data_dir = private_data_dir
        self.runner = None

    def create(self):
        self.run("create.yml")

    def destroy(self):
       self.run("destroy.yml")

    def run(self, playbook):
        self.runner = ansible_runner.run(
        private_data_dir=self.private_data_dir,
        playbook=playbook,
        verbosity=5,
        extravars=self.extravars,
        envvars=self.envvars
    )

if __name__ == "__main__":
    extravars = {} 
    envvars = {}
    private_data_dir = ""
    i = infra(extravars, envvars, private_data_dir)

   i.create()

Now after I created the infra, I want to retrieve the IP which is registered in my create.yml

- name: "Get terraform output"
  shell: >
    cd {{ TERRAFORM_CONTEXT_PATH }} && \
    export TF_VAR_provisionning_ssh_private_key_path={{ SSH_PRIVATE_KEY }} && \
    terraform output -json
  register: terraform_output

Is it something possible? I looked in the runner.events, but I haven't found it.

Thanks

1

There are 1 best solutions below

0
MrHant On

You can set fact in your playbook using set_fact with cacheable: yes option.

- name: Save IP address
  set_fact:
    ip_address: "{{ terraform_output['parameter_name'] }}"
    cacheable: yes

And afterwards read it in python using get_fact_cache on runner instance.

self.runner.get_fact_cache(host)['ip_address']