Targeting Salt Resources#
New in version 3008.0.
A Salt resource is something a minion manages on behalf of the master — an SSH host, a virtual appliance, an external API endpoint — addressed by an id of the operator's choosing. Resources extend Salt's targeting system: every targeting expression that selects minions can also select resources.
This page is the targeting reference. For the conceptual introduction see Salt Resources; for the registry and dispatch plumbing see Architecture.
Targeting forms#
Every form below treats resources alongside minions: a single command returns one entry per matched id, whether that id belongs to a minion or a resource.
Glob and exact-id#
A wildcard glob automatically expands to include every resource managed by every matched minion:
salt '*' test.ping
A specific bare id matches a resource directly:
salt 'web-01' test.ping
A specific minion id targets only the minion (not its resources):
salt 'minion-1' test.ping
Compound T@ (resource type)#
T@<type> matches every resource of the given type:
salt -C 'T@ssh' state.apply
T@<type>:<id> targets exactly one resource:
salt -C 'T@ssh:web-01' test.ping
Grain-based -G / G@#
A resource carries its own grains, produced by the grains function
in the resource's connection module (e.g.
salt.resource.dummy.grains()). The master records each minion's
per-resource grain dicts in the resource_grains cache bank when the
minion registers, and salt -G matches against that bank in addition
to the per-minion grain bank:
salt -G 'environment:prod' test.ping
Compound G@ works the same way and supports the full boolean
algebra (and, or, not, parens):
salt -C 'G@environment:prod and G@role:web' state.apply
salt -C 'T@ssh and not G@environment:staging' test.ping
The boolean form is evaluated per resource, so a compound matches a resource iff that resource's identity and grains satisfy the entire expression.
PCRE grain -P / P@#
Identical semantics to -G / G@ but values are regex patterns:
salt -P 'environment:^production-.*' test.ping
salt -C 'P@environment:^production-.*' state.apply
List -L#
A bare resource id appearing in a list expression matches:
salt -L 'web-01,web-02,db-01' test.ping
Pillar -I / I@#
Note
Pillar-based targeting of resources is not wired up. Resources
do not carry per-resource pillar data today. -I and I@ only
match minions; resources are skipped silently. This is tracked as
future work — see the gap notes in
salt.utils.resource_registry.
How master and minion split the work#
Master side#
The master's CkMinions augments grain matches with resource ids
read from the resource_grains cache bank. The augment runs for
-G, -P, and any G@ / P@ term inside a compound. The
matched bare resource ids are added to the response wait set so the
master accepts the corresponding returns.
Minion side#
When a publish arrives, the minion's _resolve_resource_targets
walks every locally managed resource and decides, per resource,
whether the targeting expression matches. For glob / list / T@
this is a string match; for G@ / P@ the minion uses the
grains it cached during its last registration; for compound, the
minion evaluates the full boolean expression against each resource's
identity and grains.
Each matched resource gets its own job dispatch with __grains__
swapped to the resource's grain dict (so salt 'web-01' grains.items
returns web-01's grains, not the managing minion's).
Freshness and refresh#
The master's resource_grains bank is updated only when a minion
re-registers via _register_resources_with_master. Triggers that
re-register are:
Minion start / reconnect (
tune_in);A
saltutil.refresh_pillar(the minion's pillar refresh handler re-discovers resources before re-registering); andThe
resource_refreshevent on the minion event bus.
A per-resource <type>.grains_refresh() invocation does not
auto-propagate to the master. To force the master's view to refresh
without waiting for a pillar refresh, fire the resource_refresh
event for the relevant minion:
salt-run resource.refresh minion=resources-minion
That runner publishes minion/<id>/resource_refresh on the master
event bus; the minion's handler re-runs resource discovery and
re-publishes its full grain set.
Operator inspection#
Two read-only runners expose what the master sees:
# Show every SRN currently in the resource_grains bank with a
# one-line summary (top-level grain keys + count).
salt-run resource.list_grains
# Show the full grain dict for one resource.
salt-run resource.show_grains type=ssh id=web-01
When salt -G '<key>:<value>' test.ping returns less than expected,
resource.list_grains is the first place to check: if a resource
isn't in the bank, the master will not match it, and the resource needs
a saltutil.refresh_pillar (or a resource.refresh) on its
managing minion.