Categories
PowerShell Tanium

PowerShell Deployment Automation Toolkit 0.5.5

Hello Again All,

The PowerShell Deployment Automation Toolkit has now been updated to 0.5.5.

Update 0.5.5 brings support for Tanium Patch automation and a new class; SinglePatchlistWithPost. Each Tanium Patch catalog item defined for this class can have an indefinite number of defined rings each with their own patch list to be deployed with a post-installation notification.

In addition to basic reliability / usability improvements, I have also taken the opportunity to automate the export of template catalog items for every Windows Gallery Package that is available as of 4/25/2022. In short, each possible deployment class has predefined catalog items for every Windows package in the Tanium Gallery.

More to come.

PowerShell Deployment Automation Toolkit

  • Author: Brent Henderson
  • Release Date: 04/25/2022
  • Version: 0.5.5

Introduction

Toolkit Overview

The PowerShell Deployment Automation Toolkit provides a way to deliver automated deployments through the Tanium Endpoint Management platform.

Features

This script manages the creation of Tanium Deploy and Tanium Patch deployments and will automatically import Tanium Deploy Gallery packages for the Tanium Endpoint Management platform. The tool currently provides the following functionality:

  • Deployment automation capabilities for both Tanium Deploy & Tanium Patch
  • Support for multiple environments with minimal administrative overhead
  • Predefined templates for every class and every Tanium Gallery package serving the Windows platform
  • Automatic API session creation mechanism with manual fallback if $CredentialObject variable is not populated
  • Catalog items that support an indefinite number of deployment rings
  • Independently configurable deployment rings (Eg, a single Tanium Patch catalog item could have one ring for workstations that overrides maintenance windows and a separate ring for servers that respects maintenance windows).
  • Automated Tanium Package Gallery package imports
  • PowerShell classes to validate deployment data structures prior to API submission
  • Support for Pre/Post Notification options with Single and Ongoing deployments in Tanium Deploy
  • Support for Restart Notification options with Single and Ongoing deployments in Tanium Patch
  • Support for Patch Tuesday offset configuration within deployment rings
  • CMTrace/OneTrace-compatible logging

Dependencies

The TanREST PowerShell module is required and cannot currently be distributed by anyone other than Tanium. Please contact your Technical Account Manager to acquire and install the latest version of TanREST.

License

PowerShell Deployment Automation Toolkit – Provides a way to deliver automated deployments through the Tanium Endpoint Management platform.

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Quick Start

  1. Extract the Toolkit to a convenient location.
  2. Navigate to \DeploymentAutomationToolkit\core\catalog\repo
  3. Copy one of the json catalog items to \DeploymentAutomationToolkit\core\catalog. Example: Copy \catalog\ex-SinglePackageWithPostAndPre\googlellc-chrome-x64.json to the \DeploymentAutomationToolkit\core\catalog.
  4. Add rings by copying the example rings and incrementing the name by one. Example: To define five rings, ensure that there are defined rings named ring1, ring2, ring3, ring4, and ring5.
  5. Modify non-null key values to your preferences.
  6. Execute the script.

Usage

powershell.exe -File '\\pathToFile\DeploymentAutomationToolkit.ps1'

powershell.exe -File '\\pathToFile\DeploymentAutomationToolkit.ps1' -Environment [[Alt],[Dev],[Prod],[QA]]

powershell.exe -File 'c:\pathToFile\DeploymentAutomationToolkit.ps1' -Environment 'Alt' -QuickTest $true -StartToday $true

$credentialObject = Get-Credential

powershell.exe -File 'c:\pathToFile\DeploymentAutomationToolkit.ps1' -Environment 'Alt' -QuickTest $true -StartToday $true -CredentialObject $credentialObject

powershell.exe -File 'c:\pathToFile\DeploymentAutomationToolkit.ps1' -Environment 'Alt' -QuickTest $true -StartToday $true -CredentialObject (Get-Credential)

