From f5e89198447cc6dd85ccd58628751d9128a7ed2d Mon Sep 17 00:00:00 2001 From: twangboy Date: Fri, 17 Jun 2016 16:03:01 -0600 Subject: [PATCH] Add repourl option --- bootstrap-salt.ps1 | 246 ++++++++++++++++++++++++++------------------- 1 file changed, 143 insertions(+), 103 deletions(-) diff --git a/bootstrap-salt.ps1 b/bootstrap-salt.ps1 index b97032f..69e6a4d 100644 --- a/bootstrap-salt.ps1 +++ b/bootstrap-salt.ps1 @@ -1,79 +1,91 @@ <# .SYNOPSIS -A simple Powershell script to download and install a salt minion on windows. + A simple Powershell script to download and install a salt minion on windows. .DESCRIPTION -The script will download the official salt package from saltstack. It will install a specific -package version and accept parameters for the master and minion ids. Finally, it can stop and -set the windows service to "manual" for local testing. + The script will download the official salt package from saltstack. It will + install a specific package version and accept parameters for the master and + minion ids. Finally, it can stop and set the windows service to "manual" for + local testing. .EXAMPLE -./bootstrap-salt.ps1 -Runs without any parameters. Uses all the default values/settings. + ./bootstrap-salt.ps1 + Runs without any parameters. Uses all the default values/settings. .EXAMPLE -./bootstrap-salt.ps1 -version 2015.4.1-3 -Specifies a particular version of the installer. + ./bootstrap-salt.ps1 -version 2015.4.1-3 + Specifies a particular version of the installer. .EXAMPLE -./bootstrap-salt.ps1 -runservice false -Specifies the salt-minion service to stop and be set to manual. -Useful for testing locally from the command line with the --local switch + ./bootstrap-salt.ps1 -runservice false + Specifies the salt-minion service to stop and be set to manual. Useful for + testing locally from the command line with the --local switch .EXAMPLE -./bootstrap-salt.ps1 -minion minion-box -master master-box -Specifies the minion and master ids in the minion config. -Defaults to the installer values of host name for the minion id and "salt" for the master. + ./bootstrap-salt.ps1 -minion minion-box -master master-box + Specifies the minion and master ids in the minion config. Defaults to the + installer values of host name for the minion id and "salt" for the master. .EXAMPLE -./bootstrap-salt.ps1 -minion minion-box -master master-box -version 2015.5.2 -runservice false -Specifies all the optional parameters in no particular order. + ./bootstrap-salt.ps1 -minion minion-box -master master-box -version 2015.5.2 -runservice false + Specifies all the optional parameters in no particular order. -.PARAMETER version - Default version defined in this script. +.PARAMETER version + Default version defined in this script. -.PARAMETER runservice - Boolean flag to stop the windows service and set to "manual". - Installer starts it by default. +.PARAMETER runservice + Boolean flag to start or stop the minion service. True will start the minion + service. False will stop the minion service and set it to "manual". The + installer starts it by default. -.PARAMETER minion - Name of the minion being installed on this host. - Installer defaults to the host name. +.PARAMETER minion + Name of the minion being installed on this host. Installer defaults to the + host name. -.PARAMETER master - Name or IP of the master server the minion. Installer defaults to "salt". +.PARAMETER master + Name or IP of the master server. Installer defaults to "salt". + +.PARAMETER repourl + URL to the windows packages. Default is "http://repo.saltstack.com/windows" .NOTES -All of the parameters are optional. The default should be the latest version. The architecture -is dynamically determined by the script. + All of the parameters are optional. The default should be the latest + version. The architecture is dynamically determined by the script. .LINK -Bootstrap GitHub Project (script home) - https://github.com/saltstack/salt-windows-bootstrap -Original Vagrant Provisioner Project -https://github.com/saltstack/salty-vagrant -Vagrant Project (utilizes this script) - https://github.com/mitchellh/vagrant -SaltStack Download Location - https://repo.saltstack.com/windows/ + Bootstrap GitHub Project (script home) - https://github.com/saltstack/salt-windows-bootstrap + Original Vagrant Provisioner Project -https://github.com/saltstack/salty-vagrant + Vagrant Project (utilizes this script) - https://github.com/mitchellh/vagrant + SaltStack Download Location - https://repo.saltstack.com/windows/ #> -#============================================================================== +#=============================================================================== # Commandlet Binding -#============================================================================== +#=============================================================================== [CmdletBinding()] Param( - [Parameter(Mandatory=$false,ValueFromPipeline=$true)] - # Doesn't support versions prior to "YYYY.M.R-B" - [ValidatePattern('^201\d\.\d{1,2}\.\d{1,2}(\-\d{1})?|(rc\d)$')] - [string]$version = '', - - [Parameter(Mandatory=$false,ValueFromPipeline=$true)] - [ValidateSet("true","false")] - [string]$runservice = "true", + [Parameter(Mandatory=$false,ValueFromPipeline=$true)] + # Doesn't support versions prior to "YYYY.M.R-B" + [ValidatePattern('^201\d\.\d{1,2}\.\d{1,2}(\-\d{1})?|(rc\d)$')] + [string]$version = '', - [Parameter(Mandatory=$false,ValueFromPipeline=$true)] - [string]$minion = "not-specified", - - [Parameter(Mandatory=$false,ValueFromPipeline=$true)] - [string]$master = "not-specified" + [Parameter(Mandatory=$false,ValueFromPipeline=$true)] + [ValidateSet("true","false")] + [string]$runservice = "true", + + [Parameter(Mandatory=$false,ValueFromPipeline=$true)] + [string]$minion = "not-specified", + + [Parameter(Mandatory=$false,ValueFromPipeline=$true)] + [string]$master = "not-specified", + + [Parameter(Mandatory=$false,ValueFromPipeline=$true)] + [string]$repourl= "http://repo.saltstack.com/windows" ) -#============================================================================== +#=============================================================================== # Script Functions -#============================================================================== +#=============================================================================== function Get-IsAdministrator { $Identity = [System.Security.Principal.WindowsIdentity]::GetCurrent() @@ -86,9 +98,9 @@ function Get-IsUacEnabled (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System).EnableLua -ne 0 } -#============================================================================== +#=============================================================================== # Check for Elevated Privileges -#============================================================================== +#=============================================================================== If (!(Get-IsAdministrator)) { If (Get-IsUacEnabled) { # We are not running "as Administrator" - so relaunch as administrator @@ -114,87 +126,106 @@ If (!(Get-IsAdministrator)) { # Exit from the current, unelevated, process Exit - - } Else { + } + Else { Throw "You must be administrator to run this script" } } +#=============================================================================== +# Verify Parameters +#=============================================================================== Write-Verbose "Parameters passed in:" Write-Verbose "version: $version" Write-Verbose "runservice: $runservice" Write-Verbose "master: $master" Write-Verbose "minion: $minion" +Write-Verbose "repourl: $repourl" -If ($runservice.ToLower() -eq "true"){ - Write-Verbose "Windows service will be set to run" - [bool]$runservice = $True +If ($runservice.ToLower() -eq "true") { + Write-Verbose "Windows service will be set to run" + [bool]$runservice = $True } -ElseIf ($runservice.ToLower() -eq "false"){ - Write-Verbose "Windows service will be stopped and set to manual" - [bool]$runservice = $False +ElseIf ($runservice.ToLower() -eq "false") { + Write-Verbose "Windows service will be stopped and set to manual" + [bool]$runservice = $False } Else { - # Param passed in wasn't clear so defaulting to true. - Write-Verbose "Windows service defaulting to run automatically" - [bool]$runservice = $True + # Param passed in wasn't clear so defaulting to true. + Write-Verbose "Windows service defaulting to run automatically" + [bool]$runservice = $True } -# Create C:\tmp\ - if Vagrant doesn't upload keys and/or config it might not exist +#=============================================================================== +# Ensure Directories are present, copy Vagrant Configs if found +#=============================================================================== +# Create C:\tmp\ New-Item C:\tmp\ -ItemType directory -Force | Out-Null -# Copy minion keys & config to correct location -New-Item C:\salt\conf\pki\minion\ -ItemType Directory -Force | Out-Null - -# Check if minion keys have been uploaded +# Copy Vagrant Files to their proper location. Vagrant files will be placed +# in C:\tmp +# Check if minion keys have been uploaded, copy to correct location If (Test-Path C:\tmp\minion.pem) { - cp C:\tmp\minion.pem C:\salt\conf\pki\minion\ - cp C:\tmp\minion.pub C:\salt\conf\pki\minion\ + New-Item C:\salt\conf\pki\minion\ -ItemType Directory -Force | Out-Null + # Copy minion keys & config to correct location + cp C:\tmp\minion.pem C:\salt\conf\pki\minion\ + cp C:\tmp\minion.pub C:\salt\conf\pki\minion\ } # Check if minion config has been uploaded # This should be done before the installer is run so that it can be updated with # id: and master: settings when the installer runs If (Test-Path C:\tmp\minion) { - Copy-Item -Path C:\tmp\minion -Destination C:\salt\conf\ -Force | Out-Null + New-Item C:\salt\conf\ -ItemType Directory -Force | Out-Null + Copy-Item -Path C:\tmp\minion -Destination C:\salt\conf\ -Force | Out-Null } +#=============================================================================== # Detect architecture +#=============================================================================== If ([IntPtr]::Size -eq 4) { - $arch = "x86" -} Else { - $arch = "AMD64" + $arch = "x86" +} +Else { + $arch = "AMD64" } +#=============================================================================== +# Figure out the latest version if no version is passed +#=============================================================================== # If version isn't supplied, use latest. -if (!$version) { - # Find latest version of Salt Minion - $repo = Invoke-Restmethod 'http://repo.saltstack.com/windows/' +If (!$version) { + # Find latest version of Salt Minion + $repo = Invoke-Restmethod "$repourl" $regex = "<\s*a\s*[^>]*?href\s*=\s*[`"']*([^`"'>]+)[^>]*?>" $returnMatches = New-Object System.Collections.ArrayList $resultingMatches = [Regex]::Matches($repo, $regex, "IgnoreCase") - foreach($match in $resultingMatches) - { + foreach($match in $resultingMatches) { $cleanedMatch = $match.Groups[1].Value.Trim() [void] $returnMatches.Add($cleanedMatch) - } - if ($arch -eq 'x86') {$returnMatches = $returnMatches | Where {$_ -like "Salt-Minion*x86-Setup.exe"}} - else {$returnMatches = $returnMatches | Where {$_ -like "Salt-Minion*AMD64-Setup.exe"}} + } + If ($arch -eq 'x86') { + $returnMatches = $returnMatches | Where {$_ -like "Salt-Minion*x86-Setup.exe"} + } + Else { + $returnMatches = $returnMatches | Where {$_ -like "Salt-Minion*AMD64-Setup.exe"} + } - $version = $(($returnMatches | Sort-Object -Descending)[0]).Split(("n-","-A","-x"),([System.StringSplitOptions]::RemoveEmptyEntries))[1] + $version = $(($returnMatches | Sort-Object -Descending)[0]).Split(("n-","-A","-x"),([System.StringSplitOptions]::RemoveEmptyEntries))[1] } +#=============================================================================== # Download minion setup file +#=============================================================================== Write-Output "Downloading Salt minion installer Salt-Minion-$version-$arch-Setup.exe" $webclient = New-Object System.Net.WebClient -$url = "https://repo.saltstack.com/windows/Salt-Minion-$version-$arch-Setup.exe" +$url = "$repourl/Salt-Minion-$version-$arch-Setup.exe" $file = "C:\tmp\salt.exe" $webclient.DownloadFile($url, $file) -# Install minion silently -Write-Output "Installing Salt minion" - +#=============================================================================== # Set the parameters for the installer +#=============================================================================== # Unless specified, use the installer defaults # - id: # - master: salt @@ -204,10 +235,16 @@ If($minion -ne "not-specified") {$parameters = "/minion-name=$minion"} If($master -ne "not-specified") {$parameters = "$parameters /master=$master"} If($runservice -eq $false) {$parameters = "$parameters /start-service=0"} +#=============================================================================== +# Install minion silently +#=============================================================================== #Wait for process to exit before continuing. +Write-Output "Installing Salt minion" Start-Process C:\tmp\salt.exe -ArgumentList "/S $parameters" -Wait -NoNewWindow -PassThru | Out-Null - +#=============================================================================== +# Configure the minion service +#=============================================================================== # Wait for salt-minion service to be registered before trying to start it $service = Get-Service salt-minion -ErrorAction SilentlyContinue While (!$service) { @@ -216,30 +253,33 @@ While (!$service) { } If($runservice) { - # Start service - Start-Service -Name "salt-minion" -ErrorAction SilentlyContinue - - # Check if service is started, otherwise retry starting the - # service 4 times. - $try = 0 - While (($service.Status -ne "Running") -and ($try -ne 4)) { + # Start service Start-Service -Name "salt-minion" -ErrorAction SilentlyContinue - $service = Get-Service salt-minion -ErrorAction SilentlyContinue - Start-Sleep -s 2 - $try += 1 - } - # If the salt-minion service is still not running, something probably - # went wrong and user intervention is required - report failure. - If ($service.Status -eq "Stopped") { - Write-Output -NoNewline "Failed to start salt minion" - exit 1 - } + # Check if service is started, otherwise retry starting the + # service 4 times. + $try = 0 + While (($service.Status -ne "Running") -and ($try -ne 4)) { + Start-Service -Name "salt-minion" -ErrorAction SilentlyContinue + $service = Get-Service salt-minion -ErrorAction SilentlyContinue + Start-Sleep -s 2 + $try += 1 + } + + # If the salt-minion service is still not running, something probably + # went wrong and user intervention is required - report failure. + If ($service.Status -eq "Stopped") { + Write-Output -NoNewline "Failed to start salt minion" + exit 1 + } } Else { - Write-Output -NoNewline "Stopping salt minion and setting it to 'Manual'" - Set-Service "salt-minion" -StartupType "Manual" - Stop-Service "salt-minion" + Write-Output -NoNewline "Stopping salt minion and setting it to 'Manual'" + Set-Service "salt-minion" -StartupType "Manual" + Stop-Service "salt-minion" } +#=============================================================================== +# Script Complete +#=============================================================================== Write-Output "Salt minion successfully installed"