ExportedFunctions/Get-AnsibleInventory.ps1
<# .DESCRIPTION Gets inventories defined in Ansible Tower. .PARAMETER Description Optional description of this inventory. .PARAMETER HasActiveFailures Flag indicating whether any hosts in this inventory have failed. .PARAMETER HasInventorySources Flag indicating whether this inventory has any external inventory sources. .PARAMETER HostFilter Filter that will be applied to the hosts of this inventory. .PARAMETER InsightsCredential Credentials to be used by hosts belonging to this inventory when accessing Red Hat Insights API. .PARAMETER Kind Kind of inventory being represented. .PARAMETER Name Name of this inventory. .PARAMETER Organization Organization containing this inventory. .PARAMETER PendingDeletion Flag indicating the inventory is being deleted. .PARAMETER Variables Inventory variables in JSON or YAML format. .PARAMETER Id The ID of a specific AnsibleInventory to get .PARAMETER AnsibleTower The Ansible Tower instance to run against. If no value is passed the command will run against $Global:DefaultAnsibleTower. #> function Get-AnsibleInventory { [CmdletBinding(DefaultParameterSetname='PropertyFilter')] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidGlobalVars", "Global:DefaultAnsibleTower")] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "InsightsCredential")] param( [Parameter(Position=2,ParameterSetName='PropertyFilter')] [String]$Description, [Parameter(ParameterSetName='PropertyFilter')] [switch]$HasActiveFailures, [Parameter(ParameterSetName='PropertyFilter')] [switch]$HasInventorySources, [Parameter(ParameterSetName='PropertyFilter')] [String]$HostFilter, [Parameter(ParameterSetName='PropertyFilter')] [Object]$InsightsCredential, [Parameter(ParameterSetName='PropertyFilter')] [ValidateSet('','smart')] [string]$Kind, [Parameter(Position=1,ParameterSetName='PropertyFilter')] [String]$Name, [Parameter(Position=3,ParameterSetName='PropertyFilter')] [Object]$Organization, [Parameter(ParameterSetName='PropertyFilter')] [switch]$PendingDeletion, [Parameter(ParameterSetName='PropertyFilter')] [String]$Variables, [Parameter(ValueFromPipelineByPropertyName=$true,ParameterSetName='ById')] [Int32]$Id, [Parameter(ParameterSetName='ById')] [Switch]$UseCache, $AnsibleTower = $Global:DefaultAnsibleTower ) process { $Filter = @{} if($PSBoundParameters.ContainsKey("Description")) { if($Description.Contains("*")) { $Filter["description__iregex"] = $Description.Replace("*", ".*") } else { $Filter["description"] = $Description } } if($PSBoundParameters.ContainsKey("HasActiveFailures")) { $Filter["has_active_failures"] = $HasActiveFailures } if($PSBoundParameters.ContainsKey("HasInventorySources")) { $Filter["has_inventory_sources"] = $HasInventorySources } if($PSBoundParameters.ContainsKey("HostFilter")) { if($HostFilter.Contains("*")) { $Filter["host_filter__iregex"] = $HostFilter.Replace("*", ".*") } else { $Filter["host_filter"] = $HostFilter } } if($PSBoundParameters.ContainsKey("InsightsCredential")) { switch($InsightsCredential.GetType().Fullname) { "AnsibleTower.InsightsCredential" { $Filter["insights_credential"] = $InsightsCredential.Id } "System.Int32" { $Filter["insights_credential"] = $InsightsCredential } "System.String" { $Filter["insights_credential__name"] = $InsightsCredential } default { Write-Error "Unknown type passed as -InsightsCredential ($_). Supported values are String, Int32, and AnsibleTower.InsightsCredential." -ErrorAction Stop return } } } if($PSBoundParameters.ContainsKey("Kind")) { if($Kind.Contains("*")) { $Filter["kind__iregex"] = $Kind.Replace("*", ".*") } else { $Filter["kind"] = $Kind } } if($PSBoundParameters.ContainsKey("Name")) { if($Name.Contains("*")) { $Filter["name__iregex"] = $Name.Replace("*", ".*") } else { $Filter["name"] = $Name } } if($PSBoundParameters.ContainsKey("Organization")) { switch($Organization.GetType().Fullname) { "AnsibleTower.Organization" { $Filter["organization"] = $Organization.Id } "System.Int32" { $Filter["organization"] = $Organization } "System.String" { $Filter["organization__name"] = $Organization } default { Write-Error "Unknown type passed as -Organization ($_). Supported values are String, Int32, and AnsibleTower.Organization." -ErrorAction Stop return } } } if($PSBoundParameters.ContainsKey("PendingDeletion")) { $Filter["pending_deletion"] = $PendingDeletion } if($PSBoundParameters.ContainsKey("Variables")) { if($Variables.Contains("*")) { $Filter["variables__iregex"] = $Variables.Replace("*", ".*") } else { $Filter["variables"] = $Variables } } if($id) { $CacheKey = "inventory/$Id" $AnsibleObject = $AnsibleTower.Cache.Get($CacheKey) if($UseCache -and $AnsibleObject) { Write-Debug "[Get-AnsibleInventory] Returning $($AnsibleObject.Url) from cache" $AnsibleObject } else { Invoke-GetAnsibleInternalJsonResult -ItemType "inventory" -Id $Id -AnsibleTower $AnsibleTower | ConvertToInventory -AnsibleTower $AnsibleTower } } else { Invoke-GetAnsibleInternalJsonResult -ItemType "inventory" -Filter $Filter -AnsibleTower $AnsibleTower | ConvertToInventory -AnsibleTower $AnsibleTower } } } function AddInventoryGroups { param( $Inventory ) $Groups = Invoke-GetAnsibleInternalJsonResult -ItemType "inventory" -Id $Inventory.Id -ItemSubItem "groups" -AnsibleTower $Inventory.AnsibleTower $Inventory.Groups = New-Object "System.Collections.Generic.List[AnsibleTower.Group]" foreach($Group in $Groups) { $GroupObj = Get-AnsibleGroup -Id $Group.Id -AnsibleTower $Inventory.AnsibleTower -UseCache $Inventory.Groups.Add($GroupObj) } $Inventory } function ConvertToInventory { param( [Parameter(ValueFromPipeline=$true,Mandatory=$true)] $InputObject, [Parameter(Mandatory=$true)] $AnsibleTower ) process { $JsonString = ConvertTo-Json $InputObject $AnsibleObject = [AnsibleTower.JsonFunctions]::ParseToinventory($JsonString) $AnsibleObject.AnsibleTower = $AnsibleTower $CacheKey = "inventory/$($AnsibleObject.Id)" Write-Debug "[Get-AnsibleInventory] Caching $($AnsibleObject.Url) as $CacheKey" $AnsibleTower.Cache.Add($CacheKey, $AnsibleObject, $Script:CachePolicy) > $null #Add to cache before filling in child objects to prevent recursive loop $AnsibleObject = AddInventoryGroups $AnsibleObject Write-Debug "[Get-AnsibleInventory] Returning $($AnsibleObject.Url)" $AnsibleObject } } |