diff --git a/conf/minion b/conf/minion index 3950877d3e2..ed951cd7a0f 100644 --- a/conf/minion +++ b/conf/minion @@ -565,6 +565,15 @@ # #state_aggregate: False +# Disable requisites during state runs by specifying a single requisite +# or a list of requisites to disable. +# +# disabled_requisites: require_in +# +# disabled_requisites: +# - require +# - require_in + ##### File Directory Settings ##### ########################################## # The Salt Minion can redirect all file server operations to a local directory, diff --git a/doc/topics/releases/sodium.rst b/doc/topics/releases/sodium.rst index 4bb34f8dd25..f60ad848e7d 100644 --- a/doc/topics/releases/sodium.rst +++ b/doc/topics/releases/sodium.rst @@ -77,3 +77,9 @@ You can set this setting in your roster file like so: user: root passwd: P@ssword set_path: '$PATH:/usr/local/bin/' + + +State Changes +============= +- Adding a new option for the State compiler, ``disabled_requisites`` will allow + requisites to be disabled during State runs. diff --git a/salt/config/__init__.py b/salt/config/__init__.py index 92508ef78f6..4d315385fd1 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -925,6 +925,7 @@ VALID_OPTS = immutabletypes.freeze( # Allow raw_shell option when using the ssh # client via the Salt API "netapi_allow_raw_shell": bool, + "disabled_requisites": [], } ) @@ -1216,6 +1217,7 @@ DEFAULT_MINION_OPTS = immutabletypes.freeze( "discovery": False, "schedule": {}, "ssh_merge_pillar": True, + "disabled_requisites": [], } ) diff --git a/salt/state.py b/salt/state.py index d2b489c8eca..fa096f0b245 100644 --- a/salt/state.py +++ b/salt/state.py @@ -1683,7 +1683,9 @@ class State(object): ) extend = {} errors = [] - disabled = self.opts.get("disabled_requisites", []) + disabled_reqs = self.opts.get("disabled_requisites", []) + if not isinstance(disabled_reqs, list): + disabled_reqs = [disabled_reqs] for id_, body in six.iteritems(high): if not isinstance(body, dict): continue @@ -1702,9 +1704,10 @@ class State(object): key = next(iter(arg)) if key not in req_in: continue - log.debug("=== self %s ===", self.opts) - if key in disabled: - log.info("=== %s disabled ===", key) + if key in disabled_reqs: + log.warning( + "The %s requisite has been disabled, Ignoring.", key + ) continue rkey = key.split("_")[0] items = arg[key] @@ -2547,6 +2550,9 @@ class State(object): Look into the running data to check the status of all requisite states """ + disabled_reqs = self.opts.get("disabled_requisites", []) + if not isinstance(disabled_reqs, list): + disabled_reqs = [disabled_reqs] present = False # If mod_watch is not available make it a require if "watch" in low: @@ -2598,6 +2604,9 @@ class State(object): if pre: reqs["prerequired"] = [] for r_state in reqs: + if r_state in disabled_reqs: + log.warning("The %s requisite has been disabled, Ignoring.", r_state) + continue if r_state in low and low[r_state] is not None: for req in low[r_state]: if isinstance(req, six.string_types):