The Consul Hashicorp DNS service is a frequently used and modern service. Enclosed you will find a Powershell Script to install the Consul-Client as a Windows-Service. The script also allows you to run a version update.
When using the script you have to adjust the variables in line 1-13. For the update only the version number has to be adjusted, which is based on https://releases.hashicorp.com/consul/.
The script creates and updates the following config Files:
\config\consul.hcl
\config\node_exporter.json
If you don’t need this, you can comment it out of the script yourself.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
#Install/Update Consul Service #21.09.2020 by J.Kühnis #Consul Version based on https://releases.hashicorp.com/consul $CONSUL_VERSION = '1.7.5' $CONSUL_URL = 'https://releases.hashicorp.com/consul' $CONSUL_DIR = "$env:SystemDrive\Consul" $consulfqdn = "fqdn.consul.server.company.example" $domainfqdn = "fqdn.server.company.example" # Load DatacenterLoc from Webrequest [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $DatacenterLoc = (Invoke-WebRequest "http://fqdn.consul.server.company.example:8500/v1/kv/config/datacenter?raw=true" -UseBasicParsing).Content #Windows Service params $params = @{ Name = "Consul" BinaryPathName = "$CONSUL_DIR\Consul.exe agent -config-dir=$CONSUL_DIR\config -data-dir=$CONSUL_DIR\data" DisplayName = "Consul" StartupType = "Automatic" Description = "Consul Hashicorp DNS Service." } #stop consul service, if exists IF(get-service -Name $params.Name -ErrorAction SilentlyContinue){ Stop-Service -Name $params.Name -Force do { Start-sleep 1 } until((Get-Service -Name $params.name).status -eq 'Stopped') start-sleep 1 } #Create Consul Folder IF(!(Test-Path $CONSUL_DIR)){ New-Item -ItemType Directory $CONSUL_DIR } Set-Location "$CONSUL_DIR" #Create Subdir $arraySubDir = @( "data" "certs" "config") $arraySubDir | %{ IF(!(Test-Path "$CONSUL_DIR\$_")){ New-Item -ItemType Directory "$CONSUL_DIR\$_" } } <# Set Download Proxy, if needed $WebClient = New-Object System.Net.WebClient $WebProxy = New-Object System.Net.WebProxy("http://your.proxy.url",$false) $WebProxy.Credentials = $Credentials $WebClient.Proxy = $WebProxy #> #down $WebClient.DownloadFile("${CONSUL_URL}/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_windows_amd64.zip","$CONSUL_DIR\consul_${CONSUL_VERSION}_windows_amd64.zip") $WebClient.DownloadFile( "${CONSUL_URL}/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_SHA256SUMS","$CONSUL_DIR\consul_${CONSUL_VERSION}_SHA256SUMS") $WebClient.DownloadFile( "${CONSUL_URL}/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_SHA256SUMS.sig","$CONSUL_DIR\consul_${CONSUL_VERSION}_SHA256SUMS.sig") get-content "${CONSUL_DIR}/*SHA256SUMS"| select-string (get-filehash -algorithm SHA256 "${CONSUL_DIR}/consul_${CONSUL_VERSION}_windows_amd64.zip").hash.toLower() #Unzip Download Expand-Archive "${CONSUL_DIR}/consul_${CONSUL_VERSION}_windows_amd64.zip" "$CONSUL_DIR" -Force #Add env var $env:path += ";${CONSUL_DIR}" [Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "Machine") + ";${CONSUL_DIR}", "Machine") #Create/Update ConfigFiles ### Create HCL Config File; consul.hcl ### $hcl_config = "${CONSUL_DIR}\config\consul.hcl" IF(Test-Path $hcl_config){ Remove-Item $hcl_config -Force } New-Item $hcl_config $hcl_filecontent = @( 'datacenter = ' + '"' + $DatacenterLoc + '"' 'retry_join = ["' + $consulfqdn + '"]' 'domain = "' + $domainfqdn + '"' 'acl = {enabled = true, default_policy = "deny", enable_token_persistence = true }' ) Add-Content -Path $hcl_config $hcl_filecontent ### Create node_exporter.json config file ### $json_config = "${CONSUL_DIR}\config\node_exporter.json" IF(Test-Path $json_config){ Remove-Item $json_config -Force } New-Item $json_config $body = [pscustomobject]@{ services= @([ordered]@{ name = "node-exporter" tags = @("monitor") port = 9100 }) } Set-Content $json_config ($body | ConvertTo-Json -Depth 3) #register Consul as a WindowsService IF(!(get-service -Name $params.Name -ErrorAction SilentlyContinue)){ New-Service @params } Start-Service -Name $params.Name |