In the previous post (here), we looked into Getting Started with SaltStack Config. We created and kicked off a few tasks from the web interface. Occasionally we’ll need to report on some data as well. The web interface offers the ability to download many result/output tables as CSV or JSON, but what if we wanted to do something with that data programmatically? Fortunately there is an API available (documentation here: https://developer.vmware.com/apis/1179/saltstack-config-raas). Unfortunately, I couldn’t find many examples of consuming this API with PowerShell and ran into an issue as I was getting started (related to credentials). Once I got those sorted out, I was able to create a quick inventory script that I wanted (to simply return minion names & a few “grains” like the Operating System & OS Version). However, with the bit of info I picked up along the way, I decided to try and wrap things up into a PowerShell Module for future needs. This module is available on GitHub (https://github.com/vmware/PowerCLI-Example-Scripts/tree/master/Modules/SaltStackConfig) and the following post will focus on how to get started using that module.
The first step to using this SaltStackConfig module is to get the required files to the system where you run scripts. The easiest way I know to do this is to download the full project repo (there is a Code > Download ZIP button at https://github.com/vmware/PowerCLI-Example-Scripts). With the zip file downloaded, I like to right click and see if the ‘unblock’ button appears in the bottom right — if so, I uncheck that (doing this prior to unzipping the file will save some time as we don’t need to recursively run Unblock-File on everything that was extracted).
I then extract the files I need, in this case the folder Modules\SaltStackConfig
and place them in one of the PowerShell Module paths (to find where these are, you can open a powershell window and type $env:PSModulePath
).
With the module copied into one of the correct paths, it will load automatically the next time we start PowerShell. Once we have that new PowerShell session, with the module now available, we can connect to the SaltStack Config environment. This cmdlet will connect to the RaaS API and create a global variable that we can reference to use future API calls (for this PowerShell session only).
C:\> Connect-SscServer 'salt.example.com' -User 'root' -Password 'VMware1!'
Here is the sample inventory task I was interested in that started everything:
C:\> (Get-SscMinionCache).grains |Select-Object host, osfullname, osrelease |Sort-Object host
host osfullname osrelease
---- ---------- ---------
cm-vrssc-01 VMware Photon OS 3.0
core-control-21 Microsoft Windows Server 2022 Standard 2022Server
dr-control-01 Microsoft Windows Server 2016 Standard 2016Server
raspberrypi Raspbian 10
svcs-sql-01 Microsoft Windows Server 2016 Standard 2016Server
t147-ubuntu-01 Ubuntu 20.04
t147-ubuntu-02 Ubuntu 20.04
t147-ubuntu18-01 Ubuntu 18.04
t147-win22-01 Microsoft Windows Server 2022 Standard 2022Server
I liked how the osfullname property looked for Windows machines, but for the Ubuntu & Photon releases I wanted to combine the osfullname and osrelease columns, so I went with a slightly modified Select-Object statement that contains some if/else logic that pulled together the output exactly how I wanted to display it:
C:\> (Get-SscMinionCache).grains | Select-Object host, @{Name='FriendlyOSName';Expression={ if ($_.osfullname -match 'Windows' ) { $_.osfullname } else { "$($_.osfullName) $($_.osrelease)"}}} | Sort-Object host
host FriendlyOSName
---- --------------
cm-vrssc-01 VMware Photon OS 3.0
core-control-21 Microsoft Windows Server 2022 Standard
dr-control-01 Microsoft Windows Server 2016 Standard
raspberrypi Raspbian 10
svcs-sql-01 Microsoft Windows Server 2016 Standard
t147-ubuntu-01 Ubuntu 20.04
t147-ubuntu-02 Ubuntu 20.04
t147-ubuntu18-01 Ubuntu 18.04
t147-win22-01 Microsoft Windows Server 2022 Standard
I decided to write a couple other wrapper functions for some other API methods that I thought I might end up using. In the next few sections I’ll show how to find a specific job that was run, the activity around that job, and the specific results from the execution.
In Task 2 of the previous post (https://enterpriseadmins.org/blog/scripting/getting-started-with-saltstack-config), we created a job to push BgInfo to our test servers. This function will return all jobs, but we’ll filter the output to just entries that contain bginfo. The syntax will be Get-SscJob | Where-Object {$_.name -match 'bginfo'}
and sample output would look like this:
uuid : b39de5cb-d01c-4cc7-a886-c746ae2b4150
name : EnterpriseAdmins BGInfo Test
desc :
cmd : local
tgt_uuid : e98739a9-a058-42a3-b3e4-73450de38ced
fun : state.apply
arg : @{arg=System.Object[]; kwarg=; hiddenArgsObj=}
masters : {}
metadata : @{auth=}
tgt_name : zCustomWinServerT147
When we ran that job, it generated some activity on our SSC appliance. We’ll find that specific activity by looking for only the entries where the Job_UUID matches the output from the above command, and since we may have ran the task multiple times, we’ll also filter it for only instances started in the last couple of days. The syntax will be Get-SscActivity | Where-Object {$_.job_uuid -eq 'b39de5cb-d01c-4cc7-a886-c746ae2b4150' -AND $_.start_time -gt '2021-12-20'}
jid : 20211222185741967000
state : completed_all_successful
cmd : local
user : bwuchner
user_uuid : 6fe029b6-9e2e-4501-8c57-1776084bd3a8
job_uuid : b39de5cb-d01c-4cc7-a886-c746ae2b4150
job_name : EnterpriseAdmins BGInfo Test
job_desc :
tgt_uuid : e98739a9-a058-42a3-b3e4-73450de38ced
tgt_name : zCustomWinServerT147
tgt_desc :
tgt_type : compound
tgt : G@os:Windows and G@nodename:t147-win22-01
sched_uuid :
sched_name : fun : state.apply is_highstate : False job_source : raas expected : 1
returned : 1
not_returned : 0
returned_good : 1 returned_failed : 0 duration : masters_to : {salt} masters_done : {salt}
create_time : 2021-12-22T18:58:02.307191
origination : Ad-Hoc
start_time : 2021-12-22T18:57:41.96700Z
And finally, we’ll want to find the status of all the data returned from that job. We’ll get the JID value from above and include it in a filter to the last function we’ll be covering. The final example syntax is: (Get-SscReturn -jid 20211222185741967000).full_ret | Select-Object id, success
id success
-- -------
t147-win22-01.lab.enterpriseadmins.org True
These are just a few examples, but each function includes some help, so feel free to use PowerShell help to get any usage examples for the other functions. For reference, here is a short list of the initial wrapper functions available:
C:\> Get-Command -Module SaltStackConfig
CommandType Name Version Source
----------- ---- ------- ------
Function Connect-SscServer 0.0.5 SaltStackConfig
Function Disconnect-SscServer 0.0.5 SaltStackConfig
Function Get-SscActivity 0.0.5 SaltStackConfig
Function Get-SscData 0.0.5 SaltStackConfig
Function Get-SscJob 0.0.5 SaltStackConfig
Function Get-SscMaster 0.0.5 SaltStackConfig
Function Get-SscMinionCache 0.0.5 SaltStackConfig
Function Get-SscReturn 0.0.5 SaltStackConfig
Function Get-SscSchedule 0.0.5 SaltStackConfig
If you run into any issues, or think of another function that would be helpful to have, please feel free to submit an issue on the Github repo at https://github.com/vmware/PowerCLI-Example-Scripts.