Version information
This version is compatible with:
- Puppet Enterprise 2023.8.x, 2023.7.x, 2023.6.x, 2023.5.x, 2023.4.x, 2023.3.x, 2023.2.x, 2023.1.x, 2023.0.x, 2021.7.x, 2021.6.x, 2021.5.x, 2021.4.x, 2021.3.x, 2021.2.x, 2021.1.x, 2021.0.x, 2019.8.x, 2019.7.x, 2019.5.x, 2019.4.x, 2019.3.x, 2019.2.x, 2019.1.x, 2019.0.x
- Puppet >= 6.0.0 < 9.0.0
- , , , , , , , , ,
Tasks:
- install_kb
Start using this module
Add this module to your Puppetfile:
mod 'puppetlabs-patching_as_code', '2.0.0'
Learn more about managing modules with a PuppetfileDocumentation
puppetlabs-patching_as_code
This module is supported by the Puppet community. We expect it to be of the same high quality as our own Supported modules, but it does not qualify for Puppet Support plans. See the
CODEOWNERS
file for usernames of the maintainers.
Table of Contents
- Description
- Setup
- Usage
- Customizing the patch groups
- Controlling which patches get installed
- Setting a High Priority patch schedule and list
- Compatibility with puppetlabs/change_window
- Defining situations when patching needs to be skipped
- Managing unsafe processes for patching
- Managing patching over metered links (Windows only)
- Defining pre/post-patching and pre-reboot commands
- Limitations
Description
This module provides automatic patch management for Linux, Windows and Chocolatey through desired state code.
Setup
What this module affects
This module will leverage the fact data provided by either the albatrossflavour/os_patching or PE 2019.8's builtin pe_patch
module for OS patches and Linux application patches (when based on Linux package manager repositories). It is also able to detect outdated Chocolatey packages.
Once available patches are known via the above facts, the module will install the patches during the configured patch window.
- For Linux operating systems, this happens through the native Package resource in Puppet.
- For Windows operating systems, this happens through the
patching_as_code::kb
class, which comes with this module. - For Chocolatey packages on Windows, this happens through the native Package resource in Puppet.
- By default, a reboot is performed before patching when a pre-existing pending reboot is detected, as well as at the end of a patch run when one or more patches caused an OS reboot to become pending. You can change this behavior though, to either always reboot or never reboot.
- You can define pre-patch, post-patch and pre-reboot commands for patching runs. We recommend that for Windows, you use Powershell-based commands for these. Specifically for pre-reboot commands on Windows, you must use Powershell-based commands.
- This module will report the details of the last successful patch run in a
patching_as_code
fact. - This module will report the configuration for each node in a
patching_as_code_config
fact. - This module will report outdated Chocolatey packages for each node in a
patching_as_code_choco
fact. - You can define an alternate patch schedule for high priority patches, to allow patches on the
high_priority_list
to be installed on a different (often faster) patch cycle.
Setup Requirements
To start with patching_as_code
, complete the following prerequirements:
- Ensure this module and its dependencies are added to your control repo's Puppetfile.
- If you are not running Puppet Enterprise 2019.8.0 or higher, you'll also need to add the albatrossflavour/os_patching module to your control repo's Puppetfile.
- If you are running Puppet Enterprise 2019.8.0 or higher, the built-in
pe_patch
module will be used by default. You can however force the use of theos_patching
module if so desired, by setting the optionalpatching_as_code::use_pe_patch
parameter tofalse
. To prevent duplicate declarations of thepe_patch
class in PE 2019.8.0+, this module will default to NOT declaring thepe_patch
class. This allows you to use the builtin "PE Patch Management" classification groups to classifype_patch
. If you however would like this module to control the classification ofpe_patch
for you (and sync thepatch_group
parameter, which is recommened), please set thepatching_as_code::classify_pe_patch
parameter totrue
. - For Linux operating systems, ensure your package managers are pointing to repositories that are publishing new package versions as needed
- For Windows operating systems, ensure Windows Update is configured to check with a valid update server (either WSUS, Windows Update or Microsoft Update). If you want, you can use the puppetlabs/wsus_client module to manage the Windows Update configuration.
- For Chocolatey packages, ensure your Chocolatey is pointing to repositories that are publishing new package versions as needed
Beginning with patching_as_code
To get started with the patching_as_code module, include it in your manifest:
include patching_as_code
or
class {'patching_as_code':}
This enables automatic detection of available OS patches, and puts all the nodes in the primary
patch group.
By default this will patch your systems on the 3rd Friday of the month, between 22:00 and midnight (00:00), and perform a reboot if necessary.
On PE 2019.8 or newer this will not automatically classify the pe_patch
class, so that you can control this through PE's builtin "PE Patch Management" node groups.
To allow patching_as_code to control & declare the pe_patch
class, change the declaration to:
class {'patching_as_code':
classify_pe_patch => true
}
This will change the behavior to also declare the pe_patch
class, and match its patch_group
parameter with this module's patch_group
parameter. In this scenario, make sure you do not classify your nodes with pe_patch
via the "PE Patch Management" node groups or other means.
To allow patching_as_code to control & declare the pe_patch
class, and also patch Chocolatey packages, set the declaration to:
class {'patching_as_code':
classify_pe_patch => true,
patch_choco => true
}
Usage
To control which patch group(s) a node belongs to, you need to set the patch_group
parameter of the class.
It is highly recommended to use Hiera to set the correct value for each node, for example:
patching_as_code::patch_group: early
The module provides 6 patch groups out of the box:
weekly: patches each Thursday of the month, between 09:00 and 11:00, performs a reboot if needed
testing: patches every 2nd Thursday of the month, between 07:00 and 09:00, performs a reboot if needed
early: patches every 3rd Monday of the month, between 20:00 and 22:00, performs a reboot if needed
primary: patches every 3rd Friday of the month, between 22:00 and 00:00, performs a reboot if needed
secondary: patches every 3rd Saturday of the month, between 22:00 and 00:00, performs a reboot if needed
late: patches every 4th Saturday of the month, between 22:00 and 00:00, performs a reboot if needed
There are also 2 special built-in patch groups:
always: patches immediately when a patch is available, can patch in any agent run, performs a reboot if needed
never: never performs any patching and does not reboot
If you want to assign a node to multiple patch groups, specify an array of values in Hiera:
patching_as_code::patch_group:
- testing
- early
or, in flow style:
patching_as_code::patch_group: [ testing, early ]
Note: if you assign a node to multiple patch groups, the value for the patch group provided to pe_patch
/os_patching
will be a space-separated list of the assigned patch groups. This is because pe_patch
/os_patching
do not natively support multiple patch groups, so we work around this by converting our list a single string that pe_patch
/os_patching
can work with. This is purely for cosmetic purposes and does not affect the functionality of either solution.
When using a local apply for iterative development, the default fact_upload => true
for pe_patch
or os_patching
may be problematic. If so, you can set fact_upload => false
for patching_os_code
to temporarily disable this behavior.
Customizing the patch groups
You can customize the patch groups to whatever you need. To do so, simply copy the patching_as_code::patch_schedule
hash from the data/common.yaml
in this module, and paste it into your own Hiera store (recommended to place it in your Hiera's own common.yaml
). This Hiera value will now override the defaults that the module provides. Customize the hash to your needs.
The hash has the following structure:
patching_as_code::patch_schedule:
<name of patch group>:
day_of_week: <day to patch systems>
count_of_week: <the Nth time day_of_week occurs in the month>
hours: <start of patch window> - <end of patch window>
max_runs: <max number of times that Puppet can perform patching within the patch window>
reboot: always | never | ifneeded
For example, say you want to have the following 2 patch groups:
group1: patches every 2nd Sunday of the month, between 10:00 and 11:00, max 1 time, reboots if needed
group2: patches every 3nd and 4th Monday of the month, between 20:00 and 22:00, max 3 times, does not reboot
group3: patches every day in the 3rd week of the month, between 18:00 and 20:00, max 4 times, always reboots
then define the hash as follows:
patching_as_code::patch_schedule:
group1:
day_of_week: Sunday
count_of_week: 2
hours: 10:00 - 11:00
max_runs: 1
reboot: ifneeded
group2:
day_of_week: Monday
count_of_week: [3,4]
hours: 20:00 - 22:00
max_runs: 3
reboot: never
group3:
day_of_week: Any
count_of_week: 3
hours: 18:00 - 20:00
max_runs: 4
reboot: always
Controlling which patches get installed
If you need to limit which patches can get installed, use the blocklist/allowlist capabilties. This is best done through Hiera by defining an array values for patching_as_code::blocklist
and/or patching_as_code::allowlist
for Windows Updates and Linux packages. For Chocolatey packages, separate Hiera values patching_as_code::blocklist_choco
and/or patching_as_code::allowlist_choco
can be set.
To prevent KB2881685 and the 7zip Chocolatey package from getting installed/updated on Windows:
patching_as_code::blocklist:
- KB2881685
patching_as_code::blocklist_choco:
- 7zip
To only allow the patching of a specific set of 3 Linux packages:
patching_as_code::allowlist:
- grafana
- redis
- nano
Allow lists and block lists can be combined, in that case the list of available updates first gets reduced to the what is allowed by the allowlist, and then gets further reduced by any blocklisted updates.
Setting a High Priority patch schedule and list
If you would like to install certain patches on a different, often faster, schedule compared to regular patches, you can configure this in the module. This requires specifying patches for the patching_as_code::high_priority_list
and/or patching_as_code::high_priority_list_choco
values in Hiera, and setting a patching_as_code::high_priority_patch_group
to associate one of the patch schedules to this list.
For example, to allow the Microsoft Defender definition update and 7zip Chocolatey package to always be installed immediately:
patching_as_code::high_priority_patch_group: always
patching_as_code::high_priority_list:
- KB4052623
patching_as_code::high_priority_list_choco:
- 7zip
Note that if you want to prevent any reboots from happening for your high priority runs, you should create a custom patch group that sets the reboot
parameter to never
, and use that group for the patching_as_code::high_priority_patch_group
parameter.
Compatibility with puppetlabs/change_window
If you leverage the puppetlabs/change_window
module to define custom change windows and want to use that module in combination with the High Priority patch window support in this module, you should leverage the high_priority_only
parameter for the patching_as_code
class to get the correct behavior. In this case, your logic should be something as follows:
$in_patch_window = Boolean(change_window::change_window($tz, $type, $window_wday, $window_time, $window_week, $window_month))
if $in_patch_window {
class {'patching_as_code':
high_priority_only => false,
}
else {
class {'patching_as_code':
high_priority_only => true,
}
}
This will allow patching_as_code
to keep patch information up to date outside of the change window(s) defined by puppetlabs/change_window
, and only perform regular patch runs when inside those change window(s). If you don't put any patches on the high_priority_list
, running with high_priority_only => true
will cause nothing to happen. Conversely, if you do need a high priority patch to be deployed, running with high_priority_only => true
will allow those high priority patches to be installed. Use the patch schedule capabilities of patching_as_code
to control when high priority patches are allowed to be installed, as well as whether reboots are allowed to happen at all.
To assist with the use case of combining with puppetlabs/change_window
, the high_priority_only => true
setting, when used with a patch schedule that allows reboots, will skip acting on pre-existing pending OS reboots at the start of the patch run. This is to ensure a reboot only occurs after patching and only when at least 1 high priority patch was installed. No changes are made to the system this way unless absolutely necessary because of a high priority patch.
Defining situations when patching needs to be skipped
There could be situations where you don't want patching to occur if certain conditions are met. This module supports two such situations:
- A specific process is running that must not be interrupted by patching
- The node to be patched is currently connected via a metered link (Windows only)
Managing unsafe processes for patching
You can define a list of unsafe processes which, if any are found to be active on the node, should cause patching to be skipped. This is best done through Hiera, by defining an array value for patching_as_code::unsafe_process_list
.
To skip patching if application1
or application2
is among the active processes:
patching_as_code::unsafe_process_list:
- application1
- application2
This works on both Linux and Windows, and the matching is done case-insensitive. If one process from the unsafe_process_list
is found as an active process, patching will be skipped.
If you need to match on a specific process including its arguments, prepend the entry with {full}
:
patching_as_code::unsafe_process_list:
- application1
- '{full} /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers'
You can have whitespace between {full}
and the process value for sake of readability, this will be automatically stripped before the matching happens.
Managing patching over metered links (Windows only)
By default, this module will not perform patching over metered links (e.g. 3G/4G connections). You can control this behavior through the patch_on_metered_links
parameter. To force patching to occur even over metered links, either define this value in Hiera:
patching_as_code::patch_on_metered_links: true
or set this parameter as part of calling the class:
class {'patching_as_code':
patch_on_metered_links => true
}
Defining pre/post-patching and pre-reboot commands
You can control additional commands that get executed at specific times, to facilitate the patch run. For example, you may want to shutdown specific applications before patching, or drain a kubernetes node before rebooting. The order of operations is as follows:
1) If reboots are enabled, check for pending reboots and reboot system immediately if a pending reboot is found
2) Run pre-patching commands
3) Install patches
4) Run post-patching commands
5) If reboots are enabled, run pre-reboot commands (if a reboot is pending, or when reboots are set to always
)
6) If reboots are enabled, reboot system (if a reboot is pending, or when reboots are set to always
)
To define the pre/post-patching and pre-reboot commands, you need to create hashes in Hiera. The commands will be executed as Exec
resources, and you can use any of the allowed attributes for that resource (just don't use metaparameters). There are 3 hashes you can define:
patching_as_code::pre_patch_commands
patching_as_code::post_patch_commands
patching_as_code::pre_reboot_commands
It's best to define this in Hiera, so that the commands can be tailored to individual nodes or groups of nodes. A hash for a command (let's use pre-reboot as an example) looks like this in Hiera:
patching_as_code::pre_reboot_commands:
prep k8s for reboot:
command: /usr/bin/kubectl drain k8s-3.company.local --ignore-daemonsets --delete-local-data
Here's another example, this time for a pre-patch powershell command on Windows:
patching_as_code::pre_patch_commands:
shutdown SQL server:
command: Stop-Service MSSQLSERVER -Force
provider: powershell
As you can see, it's just like defining Exec
resources.
Note that specifically for patching_as_code::pre_reboot_commands
, the provider:
, onlyif:
and unless:
parameters will be ignored, as these are overwritten by the internal logic to detect pending reboots. On Linux the provider:
is forced to posix
, on Windows it is forced to powershell
.
Limitations
This solution will patching to initiate whenever an agent run occurs inside the patch window. On Windows, patch runs for Cumulative Updates can take a long time, so you may want to tune the hours of your patch windows to account for a patch run getting started near the end of the window and still taking a significant amount of time.
Reference
Table of Contents
Classes
patching_as_code
: Framework for patch management as code. Works alongside the puppetlabs/pe_patch or albatrossflavour/os_patching modulespatching_as_code::high_prio_reboot
: This class gets called by init.pp to reboot the node. You can use Hiera to set a different default for the reboot_delay if desired.patching_as_code::linux::patchday
: This class gets called by init.pp to perform the actual patching on Linux.patching_as_code::reboot
: This class gets called by init.pp to reboot the node. You can use Hiera to set a different default for the reboot_delay if desired.patching_as_code::windows::patchday
: This class gets called by init.pp to perform the actual patching on Windows.patching_as_code::wu
: class patching_as_code::wu
Defined types
patching_as_code::kb
: This define gets called by init.pp to install Windows KB patches.
Resource types
patch_package
: Define a package resource to patchreboot_if_pending
: Perform a clean reboot if it was pending before this agent run
Functions
patching_as_code::dedupe_arch
patching_as_code::high_prio_last_run
patching_as_code::is_patchday
patching_as_code::last_run
patching_as_code::process_patch_groups
Tasks
install_kb
: Immediately installs a specific KB update
Classes
patching_as_code
Framework for patch management as code. Works alongside the puppetlabs/pe_patch or albatrossflavour/os_patching modules
Examples
Using the module with defaults, or controlling options through Hiera
include patching_as_code
Forcing the classification of pe_patch on PE 2019.8.0+
class {'patching_as_code':
classify_pe_patch => true
}
Forcing the use of albatrossflavour/os_patching on PE 2019.8.0+
class {'patching_as_code':
use_pe_patch => false
}
Parameters
The following parameters are available in the patching_as_code
class:
Variant
patch_schedule
blocklist
allowlist
blocklist_choco
allowlist_choco
high_priority_patch_group
high_priority_list
high_priority_list_choco
unsafe_process_list
pre_patch_commands
post_patch_commands
pre_reboot_commands
fact_upload
enable_patching
security_only
high_priority_only
patch_choco
use_pe_patch
classify_pe_patch
patch_on_metered_links
plan_patch_fact
patch_group
Variant
Data type: String, Array[String]
patch_group Name(s) of the patch_group(s) for this node. Must match one or more of the patch groups in $patch_schedule To assign multiple patch groups, provide this parameter as an array
patch_schedule
Data type: Hash
Hash of available patch_schedules. Default schedules are in /data/common.yaml of this module
Options:
- :day_of_week
String
: Day of the week to patch, valid options: 'Any', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday' - :count_of_week
Variant[Integer,Array[Integer]]
: Which week(s) in the month to patch, use number(s) between 1 and 5 - :hours
String
: Which hours on patch day to patch, define a range as 'HH:MM - HH:MM' - :max_runs
String
: How many Puppet runs during the patch window can Puppet install patches. Must be at least 1. - :reboot
String
: Reboot behavior, valid options: 'always', 'never', 'ifneeded'
blocklist
Data type: Array
List of updates to block from installing
allowlist
Data type: Array
List of updates that are allowed to be installed. Any updates not on this list get blocked.
blocklist_choco
Data type: Array
List of Chocolatey updates to block from installing
allowlist_choco
Data type: Array
List of Chocolatey updates that are allowed to be installed. Any Chocolatey updates not on this list get blocked.
high_priority_patch_group
Data type: String
Name of the high_priority_patch_group for this node. Must match a patch group in $patch_schedule
This patch schedule will only be used for patches in the $high_priority_list
.
high_priority_list
Data type: Array
List of updates to install on the patch schedule set by $high_priority_patch_group
.
high_priority_list_choco
Data type: Array
List of Chocolatey updates to install on the patch schedule set by $high_priority_patch_group
.
unsafe_process_list
Data type: Array
List of processes that will cause patching to be skipped if any of the processes in the list are active on the system.
Prepend an entry with {full}
to match against the full process arguments.
pre_patch_commands
Data type: Hash
Hash of command to run before patching
Options:
- :command
String
: The pre-patching command to execute - :path
String
: The path for the command - :provider
String
: The provider for the command
post_patch_commands
Data type: Hash
Hash of command to run after patching
Options:
- :command
String
: The post-patching command to execute - :path
String
: The path for the command - :provider
String
: The provider for the command
pre_reboot_commands
Data type: Hash
Hash of command to run before rebooting
Options:
- :command
String
: The pre-reboot command to execute - :path
String
: The path for the command - :provider
String
: The provider for the command Note: the provider for the command gets forced toposix
on Linux andpowershell
on Windows
fact_upload
Data type: Boolean
How os_patching/pe_patch handles changes to fact cache. Defaults to true.
When true (default), puppet fact upload
occurs as expected
When false, changes to fact cache are not uploaded
Default value: true
enable_patching
Data type: Boolean
Controls if patching_as_code
is allowed to install any updates. Can be used to disable patching with a single override.
Can be used to disable patching with a single override.
Default value: true
security_only
Data type: Boolean
Install only security updates. Requires latest version of Puppet Enterprise to work on Windows.
When using os_patching
, security updates can only be applied to Linux.
If patching of Chocolatey packages is enabled, Chocolatey packages will still update even if
security_only
is set to true
.
Default value: false
high_priority_only
Data type: Boolean
Only allow updates from the $high_priority_list
to be installed. Enabling this option will prevent
regular patches from being installed, and will skip a pending reboot at the beginning of the patch
run if a pending reboot is detected. A pending reboot may still happen at the end of the patch run,
as long as the patch schedule set by $high_priority_patch_group
allows reboots to occur.
Default value: false
patch_choco
Data type: Boolean
Also patch outdated Chocolatey packages (on Windows)
Default value: false
use_pe_patch
Data type: Boolean
Use the pe_patch module if available (PE 2019.8+). Defaults to true.
Default value: true
classify_pe_patch
Data type: Boolean
Controls if the pe_patch class (PE 2019.8+) is controlled by this module. When enabled, this module will classify the node with pe_patch, and set it's patch_group according to this module's patch_group. When disabled (default), you can use PE's own "PE Patch Management" groups to classify nodes with pe_patch. In that case, please make sure you match the patch_group variable in pe_patch with the patch_group in patching_as_code
Default value: false
patch_on_metered_links
Data type: Boolean
Controls if patches are installed when the active network connection is a metered link. This setting only has affect for Windows operating systems. When enabled, patching are installed even over a metered link. When disabled (default), patches are not installed over a metered link.
Default value: false
plan_patch_fact
Data type: Optional[String]
Reserved parameter for running patching_as_code
via a Plan (future functionality).
Default value: undef
patch_group
Data type: Variant[String,Array[String]]
patching_as_code::high_prio_reboot
Class: patching_as_code::high_prio_reboot
Parameters
The following parameters are available in the patching_as_code::high_prio_reboot
class:
reboot_if_needed
Data type: Boolean
Only reboot the node if a system reboot is pending. This parameter is passed automatically from init.pp
Default value: true
reboot_delay
Data type: Integer
Time in seconds to delay the reboot by, defaults to 2 minutes. To override for patching, specify an alternate value by setting the patching_as_code::high_prio_reboot::reboot_delay parameter in Hiera.
Default value: 120
patching_as_code::linux::patchday
Class: patching_as_code::linux::patchday
Parameters
The following parameters are available in the patching_as_code::linux::patchday
class:
updates
Data type: Array
List of Linux packages to update.
choco_updates
Data type: Array
List of Chocolatey packages to update, which should always be empty for Linux. This parameter exists only for compability.
Default value: []
high_prio_updates
Data type: Array
List of high-priority Linux packages to update.
Default value: []
high_prio_choco_updates
Data type: Array
List of high-priority Chocolatey packages to update, which should always be empty for Linux. This parameter exists only for compability.
Default value: []
patching_as_code::reboot
Class: patching_as_code::reboot
Parameters
The following parameters are available in the patching_as_code::reboot
class:
reboot_if_needed
Data type: Boolean
Only reboot the node if a system reboot is pending. This parameter is passed automatically from init.pp
Default value: true
reboot_delay
Data type: Integer
Time in seconds to delay the reboot by, defaults to 2 minutes. To override for patching, specify an alternate value by setting the patching_as_code::reboot::reboot_delay parameter in Hiera.
Default value: 120
patching_as_code::windows::patchday
Class: patching_as_code::windows::patchday
Parameters
The following parameters are available in the patching_as_code::windows::patchday
class:
updates
Data type: Array
List of Windows KB patches to install.
choco_updates
Data type: Array
List of Chocolatey packages to update.
high_prio_updates
Data type: Array
List of high-priority Windows KB patches to install.
Default value: []
high_prio_choco_updates
Data type: Array
List of high-priority Chocolatey packages to update.
Default value: []
patching_as_code::wu
class patching_as_code::wu
Defined types
patching_as_code::kb
define patching_as_code::kb
Parameters
The following parameters are available in the patching_as_code::kb
defined type:
ensure
Data type: String
When set to 'enabled' or 'present', will allow this resource to be applied. Removing updates is currently not supported.
Default value: 'enabled'
kb
Data type: String
Name of the KB patch to install.
Default value: $name
maintwindow
Data type: Optional[String]
Name of the patch window to use for installing the patch.
Default value: undef
Resource types
patch_package
Define a package resource to patch
Parameters
The following parameters are available in the patch_package
type.
chocolatey
Whether this is a Chocolatey package (Windows only)
name
namevar
Name of the package to patch
patch_window
Puppet schedule to link package resource to
reboot_if_pending
Perform a clean reboot if it was pending before this agent run
Parameters
The following parameters are available in the reboot_if_pending
type.
name
namevar
Name of this resource (has no function)
os
OS type from kernel fact
patch_window
Puppet schedule to link the reboot resource to
Functions
patching_as_code::dedupe_arch
Type: Ruby 4.x API
The patching_as_code::dedupe_arch function.
patching_as_code::dedupe_arch(Array $patches)
The patching_as_code::dedupe_arch function.
Returns: Any
patches
Data type: Array
patching_as_code::high_prio_last_run
Type: Ruby 4.x API
The patching_as_code::high_prio_last_run function.
patching_as_code::high_prio_last_run(Array $patches, Array $choco_patches)
The patching_as_code::high_prio_last_run function.
Returns: Any
patches
Data type: Array
choco_patches
Data type: Array
patching_as_code::is_patchday
Type: Puppet Language
The patching_as_code::is_patchday function.
patching_as_code::is_patchday(Enum['Any','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'] $day_of_week, Variant[Integer, Array] $week_iteration, String $patch_group)
The patching_as_code::is_patchday function.
Returns: Any
day_of_week
Data type: Enum['Any','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
week_iteration
Data type: Variant[Integer, Array]
patch_group
Data type: String
patching_as_code::last_run
Type: Ruby 4.x API
The patching_as_code::last_run function.
patching_as_code::last_run(Array $patches, Array $choco_patches)
The patching_as_code::last_run function.
Returns: Any
patches
Data type: Array
choco_patches
Data type: Array
patching_as_code::process_patch_groups
Type: Puppet Language
The patching_as_code::process_patch_groups function.
patching_as_code::process_patch_groups()
The patching_as_code::process_patch_groups function.
Returns: Any
Tasks
install_kb
Immediately installs a specific KB update
Supports noop? false
Parameters
kb
Data type: Pattern[/^KB\d+$/]
The KB number of the patch you want to install (e.g. KB123456)
restart
Data type: Boolean
Perform a restart after installing the patch
What are tasks?
Modules can contain tasks that take action outside of a desired state managed by Puppet. It’s perfect for troubleshooting or deploying one-off changes, distributing scripts to run across your infrastructure, or automating changes that need to happen in a particular order as part of an application deployment.
Tasks in this module release
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
v2.0.0 - 2024-08-29
Other
- fix dates #104 (spotter-puppet)
- V2.0.0 #103 (spotter-puppet)
- V1.1.8 #100 (spotter-puppet)
v1.1.9 - 2024-08-28
Fixed
Other
- V1.1.8 #100 (spotter-puppet)
- Powershell scripts should be executed with the -NoProfile parameter #96 (elfranne)
- Exclude 'patching_as_code' fact from running on Darwin systems #93 (kennyb-222)
- Pdk release prep fix fix #92 (kreeuwijk)
- fix PDK Release Prep action step #91 (kreeuwijk)
- remove travis #87 (binford2k)
v1.1.7 - 2022-11-01
Fixed
v1.1.6 - 2022-09-28
Fixed
- fix release versions to match tags #74 (binford2k)
- improved logic for pre_reboot_commands #73 (kreeuwijk)
- setting up history for auto changelog generation #72 (binford2k)
v1.1.5 - 2022-09-28
Other
- Release 1.1.5: RHEL 9 reboot detection support #65 (kreeuwijk)
- Add RHEL9 support to pending_reboot.sh #64 (jcpunk)
- Full process detection for
unsafe_process_list
#62 (kreeuwijk)
v1.1.4 - 2022-07-15
Other
v1.1.3 - 2022-06-20
Other
- Correct the source parameter #58 (binford2k)
- Added the Trusted Contributor notice #56 (binford2k)
- v1.1.2: Fix High Priority patches not getting installed on Windows #51 (kreeuwijk)
v1.1.2 - 2022-03-09
v1.1.1 - 2022-03-07
Other
v1.1.0 - 2022-03-07
Other
- v1.1.0: High priority patching support #50 (kreeuwijk)
- v1.0.5: Use own location for
patching_as_code
fact #49 (kreeuwijk)
v1.0.5 - 2022-03-01
Other
- v1.0.5: Use own location for
patching_as_code
fact #49 (kreeuwijk) - v1.0.4:
patching_as_code
fact #47 (kreeuwijk)
v1.0.4 - 2022-02-23
Other
v1.0.3 - 2022-02-18
Other
v1.0.2 - 2022-02-18
Other
- v1.0.2: Unique allow/block lists for Chocolatey #45 (kreeuwijk)
- v1.0.1: Improve handling of
patching_as_code_choco
fact #44 (kreeuwijk)
v1.0.1 - 2022-02-17
Other
- v1.0.1: Improve handling of
patching_as_code_choco
fact #44 (kreeuwijk) - v1.0.0: Add Chocolatey support #43 (kreeuwijk)
v1.0.0 - 2022-02-15
Other
- v1.0.0: Add Chocolatey support #43 (kreeuwijk)
- work around deprecation message #42 (prolixalias)
- backward-compatible disabling of os_patching's fact_upload #41 (prolixalias)
- v0.7.11: Fix issues caused by duplicate items in list of patches #40 (kreeuwijk)
v0.7.11 - 2021-12-03
Other
v0.7.10 - 2021-11-15
Other
v0.7.9 - 2021-11-11
Other
v0.7.8 - 2021-11-11
v0.7.7 - 2021-09-07
v0.7.6 - 2021-08-25
Other
v0.7.5 - 2021-08-25
Other
v0.7.4 - 2021-08-20
Other
- v0.7.4: schedule fix in Notify resource #34 (kreeuwijk)
- v0.7.3: Custom resource title support #33 (kreeuwijk)
v0.7.3 - 2021-08-19
Other
- v0.7.3: Custom resource title support #33 (kreeuwijk)
- v0.7.2 - Allow reboots when pending on patch day #31 (kreeuwijk)
v0.7.2 - 2021-07-21
Other
- v0.7.2 - Allow reboots when pending on patch day #31 (kreeuwijk)
- v0.7.1 - code improvements (#28) #30 (kreeuwijk)
- v0.7.1 - code improvements #28 (kreeuwijk)
v0.7.1 - 2021-06-25
Other
- v0.7.1 - code improvements #28 (kreeuwijk)
- Move post-patch reboot logic to its own stage that runs after [main][#27](https://github.com/puppetlabs/puppetlabs-patching_as_code/pull/27) (kreeuwijk)
v0.7.0 - 2021-06-22
Other
- Move post-patch reboot logic to its own stage that runs after [main][#27](https://github.com/puppetlabs/puppetlabs-patching_as_code/pull/27) (kreeuwijk)
- Update boundaries for powershell #24 (PolaricEntropy)
- v0.6.2 - Support daily schedule #23 (kreeuwijk)
v0.6.2 - 2021-04-30
Other
v0.6.1 - 2021-04-19
Other
v0.6.0 - 2021-04-16
Other
- Update branch with 0.5.0 changes #20 (kreeuwijk)
- Version 0.5.0 - Native Windows Update support #19 (kreeuwijk)
v0.5.0 - 2021-04-09
Other
- win_update feature #18 ()
v0.4.3 - 2021-02-09
v0.4.2 - 2021-02-09
v0.4.1 - 2021-02-09
Other
v0.4.0 - 2021-02-04
v0.3.0 - 2021-01-20
Other
- Version 0.3.0 - Custom type to prevent duplicate package declarations #13 (kreeuwijk)
- Support existing package declarations that specify a version #12 (kreeuwijk)
v0.2.9 - 2021-01-15
Other
- Support existing package declarations that specify a version #12 (kreeuwijk)
- Fix risk of duplicate declarations #11 (kreeuwijk)
v0.2.8 - 2021-01-15
v0.2.7 - 2020-12-16
Other
v0.2.6 - 2020-12-15
Other
v0.2.5 - 2020-12-02
Other
v0.2.4 - 2020-11-06
Other
v0.2.3 - 2020-10-23
Other
v0.2.2 - 2020-08-25
Other
- Release preparation for 0.2.2 #3 (kreeuwijk)
- Ensure no duplicate declarations happen with pe_patch #2 (kreeuwijk)
v0.2.1 - 2020-07-17
Other
v0.2.0 - 2020-07-16
v0.1.0 - 2020-07-13
Dependencies
- puppetlabs/powershell (>= 3.0.1 < 7.0.0)
- puppetlabs/pwshlib (>= 0.4.1 < 2.0.0)
- puppetlabs/puppet_agent (>= 4.0.0 < 6.0.0)
- puppetlabs/reboot (>= 2.4.0 < 6.0.0)
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.