mirror of
https://github.com/saltstack/salt-bootstrap.git
synced 2025-04-16 09:40:21 +00:00
Add repourl option
This commit is contained in:
parent
0bcd26768d
commit
f5e8919844
1 changed files with 143 additions and 103 deletions
|
@ -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: <hostname>
|
||||
# - 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"
|
||||
|
|
Loading…
Add table
Reference in a new issue