239 lines
7.1 KiB
PowerShell
Executable File
239 lines
7.1 KiB
PowerShell
Executable File
param(
|
|
[string]$nomad_sha,
|
|
[string]$nomad_version,
|
|
[string]$nomad_binary,
|
|
[switch]$enterprise = $false,
|
|
[switch]$nomad_acls = $false,
|
|
[string]$config_profile,
|
|
[string]$role,
|
|
[string]$index,
|
|
[switch]$nostart = $false
|
|
)
|
|
|
|
Set-StrictMode -Version latest
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
$usage = @"
|
|
Usage: provision.ps1 [options...]
|
|
Options (use one of the following):
|
|
-nomad_sha SHA full git sha to install from S3
|
|
-nomad_version VERSION release version number (ex. 0.12.4+ent)
|
|
-nomad_binary FILEPATH path to file on host
|
|
|
|
Options for configuration:
|
|
-config_profile FILEPATH path to config profile directory
|
|
-role ROLE role within config profile directory
|
|
-index INDEX count of instance, for profiles with per-instance config
|
|
-nostart do not start or restart Nomad
|
|
-enterprise if nomad_sha is passed, use the ENT version
|
|
|
|
"@
|
|
|
|
$RunningAsAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
|
|
if (!$RunningAsAdmin) {
|
|
Write-Error "Must be executed in Administrator level shell."
|
|
exit 1
|
|
}
|
|
|
|
# Force TLS1.2
|
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
|
|
|
|
|
$install_path = "C:\opt\nomad.exe"
|
|
$platform = "windows_amd64"
|
|
|
|
Set-Location C:\opt
|
|
|
|
function Usage {
|
|
Write-Output "${usage}"
|
|
}
|
|
|
|
function InstallFromS3 {
|
|
|
|
Try {
|
|
# check that we don't already have this version
|
|
if (C:\opt\nomad.exe -version `
|
|
| Select-String -Pattern $nomad_sha -SimpleMatch -Quiet) {
|
|
Write-Output "${nomad_sha} already installed"
|
|
return
|
|
}
|
|
} Catch {
|
|
Write-Output "${nomad_sha} not previously installed"
|
|
}
|
|
|
|
Stop-Service -Name nomad -ErrorAction Ignore
|
|
|
|
$build_folder = "builds-oss"
|
|
if ($enterprise) {
|
|
$build_folder = "builds-ent"
|
|
}
|
|
$key = "${build_folder}/nomad_${platform}_${nomad_sha}.zip"
|
|
|
|
Write-Output "Downloading Nomad from s3: $key"
|
|
Try {
|
|
Remove-Item -Path ./nomad.zip -Force -ErrorAction Ignore
|
|
Read-S3Object -BucketName nomad-team-dev-test-binaries `
|
|
-Key $key -File ./nomad.zip -ErrorAction Stop
|
|
|
|
Remove-Item -Path $install_path -Force -ErrorAction Stop
|
|
Expand-Archive ./nomad.zip ./ -Force -ErrorAction Stop
|
|
Move-Item `
|
|
-Path .\pkg\windows_amd64\nomad.exe `
|
|
-Destination $install_path -Force -ErrorAction Stop
|
|
Remove-Item -Path nomad.zip -Force -ErrorAction Ignore
|
|
|
|
New-Item -ItemType Directory -Force -Path C:\opt\nomad.d -ErrorAction Stop
|
|
New-Item -ItemType Directory -Force -Path C:\opt\nomad -ErrorAction Stop
|
|
} Catch {
|
|
Write-Output "Failed to install Nomad."
|
|
Write-Output $_
|
|
Write-Host $_.ScriptStackTrace
|
|
$host.SetShouldExit(-1)
|
|
throw
|
|
}
|
|
|
|
Write-Output "Installed Nomad."
|
|
}
|
|
|
|
function InstallFromUploadedBinary {
|
|
|
|
Stop-Service -Name nomad -ErrorAction Ignore
|
|
|
|
Try {
|
|
Remove-Item -Path $install_path -Force -ErrorAction Ignore
|
|
Move-Item -Path $nomad_binary -Destination $install_path -Force -ErrorAction Stop
|
|
|
|
New-Item -ItemType Directory -Force -Path C:\opt\nomad.d -ErrorAction Stop
|
|
New-Item -ItemType Directory -Force -Path C:\opt\nomad -ErrorAction Stop
|
|
} Catch {
|
|
Write-Output "Failed to install Nomad."
|
|
Write-Output $_
|
|
$host.SetShouldExit(-1)
|
|
throw
|
|
}
|
|
|
|
Write-Output "Installed Nomad."
|
|
}
|
|
|
|
function InstallFromRelease {
|
|
Try {
|
|
# check that we don't already have this version
|
|
if (C:\opt\nomad.exe -version `
|
|
| Select-String -Pattern $nomad_version -SimpleMatch -Quiet) {
|
|
if (C:\opt\nomad.exe -version `
|
|
| Select-String -Pattern dev -SimpleMatch -Quiet -NotMatch) {
|
|
Write-Output "${nomad_version} already installed"
|
|
return
|
|
}
|
|
}
|
|
} Catch {
|
|
Write-Output "${nomad_version} not previously installed"
|
|
}
|
|
|
|
Stop-Service -Name nomad -ErrorAction Ignore
|
|
|
|
$releases = "https://releases.hashicorp.com"
|
|
$url = "${releases}/nomad/${nomad_version}/nomad_${nomad_version}_${platform}.zip"
|
|
|
|
Write-Output "Downloading Nomad from: $url"
|
|
Try {
|
|
Remove-Item -Path ./nomad.zip -Force -ErrorAction Ignore
|
|
Invoke-WebRequest -Uri $url -Outfile nomad.zip -ErrorAction Stop
|
|
|
|
Remove-Item -Path $install_path -Force -ErrorAction Ignore
|
|
Expand-Archive .\nomad.zip .\ -ErrorAction Stop
|
|
Remove-Item -Path nomad.zip -Force -ErrorAction Ignore
|
|
|
|
New-Item -ItemType Directory -Force -Path C:\opt\nomad.d -ErrorAction Stop
|
|
New-Item -ItemType Directory -Force -Path C:\opt\nomad -ErrorAction Stop
|
|
} Catch {
|
|
Write-Output "Failed to install Nomad."
|
|
Write-Output $_
|
|
$host.SetShouldExit(-1)
|
|
throw
|
|
}
|
|
|
|
Write-Output "Installed Nomad."
|
|
}
|
|
|
|
|
|
function ConfigFiles($src, $dest) {
|
|
Get-ChildItem -Path "$src" -Name -Attributes !Directory -ErrorAction Ignore`
|
|
| ForEach-Object { `
|
|
New-Item -ItemType SymbolicLink -Path "${dest}\$_" -Target "${src}\$_" }
|
|
}
|
|
|
|
function InstallConfigProfile {
|
|
|
|
if ( Test-Path -Path 'C:\tmp\custom' -PathType Container ) {
|
|
Remote-Item 'C:\opt\config\custom' -Force -ErrorAction Ignore
|
|
Move-Item -Path 'C:\tmp\custom' -Destination 'C:\opt\config\custom' -Force
|
|
}
|
|
|
|
$cfg = "C:\opt\config\${config_profile}"
|
|
|
|
Remove-Item "C:\opt\nomad.d\*" -Force -ErrorAction Ignore
|
|
Remove-Item "C:\opt\consul.d\*" -Force -ErrorAction Ignore
|
|
|
|
ConfigFiles "${cfg}\nomad" "C:\opt\nomad.d"
|
|
ConfigFiles "${cfg}\consul" "C:\opt\consul.d"
|
|
|
|
if ( "" -ne $role ) {
|
|
ConfigFiles "${cfg}\nomad\${role}" "C:\opt\nomad.d"
|
|
ConfigFiles "${cfg}\consul\${role}" "C:\opt\consul.d"
|
|
}
|
|
|
|
if ( "" -ne $index ) {
|
|
ConfigFiles "${cfg}\nomad\${role}\indexed\*${index}*" "C:\opt\nomad.d"
|
|
ConfigFiles "${cfg}\consul\${role}\indexed\*${index}*" "C:\opt\consul.d"
|
|
}
|
|
}
|
|
|
|
function CreateConsulService {
|
|
New-Service `
|
|
-Name "Consul" `
|
|
-BinaryPathName "C:\opt\consul.exe agent -config-dir C:\opt\consul.d" `
|
|
-StartupType "Automatic" `
|
|
-ErrorAction Ignore
|
|
}
|
|
|
|
function CreateNomadService {
|
|
New-NetFirewallRule `
|
|
-DisplayName 'Nomad HTTP Inbound' `
|
|
-Profile @('Public', 'Domain', 'Private') `
|
|
-Direction Inbound `
|
|
-Action Allow `
|
|
-Protocol TCP `
|
|
-LocalPort @('4646')
|
|
|
|
# idempotently enable as a service
|
|
New-Service `
|
|
-Name "Nomad" `
|
|
-BinaryPathName "C:\opt\nomad.exe agent -config C:\opt\nomad.d" `
|
|
-StartupType "Automatic" `
|
|
-ErrorAction Ignore
|
|
}
|
|
|
|
if ( "" -ne $nomad_sha ) {
|
|
InstallFromS3
|
|
CreateNomadService
|
|
}
|
|
if ( "" -ne $nomad_version ) {
|
|
InstallFromRelease
|
|
CreateNomadService
|
|
}
|
|
if ( "" -ne $nomad_binary ) {
|
|
InstallFromUploadedBinary
|
|
CreateNomadService
|
|
}
|
|
if ( "" -ne $config_profile) {
|
|
InstallConfigProfile
|
|
}
|
|
|
|
if (!($nostart)) {
|
|
CreateConsulService
|
|
CreateNomadService
|
|
Restart-Service "Consul"
|
|
Restart-Service "Nomad"
|
|
}
|