From e8c1b2c5a8af5cc6f4551918f695d1463a6eb584 Mon Sep 17 00:00:00 2001 From: Matei Albu Date: Sun, 6 May 2018 21:15:58 +0200 Subject: [PATCH] Option to merge current pillar with opts['pillar'] during pillar compile Fixes #47501 (cherry picked from commit 2f1485e) --- doc/ref/configuration/minion.rst | 28 ++++++++++++++++++++++++++++ salt/config/__init__.py | 4 +++- salt/pillar/__init__.py | 7 +++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/doc/ref/configuration/minion.rst b/doc/ref/configuration/minion.rst index c9010a702b..d9823b78d8 100644 --- a/doc/ref/configuration/minion.rst +++ b/doc/ref/configuration/minion.rst @@ -3219,3 +3219,31 @@ URL of the repository: Replace ```` with the SHA1 hash of a commit ID. Specifying a commit ID is useful in that it allows one to revert back to a previous version in the event that an error is introduced in the latest revision of the repo. + +``ssh_merge_pillar`` +-------------------- + +.. versionadded:: 2018.3.2 + +Default: ``True`` + +Merges the compiled pillar data with the pillar data already available globally. +This is useful when using ``salt-ssh`` or ``salt-call --local`` and overriding the pillar +data in a state file: + +.. code-block:: yaml + + apply_showpillar: + module.run: + - name: state.apply + - mods: + - showpillar + - kwargs: + pillar: + test: "foo bar" + +If set to ``True`` the ``showpillar`` state will have access to the +global pillar data. + +If set to ``False`` only the overriding pillar data will be available +to the ``showpillar`` state. diff --git a/salt/config/__init__.py b/salt/config/__init__.py index 432364b201..feda0abac1 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -989,6 +989,7 @@ VALID_OPTS = { 'ssh_identities_only': bool, 'ssh_log_file': six.string_types, 'ssh_config_file': six.string_types, + 'ssh_merge_pillar': bool, # Enable ioflo verbose logging. Warning! Very verbose! 'ioflo_verbose': int, @@ -1485,6 +1486,7 @@ DEFAULT_MINION_OPTS = { }, 'discovery': False, 'schedule': {}, + 'ssh_merge_pillar': True } DEFAULT_MASTER_OPTS = { @@ -2089,7 +2091,7 @@ def _validate_ssh_minion_opts(opts): for opt_name in list(ssh_minion_opts): if re.match('^[a-z0-9]+fs_', opt_name, flags=re.IGNORECASE) \ - or 'pillar' in opt_name \ + or ('pillar' in opt_name and not 'ssh_merge_pillar' == opt_name) \ or opt_name in ('fileserver_backend',): log.warning( '\'%s\' is not a valid ssh_minion_opts parameter, ignoring', diff --git a/salt/pillar/__init__.py b/salt/pillar/__init__.py index fc1e34f75d..fc3ce0a5c0 100644 --- a/salt/pillar/__init__.py +++ b/salt/pillar/__init__.py @@ -1014,6 +1014,13 @@ class Pillar(object): mopts['file_roots'] = self.actual_file_roots mopts['saltversion'] = __version__ pillar['master'] = mopts + if 'pillar' in self.opts and self.opts.get('ssh_merge_pillar', False): + pillar = merge( + self.opts['pillar'], + pillar, + self.merge_strategy, + self.opts.get('renderer', 'yaml'), + self.opts.get('pillar_merge_lists', False)) if errors: for error in errors: log.critical('Pillar render error: %s', error) -- 2.13.7