Recently I’ve been trying to mess a little with Ansible’s Python API (I am well aware it is not recommended, and python API is meant only for internal use, however…).
My goal was to create a function that’s able to retrieve data from ansible-playbook, which basically means two things:
- retrieve the raw data by parsing YAML files,
the simplest solution, is to let ansible do this, and then pass “{{ vars }}” to the module/plugin (at the level of YAML file)
a more complicated solution is to use: ansible.vars.manager.VariableManager
- render the jinja2 template
because ansible stores them, inside variables, instead of what they evaluate to.
that’s why I need/want to render jinja2 using ansible’s API, at the level of .py file.
Questions:
- is there any way to retrieve current play & current task from within a .py file from within a module/plugin (when a said module/plugin is being executed, just like the code below), so I can pass it to the variables = variable_manager.get_vars(…) 2. is there a better way to do what I am trying to do?
`
from ansible import context
from ansible.inventory.manager import InventoryManager
from ansible.parsing.dataloader import DataLoader
from ansible.template import Templar
from ansible.vars.manager import VariableManager
def render(template):
“”"
Render jinja2 template using Anisble’s API.
“”"
options = context.CLIARGS
sources = options[‘inventory’]
loader = DataLoader()
inventory = InventoryManager(
loader = loader,
sources = sources
)
variable_manager = VariableManager(
loader = loader,
inventory = inventory
)
templar = Templar(
loader = DataLoader(),
variables = variable_manager.get_vars(…) # <<< HERE
)
return templar.template(template)
def filter_render_test(*args, **kwargs):
return render(“{{ foo }}”)
class FilterModule(object):
def filters(self):
return {
‘render_test’: filter_render_test,
}
`
and the corresponding playbook:
`