diff --git a/lib/ansible/playbook/task.py b/lib/ansible/playbook/task.py index a0156e1937..25c746049f 100644 --- a/lib/ansible/playbook/task.py +++ b/lib/ansible/playbook/task.py @@ -214,7 +214,7 @@ class Task(Base, Conditional, Taggable, Become): if k in ('action', 'local_action', 'args', 'delegate_to') or k == action or k == 'shell': # we don't want to re-assign these values, which were determined by the ModuleArgsParser() above continue - elif k.replace("with_", "") in lookup_loader: + elif k.startswith('with_') and k.replace("with_", "") in lookup_loader: # transform into loop property self._preprocess_with_loop(ds, new_ds, k, v) else: diff --git a/lib/ansible/plugins/lookup/var.py b/lib/ansible/plugins/lookup/var.py new file mode 100644 index 0000000000..3cf9460ae2 --- /dev/null +++ b/lib/ansible/plugins/lookup/var.py @@ -0,0 +1,100 @@ +# (c) 2017 Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +DOCUMENTATION = """ + lookup: var + author: Ansible Core + version_added: "2.5" + short_description: Lookup templated value of variable + description: + - Retrieves the value of an Ansible variable. + options: + _term: + description: The variable name to look up. + required: True + default: + description: + - What to return when the variable is undefined. + - If no default is set, it will result in an error if the variable is undefined. +""" + +EXAMPLES = """ +- name: Show value of 'variablename' + debug: msg="{{ lookup('var', 'variabl' + myvar)}}" + vars: + variablename: hello + myvar: ename + +- name: Show default empty since i dont have 'variablnotename' + debug: msg="{{ lookup('var', 'variabl' + myvar, default='')}}" + vars: + variablename: hello + myvar: notename + +- name: Produce an error since i dont have 'variablnotename' + debug: msg="{{ lookup('var', 'variabl' + myvar)}}" + ignore_errors: True + vars: + variablename: hello + myvar: notename + +- name: find some 'prefixed vars' in loop + debug: msg="{{ lookup('var', 'ansible_play_' + item) }}" + loop: + - hosts + - batch + - hosts_all + +""" + +RETURN = """ +_value: + description: + - valueof the variable requested +""" + +from ansible.errors import AnsibleError, AnsibleUndefinedVariable +from ansible.module_utils.six import string_types +from ansible.plugins.lookup import LookupBase + + +class LookupModule(LookupBase): + + def run(self, terms, variables=None, **kwargs): + + ret = None + if variables is not None: + self._templar.set_available_variables(variables) + myvars = getattr(self._templar, '_available_variables', {}) + + self.set_options(direct=kwargs) + default = self.get_option('default') + + # Assumes listify_plugin_terms is called previous to run so each term is already templated and terms is always a list + if isinstance(terms, list): + term = terms[0] + elif isinstance(terms, string_types): + term = terms + else: + raise AnsibleError('Invalid terms passed to "var" lookup, "%s" is not a string, its a %s' % (terms, type(terms))) + + if not isinstance(term, string_types): + raise AnsibleError('Invalid setting identifier, "%s" is not a string, its a %s' % (term, type(term))) + + try: + if term in myvars: + value = myvars[term] + elif 'hostvars' in myvars and term in myvars['hostvars']: + # maybe it is a host var? + value = myvars['hostvars'][term] + else: + raise AnsibleUndefinedVariable('No variable found with this name: %s' % term) + ret = self._templar.template(value, fail_on_undefined=True) + except AnsibleUndefinedVariable: + if default is None: + ret = default + else: + raise + return ret diff --git a/test/integration/targets/docker_secret/tasks/Fedora.yml b/test/integration/targets/docker_secret/tasks/Fedora.yml index a0e202748d..60e70d2ef1 100644 --- a/test/integration/targets/docker_secret/tasks/Fedora.yml +++ b/test/integration/targets/docker_secret/tasks/Fedora.yml @@ -2,7 +2,7 @@ dnf: name: "{{ item }}" state: present - items: + loop: - dnf-plugins-core - name: Add repository diff --git a/test/integration/targets/docker_secret/tasks/RedHat.yml b/test/integration/targets/docker_secret/tasks/RedHat.yml index fe5675a7b6..ac7487bd0f 100644 --- a/test/integration/targets/docker_secret/tasks/RedHat.yml +++ b/test/integration/targets/docker_secret/tasks/RedHat.yml @@ -5,7 +5,7 @@ yum: name: "{{ item }}" state: present - items: + loop: - yum-utils - device-mapper-persistent-data - lvm2