Script Parameters

ParametersDescription
CredentialObject (Optional)Allows the user to establish a SecureString credential object prior to invocation of the tool. If absent, the user will be prompted upon initialization.
DecommOnCompletion (Optional)Designates whether or not jobs should be decommissioned once all rings are deployed; defaults to $true. If set to $false, jobs will remain in the root/jobqueue/ directory and no subsequent jobs for that software will proceed until the job is manually copied to the root/jobqueue/decommissioned/ directory.
Environment (Optional)Designates the operating environment for the script to execute upon. Jobs from multiple environments can coexist so back-to-back executions from multiple environments will function appropriately. The default value is ‘Alt’.
QuickTest (Optional)Designates whether or not an abbreviated run should be facilitated; defaults to $false as a precaution against initialization issues that can come from processing too many jobs in quick succession.
StartTodayDesignates whether or not the startDateOffsetInDays value in catalog items will offset relative to the runtime date or the next Patch Tuesday; defaults to $false.

JSON Catalog Keys | Tanium Patch & Tanium Deploy Package Deployments

Note: Any null values in the example files under /core/catalog/repo denote values that will be established at runtime by the toolkit itself. Users should not modify or remove null values. Key definitions for Patch and Deploy have been consolidated; keys that only apply to one or the other will be denoted by [Deploy] or [Patch].

KeysDescription
allRingsDeployedIndicates whether or not all defined rings within the job have been deployed.
architectureArchitecture of the package to be deployed. Valid entries are [x64],[x86],[any].
contentAcquiredIndicates whether or not the content for the package has been cached. Applies to [Deploy] catalog items.
currentVersionReflects current software version for a given package that is available. Applies to [Deploy] catalog items.
currentSoftwarePackageEditIdThe current software package object version. Applies to [Deploy] catalog items.
deployedObjectEditIdFunctionally identical to currentSoftwarePackageEditId (current is used in package metadata; deployedObjectEditId is used to create deployments). Applies to [Deploy] catalog items.
frameworkCatalogNameThe name of the source catalog item that the job was created to address. Must be the exact name; see examples.
guidThe unique GUID assigned to the job at runtime.
holdReasonThe reason, if any, why a package was placed in a hold state.
jobFileLocationThe current location of the job file.
jobStatusThe current status of the job.
lastModifiedIndicates the last time the Toolkit modified a given job file.
packageCacheLoopAn integer value indicating how many loops the package cache logic should take. Each loop is 10 seconds so a value of 30 would allow for a maximum of 5 minutes before the job was placed in a hold state. Applies to [Deploy] catalog items.
platformThe platform that the job is targeted toward. Valid values are [windows] or [macos]. Applies to [Deploy] catalog items.
previousSoftwarePackageIdThe previous package ID of the software that is being deployed by a given job. This property was previously named previousPackageID but amended to align more closely with Tanium object properties. Applies to [Deploy] catalog items.
productNameThe product name of the software being deployed by a given job.
productVendorThe product vendor of the software being deployed by a given job.
ring#Deployment rings (ring1, ring2, etc.) are objects with their own subkeys that define the pertinent details of a deployment. The subkeys are detailed below.
softwarePackageIdThe current package ID of the package being deployed by a given job. This property was previously named packageId but amended to align with Tanium object properties.
sourceThe source property denotes the source from which the package content will be acquired. Valid values are [deployGallery] and [taniumPatch].
typeThe type key denotes what is being deployed by the job. Valid values are [package] and .

JSON Catalog – Subkeys of ring# | Tanium Patch & Package Deployments

Reminder: Users should not modify or remove null values.

