Groups and patch rings
A group is a named set of nodes you can aim work at. Every group works in runbooks, workflows, schedules, change windows and the secrets vault. When work targets a group, Gardience sends Salt the target expression the group stands for.
Gardience has three kinds of groups, all listed on Machines > Groups:
| Kind | Where it comes from | Who changes it |
|---|---|---|
| Built-in | Ships with Gardience | Nobody: fixed |
| Custom | Made on the Groups page | Admins |
| Ansible | Imported from the Ansible groups of enrolled hosts | Your Ansible inventory, with admin approval for new memberships |
The All groups list shows each group, where it came from, its target expression and its members that are online right now. Membership is refreshed at most once a minute.
Built-in groups
| Group | Members |
|---|---|
| Windows | Every Windows node (G@kernel:Windows) |
| Linux | Every Linux node (G@kernel:Linux) |
| RHEL / Rocky / Oracle / Amazon Linux | The Red Hat family (G@os_family:RedHat) |
| Debian / Ubuntu | The Debian family (G@os_family:Debian) |
| Salt 3006 | Agents on Salt 3006 (G@saltversioninfo:3006) |
| Salt 3007 | Agents on Salt 3007 (G@saltversioninfo:3007) |
| Salt 3008 | Agents on Salt 3008 (G@saltversioninfo:3008) |
| Servers | Servers, including virtual machines that do not report a desktop or laptop case (G@gardience_device:server) |
| Desktops | Desktop computers: Windows 10 and 11 that are not laptops, and Linux in a desktop case (G@gardience_device:desktop) |
| Laptops | Laptops and tablets (G@gardience_device:laptop) |
| Ring0-Pilot | The pilot patch ring (G@gardience_ring:pilot and not G@gardience_hold:onboarding) |
| Ring1-Broad | Every node not in the pilot ring (* and not G@gardience_ring:pilot and not G@gardience_hold:onboarding) |
| Onboarding | Machines that joined with "fix first" and are not clean yet: in neither ring (G@gardience_hold:onboarding). See Onboarding profiles |
| Stage-Dev, Stage-Test, Stage-Prod | The stage chosen at enrollment (G@gardience_stage:dev and so on); dev and test machines are also in the pilot ring |
| All machines | Every node (*) |
The expressions use Salt's compound targeting. G@ matches a grain, a fact the agent reports about its machine. Built-in groups work the same way in attach mode, because Gardience sends the expression itself instead of relying on your master's own group settings.
Custom groups
To make a group, as an admin:
- Open Machines > Groups.
- Under New group, enter a name. Names start with a letter or number, may use letters, numbers, spaces, dots, dashes and underscores, and are up to 60 characters. A name cannot be the same as a built-in group.
Under Members, choose how to pick them:
Choice What you enter Resulting target Pick nodes Tick the nodes A fixed list ( L@node1,node2)By operating system Windows, Linux, RHEL family, Debian family or SUSE family A grain match, for example G@os_family:SuseBy name pattern A pattern with *or?wildcards, for exampleweb-*Matches node names. Letters, numbers, .,-and_only, up to 100 charactersSalt compound expression (advanced) Any Salt compound expression, for example G@os:Rocky and web*Used as written. Up to 400 characters - Select Save group. Saving with an existing custom group's name replaces it.
To delete a custom group, select Delete next to it. Built-in and Ansible groups cannot be deleted on this page. Saving and deleting groups are written to the audit log.
Act on a group
Every group, built-in, Ansible or your own, has an Actions menu:
| Choice | What it does |
|---|---|
| Install updates | Runs the Patch a node group runbook on the group |
| Apply security baseline | Runs Apply security baseline on the group |
| Apply CMMC settings | Runs Apply CMMC settings on the group |
| Health check | Checks that every machine in the group answers. Changes nothing |
| Run a runbook, Run a command, Ask a live question, Apply a state, Schedule a maintenance window | Opens that page with the group already chosen |
The first four ask first, then run as you, under your role, with the same change windows, locks, approvals and audit log as running the runbook from Automation > Runbooks. Follow the run under Automation > Runbooks, Recent runs. They are greyed out for a group with no machines online.
Ansible groups
When hosts join through the enrollment playbook, each agent reports its Ansible groups (group_names from your inventory) as the grain gardience_groups. Gardience turns each of those into a group with the same name.
- If an Ansible group has the same name as a built-in group, Gardience names it
ansible-<name>. - Group names that do not fit the naming rules above are ignored.
- Each Ansible group targets an explicit list of nodes (
L@...) kept on the server, so a node cannot move itself into a group just by changing what it reports. - When an Ansible group has no members, it targets nobody. After a day with no members, it is removed.
- When a node's key is removed from the master, Gardience forgets its memberships at the next scan.
To change Ansible groups, change your inventory and run the enrollment playbook again. They cannot be deleted in the console.
Pending approvals
A grain is something a machine says about itself, so Gardience trusts it only once:
- First report: the groups a node reports when Gardience first sees it become its membership.
- Leaving a group: applies at once.
- Joining a new group later: waits for an admin. Until then the node stays out of that group, and out of any vault secrets scoped to it.
When nodes ask to join new groups, the console shows a notice that says how many, and Machines > Groups shows Ansible group changes waiting for approval with each node and the groups it wants to join. If you changed your inventory and re-ran the playbook, select Approve all. If you did not expect the change, leave it pending and check the machine. If a node stops asking, its pending request is dropped.
Admins can also approve some nodes only, through the API:
curl -s https://gardience.example.com/gardience/api/groups/ansible/approve -H "X-Auth-Token: $TOKEN" \
-H 'Content-Type: application/json' -d '{"nodes":["web-01","web-02"]}'Each approval is written to the audit log (group.ansible_membership_approved).
Patch rings
Patch rings let you patch a small set of machines first, check them, and only then patch the rest:
- Ring0-Pilot holds the nodes that carry the grain
gardience_ringset topilot. - Ring1-Broad holds every other node.
To move a node between rings, as an admin:
- Open Machines > Inventory.
- In the Patch ring column, select Make pilot to put a node in the pilot ring, or Move to broad to take it out.
The node must be online: Gardience sets or removes the grain on the machine and waits up to 60 seconds for it to answer. If it does not, you see an error and can try again when it is back. Each move is written to the audit log (ring.pilot or ring.broad).
Work aimed at an empty pilot ring stops with the message "the pilot ring is empty", so pick pilot machines before you use it.
Rings in workflows and schedules
Gardience comes with a workflow named Patch Tuesday: pilot ring, then broad ring. It:
- patches the pilot ring, then checks that its machines are healthy,
- asks a second person to approve moving on,
- patches the broad ring, then checks it,
- re-applies the security baseline to the broad ring if a broad ring step fails.
It also comes with a schedule named Weekly patch window: pilot ring, which patches the pilot ring on Tuesdays at 02:00 (America/Chicago). It is turned off until you turn it on.