diff --git a/changelogs/fragments/fix_options.yml b/changelogs/fragments/fix_options.yml new file mode 100644 index 00000000000..bf415ffc7f1 --- /dev/null +++ b/changelogs/fragments/fix_options.yml @@ -0,0 +1,2 @@ +bugfixes: + - allow set_options to be called multiple times https://github.com/ansible/ansible/pull/41913 diff --git a/lib/ansible/plugins/__init__.py b/lib/ansible/plugins/__init__.py index dc629effb7e..92e99c39e4a 100644 --- a/lib/ansible/plugins/__init__.py +++ b/lib/ansible/plugins/__init__.py @@ -70,11 +70,10 @@ class AnsiblePlugin(with_metaclass(ABCMeta, object)): :arg var_options: Dict with either 'conneciton variables' :arg direct: Dict with 'direct assignment' ''' + self._options = C.config.get_plugin_options(get_plugin_class(self), self._load_name, keys=task_keys, variables=var_options, direct=direct) - if not self._options: - # load config options if we have not done so already, if vars provided we should be mostly done - self._options = C.config.get_plugin_options(get_plugin_class(self), self._load_name, keys=task_keys, variables=var_options, direct=direct) # allow extras/wildcards from vars that are not directly consumed in configuration + # this is needed to support things like winrm that can have extended protocol options we don't direclty handle if self.allow_extras and var_options and '_extras' in var_options: self.set_option('_extras', var_options['_extras'])