KeysDescription
classDenotes the class of the ring that is being deployed. Valid values are [OngoingPackageDeploymentSilent],[OngoingPackageWithPostAndPre],[OngoingPackageWithPostNoPre],[OngoingPackageWithPreNoPost],[SinglePackageSilent],[SinglePackageWithPostAndPre],[SinglePackageWithPostNoPre],[SinglePackageWithPreNoPost], [SinglePatchlistWithPost].
classValidatedDenotes whether or not the ring successfully passed the class validation of the deployment data.
deploymentLengthInDaysRing designation indicating the length of time that the deployment should run.
deploymentStartTimeThe 24-hour value of the intended start time. Example: 00:00 is the default value and representative of midnight.
deploymentEndTimeThe 24-hour value of the intended stop time. Example: 00:00 is the default value and representative of midnight. null is an acceptable value for Ongoing deployment classes.
deploymentStartTimeStringnull key that the Toolkit will use to store the formatted start time value derived at runtime.
deploymentEndTimeStringnull key that the Toolkit will use to store the formatted end time value derived at runtime.
descriptionnull key that the Toolkit will use to tattoo the deployment with key information such as the job GUID.
distributeOverTimeMinutesNumber of minutes to distribute the deployment across. Example: 120 would distribute the deployment over two hours.
downloadImmediatelyIndicates whether or not endpoints should begin downloading content as soon as the deployment is created. Consider the size of the audience you are targeting carefully.
deploymentIDnull key that the Toolkit will use to store the deployment ID of a successful deployment.
deployedOnThe datetime value of the deployment created by the Toolkit.
endTimenull key that the Toolkit will use to store the ending time of the deployment for [Single] deployments.
eussAvailableBeforeStartIndicates whether or not users should be able to interact with the deployment prior to start time.
operationThe deployment operation that should be leveraged in the deployment. The default value for [deployGallery] jobs is [update]; the default value for [taniumPatch] jobs is [install].
overrideMaintenanceWindowsIndicates whether or not maintenance windows should be respected by the deployment. The default value is [false].
postNotificationThe notification that an end user will see after a Tanium Deploy deployment. Applies to [Deploy] catalog items.
preNotificationThe notification that an end user will see before a Tanium Deploy deployment. Applies to [Deploy] catalog items.
restartIndicates whether or not the deployment should restart devices. The default value is [false]. Valid values are [true] and [false].
restartClientNotificationThe notfication that an end user will see after a Patch deployment. Applies to [Patch] catalog items.
startDateOffsetInDaysAn integer value denoting how much of an offset should be configured from the start time. For example, one would use the $StartToday switch and a startDateOffsetInDays offset of 0 to start a deployment for the same day.
targetedComputerGroupIdsnull key that the Toolkit will use to store the ID of the Computer Group defined in the targetCriteria key. Applies to [Patch] catalog items.
targetTypeIndicates the target apparatus for a deployment. [computerGroup] is currently the only valid value.
targetCriteriaThe Computer Group to be targeted by a given deployment ring. Default value is [No Computers].
targetCriteriaIdnull key that the Toolkit will use to store associated ID of the targetCriteria object. Applies to [Deploy] catalog items.
typeIndicates the type of deployment to be created. ‘single’ is the only valid value and indicates a deployment with defined beginning and end dates.
useTaniumClientTimeZoneIndicates whether or not the deployment should use the client local time. Default value is [true]. Valid values are [true] and [false].

JSON Catalog – Subkeys of [postNotification],[preNotification] | Tanium Package Deployments

Reminder: Users should not modify or remove null values.

KeysDescription
allowPostponeDetermines whether end user will be notified before the deployment begins. Valid values are [true] and [false].
body(Required if notifyUser is true) The body text of the end user notification.
countdownToDeadlineInMinutes(Required if notifyUser is true) The time in minutes before the end of the postponement period when an end user will be shown a countdown to the forced deployment
notifyUserIf true, the end user will be notified after the deployment completes
postponeDurationInMinutes(Required if allowPostone is true) The amount of time in minutes the deployment can be postponed
title(Required if notifyUser is true) The title of the end user notification
userPostponementPeriodInMinutesOne(Required if allowPostpone is true) Postponement period in minutes that will be available to the end user
userPostponementPeriodInMinutesTwo(Required if allowPostpone is true) Postponement period in minutes that will be available to the end user
userPostponementPeriodInMinutesThree(Required if allowPostpone is true) Postponement period in minutes that will be available to the end user

