diff --git a/system/setup.py b/system/setup.py index c3f19eda170..8830e9d255d 100644 --- a/system/setup.py +++ b/system/setup.py @@ -35,7 +35,7 @@ options: description: - path used for local ansible facts (*.fact) - files in this dir will be run (if executable) and their results be added to ansible_local facts - if a file is not executable it is read. + if a file is not executable it is read. Check notes for Windows options. (from 2.1 on) File/results format can be json or ini-format required: false default: '/etc/ansible/facts.d' @@ -55,11 +55,16 @@ notes: remote systems. (See also M(facter) and M(ohai).) - The filter option filters only the first level subkey below ansible_facts. - If the target host is Windows, you will not currently have the ability to use - C(fact_path) or C(filter) as this is provided by a simpler implementation of the module. - Different facts are returned for Windows hosts. + C(filter) as this is provided by a simpler implementation of the module. + - If the target host is Windows you can now use C(fact_path). Make sure that this path + exists on the target host. Files in this path MUST be PowerShell scripts (*.ps1) and + their output must be formattable in JSON (Ansible will take care of this). Test the + output of your scripts. + This option was added in Ansible 2.1. author: - "Ansible Core Team" - "Michael DeHaan" + - "David O'Brien @david_obrien davidobrien1985" ''' EXAMPLES = """ @@ -74,6 +79,9 @@ ansible all -m setup -a 'filter=facter_*' # Display only facts about certain interfaces. ansible all -m setup -a 'filter=ansible_eth[0-2]' + +# Display facts from Windows hosts with custom facts stored in C(C:\\custom_facts). +ansible windows -m setup -a "fact_path='c:\\custom_facts'" """ diff --git a/windows/setup.ps1 b/windows/setup.ps1 index fcac689b1e7..63e5597d861 100644 --- a/windows/setup.ps1 +++ b/windows/setup.ps1 @@ -17,14 +17,41 @@ # WANT_JSON # POWERSHELL_COMMON -# $params is not currently used in this module -# $params = Parse-Args $args; +# enabled $params (David O'Brien, 06/08/2015) +$params = Parse-Args $args; + + +Function Get-CustomFacts { + [cmdletBinding()] + param ( + [Parameter(mandatory=$false)] + $factpath = $null + ) + + if (-not (Test-Path -Path $factpath)) { + Fail-Json $result "The path $factpath does not exist. Typo?" + } + + $FactsFiles = Get-ChildItem -Path $factpath | Where-Object -FilterScript {($PSItem.PSIsContainer -eq $false) -and ($PSItem.Extension -eq '.ps1')} + + foreach ($FactsFile in $FactsFiles) { + $out = & $($FactsFile.FullName) + Set-Attr $result.ansible_facts "ansible_$(($FactsFile.Name).Split('.')[0])" $out + } +} $result = New-Object psobject @{ ansible_facts = New-Object psobject changed = $false }; +# failifempty = $false is default and thus implied +$factpath = Get-AnsibleParam -obj $params -name fact_path +if ($factpath -ne $null) { + # Get any custom facts + Get-CustomFacts -factpath $factpath +} + $win32_os = Get-CimInstance Win32_OperatingSystem $win32_cs = Get-CimInstance Win32_ComputerSystem $osversion = [Environment]::OSVersion