Dnia czw, 17 lip 2014, 14:29:45 Michael DeHaan pisze:
I could be very very wrong about my assumption.

Can we see the source to your filter?  It might be instructive about
what this might take.
I kind of hope you are, as it would be really handy to have this in Ansible core ;-)

My filter is attached. I'm afraid it ignores variables set with Jinja2 in current template (as it only looks at the context with "basedir" attribute), and I'm not sure about role's and play's vars. So far I've only used it to access variables that could be resolved without even looking at playbook, only with knowledge from inventory and {group,host}_vars.
Example usage: {{ ('other_host' | get_hostvars).other_hosts_variable }}


On Thu, Jul 17, 2014 at 2:06 AM, Tomasz Kontusz
<[email protected] <mailto:[email protected]>> wrote:



    Michael DeHaan <[email protected] <mailto:[email protected]>>
    napisał:
    >To be honest, nested variable evaluation in hostvars is a can of
    worms
    >to
    >resolve and I don't think it will be a thing.
    Can you point to any specific problems? I'm using a filter that
    just resolves host's vars in the context of hostvars[host], and it
    seems to work ok

    >
    >
    >On Wed, Jul 16, 2014 at 5:01 PM, Tomasz Kontusz
    ><[email protected] <mailto:[email protected]>>
    >wrote:
    >
    >>  On 16.07.2014 22:40, Matt Peterson wrote:
    >>
    >> Given the following example:
    >>
    >>  foo: "y"
    >> boo: "x is {{ foo }}"
    >>
    >>  This will renders in a template "x is y" (when referenced as
    {{ boo
    >}}).
    >> However when called as hostvars[host]['boo'] this renders as "x
    is {{
    >foo
    >> }}". From what I can tell this is an interpolation or merging
    >problem. I've
    >> tried different YAML formatting options to no avail. Appreciate any
    >help or
    >> direction to share, thank you.
    >>
    >> Nothing gets templated when accessed through hostvars, see
    >> https://github.com/ansible/ansible/issues/7844 (disclaimer: I've
    >opened
    >> this issue).
    >>
    >>
    >>   --Matt
    >>  --
    >> You received this message because you are subscribed to the Google
    >Groups
    >> "Ansible Project" group.
    >> To unsubscribe from this group and stop receiving emails from it,
    >send an
    >> email to [email protected]
    <mailto:ansible-project%[email protected]>.
    >> To post to this group, send email to
    >[email protected]
    <mailto:[email protected]>.
    >> To view this discussion on the web visit
    >>
    
>https://groups.google.com/d/msgid/ansible-project/CAFN0R25WbD7P_SdMm26J0rN9Cmj%2BKOEHvF2yAGuy%2B7eS-V4zQA%40mail.gmail.com
    >>
    
><https://groups.google.com/d/msgid/ansible-project/CAFN0R25WbD7P_SdMm26J0rN9Cmj%2BKOEHvF2yAGuy%2B7eS-V4zQA%40mail.gmail.com?utm_medium=email&utm_source=footer>
    >> .
    >> For more options, visit https://groups.google.com/d/optout.
    >>
    >>
    >>  --
    >> You received this message because you are subscribed to the Google
    >Groups
    >> "Ansible Project" group.
    >> To unsubscribe from this group and stop receiving emails from it,
    >send an
    >> email to [email protected]
    <mailto:ansible-project%[email protected]>.
    >> To post to this group, send email to
    >[email protected]
    <mailto:[email protected]>.
    >> To view this discussion on the web visit
    >>
    
>https://groups.google.com/d/msgid/ansible-project/53C6E845.4050709%40gmail.com
    >>
    
><https://groups.google.com/d/msgid/ansible-project/53C6E845.4050709%40gmail.com?utm_medium=email&utm_source=footer>
    >> .
    >>
    >> For more options, visit https://groups.google.com/d/optout.
    >>

    --
    Wysłane za pomocą K-9 Mail.

    --
    You received this message because you are subscribed to the Google
    Groups "Ansible Project" group.
    To unsubscribe from this group and stop receiving emails from it,
    send an email to [email protected]
    <mailto:ansible-project%[email protected]>.
    To post to this group, send email to
    [email protected]
    <mailto:[email protected]>.
    To view this discussion on the web visit
    
https://groups.google.com/d/msgid/ansible-project/1d6e7a12-b194-4ca9-9525-7623fbbe24c9%40email.android.com.
    For more options, visit https://groups.google.com/d/optout.


--
You received this message because you are subscribed to the Google
Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to [email protected]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/CA%2BnsWgy%2BRPi4FRNyr%3D5i2-o9WZ7V%3DyeFcC%3DzzOhAoAO8vQRQjA%40mail.gmail.com
<https://groups.google.com/d/msgid/ansible-project/CA%2BnsWgy%2BRPi4FRNyr%3D5i2-o9WZ7V%3DyeFcC%3DzzOhAoAO8vQRQjA%40mail.gmail.com?utm_medium=email&utm_source=footer>.
For more options, visit https://groups.google.com/d/optout.


--
You received this message because you are subscribed to the Google Groups "Ansible 
Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/53C83358.7010605%40gmail.com.
For more options, visit https://groups.google.com/d/optout.
from ansible.utils.template import _jinja2_vars
from jinja2 import contextfilter


class FilterModule(object):
    def filters(self):
        return {'get_hostvars': _hostvars}


@contextfilter
def _hostvars(ctx, hostname):
    basedir_ctx = ctx
    while basedir_ctx:
        try:
            basedir = basedir_ctx.basedir
            break
        except AttributeError:
            basedir_ctx = basedir_ctx.parent

    hostvars = ctx['hostvars'][hostname]
    host_ctx = _jinja2_vars(
        basedir,
        hostvars,  # vars
        basedir_ctx.globals,  # globals
        basedir_ctx.fail_on_undefined,
        # extras:
        {})
    return host_ctx

Reply via email to