JSON Catalog – Subkeys of [restartClientNotification] | Tanium Patch Deployments

KeysDescription
allowPostponeDetermines whether end user will be notified before the restart occurs. Valid values are [true] and [false].
bodyThe body text of the end user notification.
countdownToDeadlineInMinutesThe time in minutes before the end of the postponement period.
gentleNotificationDurationInMinutes??? Cannot find reference to this key in API documentation.
iconThe title icon for the end user notification.
postponeDurationInMinutesThe amount of time in minutes the deployment can be postponed.
titleThe title of the end user notification.
userPostponementPeriodInMinutesOnePostponement period in minutes that will be available to the end user.
userPostponementPeriodInMinutesTwoPostponement period in minutes that will be available to the end user.
userPostponementPeriodInMinutesThreePostponement period in minutes that will be available to the end user.

Reference

Directory Overview

root/
├─ core/
│  ├─ catalog/
│  │  ├─ repo/
│  │  │  ├─	ex-OngoingPackageDeploymentSilent/
│  │  │  │	├─ templates
│  │  │  ├─	ex-OngoingPackageWithPostAndPre/
│  │  │  │	├─ templates
│  │  │  ├─	ex-OngoingPackageWithPostNoPre/
│  │  │  │	├─ templates
│  │  │  ├─	ex-OngoingPackageWithPreNoPost/
│  │  │  │	├─ templates
│  │  │  ├─	ex-SinglePackageSilent/
│  │  │  │	├─ templates
│  │  │  ├─	ex-SinglePackageWithPostAndPre/
│  │  │  │	├─ templates
│  │  │  ├─	ex-SinglePackageWithPostNoPre/
│  │  │  │	├─ templates
│  │  │  ├─	ex-SinglePackageWithPreNoPost/
│  │  │  │	├─ templates
│  │  │  ├─	ex-SinglePatchlistWithPost/
│  │  │  │	├─ windows-with-notification.json 
│  ├─ config/
│  ├─ functions/
│  │  ├─ Confirm-DeploymentData.ps1
│  │  ├─ Get-DAAddress.ps1
│  │  ├─ Get-DACredentials.ps1
│  │  ├─ Get-LatestTaniumDeployPackage.ps1
│  │  ├─ Get-PatchTuesday.ps1
│  │  ├─ Get-StartAndEndDates.ps1
│  │  ├─ Get-TaniumDeployPackageCacheStatus.ps1
│  │  ├─ New-DASession.ps1
│  │  ├─ Set-JSONProperty.ps1
│  │  ├─ Start-GalleryPackageDeploymentProcessing.ps1
│  │  ├─ Start-PatchDeploymentProcessing.ps1
│  │  ├─ Submit-TaniumDeployPackageDeployment.ps1
│  │  ├─ Submit-TaniumPatchDeployment.ps1
│  │  ├─ Write-Log.ps1
├─ jobqueue/
│  ├─ decommissioned/
│  ├─ hold/
├─ logs/
│  ├─ deploymentautomation.log
├─ .gitignore
├─ DeploymentAutomationToolkit.ps1
├─ readme.md


Directory Structure

FolderDescription
coreContains the Toolkit core dependencies.
catalogContains JSON-based catalog entries for deployment.
repoContains JSON-based catalog entries that have not been deployed.
configContains JSON-based reference file for environmental targeting configurations.
functionsContains the Toolkit function dependencies.
jobqueueContains JSON-based jobs.
decommissionedContains completed JSON-based jobs.
holdContains JSON-based jobs that encountered an issue during execution.

Included Files

FileDescription
Confirm-DeploymentData.ps1Constructs a deployment data object from the job object and performs a class validation.
Confirm-DAAddress.ps1Gathers Tanium API URI information from user.
Confirm-DACredentials.ps1Gathers Tanium API user credentials if $CredentialObject is not passed upon invocation. Credentials are not stored by the Toolkit.
DeploymentAutomationToolkit.ps1The controller script that drives the Toolkit.
Get-LatestTaniumDeployPackage.ps1Identifies the latest version of a given piece of software in the Deploy Package Gallery and imports that package if it has a higher version than what is already present in the Deploy catalog.
Get-PatchTuesday.ps1Function that determines the date of Patch Tuesday for a given month/year.
Get-StartAndEndDates.ps1Calculates Start and End dates for a given deployment.
Get-TaniumDeployPackageCacheStatus.ps1Monitors the import process from the Deploy Package Gallery.
googlellc-chrome-x64.jsonExample catalog item for the Google LLC Chrome product preconfigured to the class of the folder within which it resides.
igorpavlov-7-zip-x64.jsonExample catalog item for the Igor Pavlov 7-zip product preconfigured to the class of the folder within which it resides.
New-DASession.ps1Function that gathers input from user and creates a session with the desired Tanium environment.
Set-JSONProperty.ps1Function that updates JSON files.
Start-GalleryPackageDeploymentProcessing.ps1Processes Tanium Deploy catalog job objects by iterating through defined rings.
Start-PatchDeploymentProcessing.ps1Processes Tanium Patch catalog job objects by iterating through defined rings.
Submit-TaniumDeployPackageDeployment.ps1Submits Tanium Deploy job rings to the Tanium API.
Submit-TaniumPatchDeployment.ps1Submits Tanium Patch job rings to the Tanium API.
windows-with-notification.jsonExample catalog item for Microsoft Windows patch deployments preconfigured to the class of the folder within which it resides.
Write-Log.ps1Function that creates CMTrace/OneTrace-formatted logs.

Screenshots

Windows Update catalog item processing
Windows Update catalog item result

Change History

0.5.5

* Added support for Tanium Patch to allow 1st-party patching through Deployment Automation Toolkit
* Addressed bug in Get-LatestTaniumDeployPackage function caused by absence of [version] type accelerator
* Amended Confirm-DeploymentData with Tanium Patch class structure validation
* Removed support for credential storage. Will revisit when the project is further along.

* Known Issues
* Individually stored functions are unwieldy; likely to be consolidated into a Main script later.

0.5.1

* Integrated class-based validation for deployment data prior to making commits via TanREST
* Added support for Pre/Post Notification options for both single and ongoing deployments
* Unified configuration settings into a single configuration file 
* Introduced consideration for multi-platform packages in controller script and mandatory catalog item properties.
* Split off code from controller script into subfunctions to improve readability and assist debugging
* Reduced unnecessary logic trees that would always evaluate to $true due to location
* Miscellaneous readability improvements to controller and subfunctions
* Aligned most runtime variable object properties to align with Tanium object properties where possible. Some still vary for sake of clarity
* Reduced utilization of one-off variables for clarity; integrated most of these details in the jobs themselves for posterity/troubleshooting

0.0.1

* Implement automatic config-driven Tanium session creation
* Implement basic job processing engine
* Implement automatic package import
* Implement verbose, CMtrace-compatible logging
* Establish predictable tooling structure for relational references to dependencies

Disclaimer: Any code made available on this site is free to use at your own discretion but it is provided without any explicit or implied guarantees of support, reliability, or functionality. I accept no responsibility in the event that the code, in its original form or any derivative versions thereafter, malfunctions or causes problems . Anything from this site that you decide to work with should be tested thoroughly in development environments in collaboration with your Technical Account Manager (TAM) until such time that you, the responsible party, decides that you are satisfied with its outcomes.