loadbalancerPS.psm1
<#
.Synopsis Supporting function for other cmdlets in module .DESCRIPTION Supporting function for other cmdlets in module #> function Enable-SelfSignedCertificate { [CmdletBinding()] Param() Process { add-type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } "@ $AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12' [System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy -ErrorAction SilentlyContinue } } <# .Synopsis Connects to a loadbalancer.org REST API to drain, halt or online a real server .DESCRIPTION Connects to a loadbalancer.org REST API to drain, halt or online a real server .EXAMPLE Set-LBRealServerState -APIKey 'abc123' -ConnectionURI 'https://lbmaster.domain.local:9443/api/' -Credential (get-credential loadbalancer) -VirtualService https1 -RealServer web01 -Action halt .EXAMPLE $ApiKey = 'abc123' $uri = 'https://lbmaster.domain.local:9443/api/' $cred = New-Object System.Management.Automation.PSCredential -ArgumentList 'loadbalancer', (ConvertTo-SecureString -AsPlainText 'loadbalancer' -Force) Set-LBRealServerState -APIKey $ApiKey -ConnectionURI $uri -Credential $cred -VirtualService https1 -RealServer web01 -Action halt .EXAMPLE Set-LBRealServerState -APIKey 'abc123' -ConnectionURI 'https://lbmaster.domain.local:9443/api/' -Credential (get-credential loadbalancer) -VirtualService https1 -RealServer web01 -Action online #> function Set-LBRealServerState { [CmdletBinding()] [Alias()] [OutputType([int])] Param ( # API Key [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [string]$APIKey, # Connection URI e.g. https://10.0.0.10:9443/api/ [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)] [string]$ConnectionURI, # Virtual Service Name [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=2)] [string]$VirtualService, # Real Server Name [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=3)] [string]$RealServer, # Action: drain, halt or online [validateset('halt','drain', 'online')][Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=4)] [string]$Action, # PSCredential object containing the API username and password, prompts if omitted [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, Position=5)] [pscredential]$Credential=(Get-Credential) ) Begin { Enable-SelfSignedCertificate -ErrorAction SilentlyContinue } Process { Write-Output "Performing action $Action for $realserver in $VirtualService" $payload = @" { "auth": { "apikey": "$apikey" }, "action": [{ "command": "$action" }], "syntax": [{ "vip": "$virtualservice", "rip": "$realserver" }] } "@ $response = Invoke-WebRequest -Uri $uri -Method Post -Body $payload -Credential $credential -UseBasicParsing -ContentType 'application/json' $ss = $response.content.split(',')[3] $ss.split('"')[1] if (($ss.split('"')[1]) -eq 'failed'){ $response.content } } } <# .Synopsis Connects to a loadbalancer.org REST API to restart appliance services .DESCRIPTION Connects to a loadbalancer.org REST API to restart appliance services, must provide service name in lower-case Valid services are: haproxy, ldirectord, pound, stunnel, heartbeat, waf, collectd, firewall .EXAMPLE restart-LBService -APIKey 'abc123' -ConnectionURI 'https://lbmaster.local:9443/api/' -Credential (get-credential loadbalancer) -Service haproxy .EXAMPLE $ApiKey = 'abc123' $uri = 'https://lbmaster.domain.local:9443/api/' $cred = New-Object System.Management.Automation.PSCredential -ArgumentList 'loadbalancer', (ConvertTo-SecureString -AsPlainText 'loadbalancer' -Force) restart-LBService -APIKey $APIKey -ConnectionURI $uri -Credential $cred -Service haproxy #> function Restart-LBService { [CmdletBinding()] [Alias()] [OutputType([int])] Param ( # API Key [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [string]$APIKey, # Connection URI e.g. https://10.0.0.10:9443/api/ [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)] [string]$ConnectionURI, # Service Name [validateset('haproxy','ldirectord', 'pound', 'stunnel','heartbeat', 'waf', 'collectd', 'firewall')][Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=2)] [string]$Service, # PSCredential object containing the API username and password, prompts if omitted [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, Position=5)] [pscredential]$Credential=(Get-Credential) ) Begin { Enable-SelfSignedCertificate -ErrorAction SilentlyContinue } Process { Write-Output "Restarting service $VirtualService" $payload = @" { "auth": { "apikey": "$apikey" }, "action": [{ "command": "restart-$service" }] } "@ $response = Invoke-WebRequest -Uri $uri -Method Post -Body $payload -Credential $credential -UseBasicParsing -ContentType 'application/json' $ss = $response.content.split(',')[1] $ss.split('"')[3] } End { } } <# .Synopsis Connects to a loadbalancer.org REST API to reload appliance services .DESCRIPTION Connects to a loadbalancer.org REST API to reload appliance services, must provide service name in lower-case Valid services are: haproxy, ldirectord, pound, stunnel, heartbeat, waf, collectd, firewall .EXAMPLE reload-LBService -APIKey 'abc123' -ConnectionURI 'https://lbmaster.local:9443/api/' -Credential (get-credential loadbalancer) -Service haproxy .EXAMPLE $ApiKey = 'abc123' $uri = 'https://lbmaster.domain.local:9443/api/' $cred = New-Object System.Management.Automation.PSCredential -ArgumentList 'loadbalancer', (ConvertTo-SecureString -AsPlainText 'loadbalancer' -Force) reload-LBService -APIKey $APIKey -ConnectionURI $uri -Credential $cred -Service haproxy #> function Reload-LBService { [CmdletBinding()] [Alias()] [OutputType([int])] Param ( # API Key [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [string]$APIKey, # Connection URI e.g. https://10.0.0.10:9443/api/ [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)] [string]$ConnectionURI, # Service Name [validateset('haproxy','ldirectord', 'pound', 'stunnel','heartbeat', 'waf', 'collectd', 'firewall')][Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=2)] [string]$Service, # PSCredential object containing the API username and password, prompts if omitted [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, Position=5)] [pscredential]$Credential=(Get-Credential) ) Begin { Enable-SelfSignedCertificate -ErrorAction SilentlyContinue } Process { Write-Output "Reloading service $VirtualService" $payload = @" { "auth": { "apikey": "$apikey" }, "action": [{ "command": "reload-$service" }] } "@ $response = Invoke-WebRequest -Uri $uri -Method Post -Body $payload -Credential $credential -UseBasicParsing -ContentType 'application/json' $ss = $response.content.split(',')[1] $ss.split('"')[3] } End { } } <# .Synopsis Adds a real server to an exisiting VIP .DESCRIPTION Connects to loadbalancer.org appliance API to add a real server to an exisiting VIP .EXAMPLE New-LBRealServer -APIKey 'abc123' -ConnectionURI 'https://lbmaster.domain.local:9443/api/' -Credential (get-credential) -VIPName 'MyWebApp' -RIPName 'Web01' -RIPAddress '10.0.0.11' -Port '80' -Weight '100' .EXAMPLE $ApiKey = 'abc123' $uri = 'https://lbmaster.domain.local:9443/api/' $cred = New-Object System.Management.Automation.PSCredential -ArgumentList 'loadbalancer', (ConvertTo-SecureString -AsPlainText 'loadbalancer' -Force) New-LBRealServer -APIKey $APIKey -ConnectionURI $uri -Credential $cred -VIPName 'MyWebApp' -RIPName 'Web01' -RIPAddress '10.0.0.11' -Port '80' -Weight '100' #> function New-LBRealServer { [CmdletBinding()] [Alias()] [OutputType([int])] Param ( # API Key [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [string]$APIKey, # Connection URI e.g. https://10.0.0.10:9443/api/ [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)] [string]$ConnectionURI, # Name of virtual IP (e.g. 'MyWebApp') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=2)] $VIPName, # Name of Real Server (e.g. 'Web01') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=3)] $RIPName, # Real Sever IP Address (e.g. '10.0.0.11') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=4)] $RIPAddress, # Real Server Port Number (e.g. '80') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=5)] $Port, # Weight of real server (e.g. '100') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=6)] $Weight, # PSCredential object containing the API username and password, prompts if omitted [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, Position=5)] [pscredential]$Credential=(Get-Credential) ) Begin { Enable-SelfSignedCertificate -ErrorAction SilentlyContinue } Process { $payload = @" { "auth": { "apikey": "$apikey" }, "action": [{ "command": "add-rip" }], "syntax": [{ "vip": "$VIPName", "rip": "$RIPName", "ip": "$RIPAddress", "port": "$Port", "weight": "$Weight" }] } "@ $response = Invoke-WebRequest -Uri $uri -Method Post -Body $payload -Credential $credential -UseBasicParsing -ContentType 'application/json' $result = ($response.content.split(',')[3]).split('"')[1] $result if ($result -ne 'completed') {Write-error $response.content} } End { } } <# .Synopsis Removes a real server from an exisiting VIP .DESCRIPTION Connects to loadbalancer.org appliance API to remove a real server from an exisiting VIP .EXAMPLE Remove-LBRealServer -APIKey 'abc123' -ConnectionURI 'https://lbmaster.domain.local:9443/api/' -Credential (get-credential) -VIPName 'MyWebApp' -RIPName 'Web01' .EXAMPLE $ApiKey = 'abc123' $uri = 'https://lbmaster.domain.local:9443/api/' $cred = New-Object System.Management.Automation.PSCredential -ArgumentList 'loadbalancer', (ConvertTo-SecureString -AsPlainText 'loadbalancer' -Force) Remove-LBRealServer -APIKey $APIKey -ConnectionURI $uri -Credential $cred -VIPName 'MyWebApp' -RIPName 'Web01' #> function Remove-LBRealServer { [CmdletBinding()] [Alias()] [OutputType([int])] Param ( # API Key [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [string]$APIKey, # Connection URI e.g. https://10.0.0.10:9443/api/ [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)] [string]$ConnectionURI, # Name of virtual IP (e.g. 'MyWebApp') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=2)] $VIPName, # Name of Real Server (e.g. 'Web01') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=3)] $RIPName, # PSCredential object containing the API username and password, prompts if omitted [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, Position=5)] [pscredential]$Credential=(Get-Credential) ) Begin { Enable-SelfSignedCertificate -ErrorAction SilentlyContinue } Process { $payload = @" { "auth": { "apikey": "$apikey" }, "action": [{ "command": "delete-rip" }], "syntax": [{ "vip": "$VIPName", "rip": "$RIPName" }] } "@ $response = Invoke-WebRequest -Uri $uri -Method Post -Body $payload -Credential $credential -UseBasicParsing -ContentType 'application/json' #$response $result = ($response.content.split(',')[3]).split('"')[1] $result if ($result -ne 'completed') {Write-error $response.content} } End { } } <# .Synopsis Adds a real server to an exisiting VIP .DESCRIPTION Connects to loadbalancer.org appliance API to add a real server to an exisiting VIP .EXAMPLE New-LBLayer4VIP -APIKey 'abc123' -ConnectionURI 'https://lbmaster.domain.local:9443/api/' -Credential (get-credential) -VIPName 'MyWebApp' -VIPAddress '10.0.0.20' -Port '80' -ForwardingMethod 'gate' -Protocol 'tcp' .EXAMPLE $ApiKey = 'abc123' $uri = 'https://lbmaster.domain.local:9443/api/' $cred = New-Object System.Management.Automation.PSCredential -ArgumentList 'loadbalancer', (ConvertTo-SecureString -AsPlainText 'loadbalancer' -Force) New-LBLayer4VIP -APIKey $APIKey -ConnectionURI $uri -Credential $cred -VIPName 'MyWebApp' -VIPAddress '10.0.0.20' -Port '80' -ForwardingMethod 'gate' -Protocol 'tcp' #> function New-LBLayer4VIP { [CmdletBinding()] [Alias()] [OutputType([int])] Param ( # API Key [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [string]$APIKey, # Connection URI e.g. https://10.0.0.10:9443/api/ [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)] [string]$ConnectionURI, # Name of virtual IP (e.g. 'MyWebApp') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=2)] $VIPName, # Address of Virtual IP (e.g. '10.0.0.20') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=3)] $VIPAddress, # VIP Port Number (e.g. '80') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=5)] $Port, # Forwarding Method ('gate', 'masq', 'ipip') [validateset('gate', 'masq', 'ipip')][Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=6)] $ForwardingMethod, # Protocol ('tcp', 'udp') [validateset('tcp', 'udp')][Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=6)] $Protocol, # PSCredential object containing the API username and password, prompts if omitted [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, Position=5)] [pscredential]$Credential=(Get-Credential) ) Begin { Enable-SelfSignedCertificate -ErrorAction SilentlyContinue } Process { $payload = @" { "auth": { "apikey": "$apikey" }, "action": [{ "command": "add-vip" }], "syntax": [{ "layer": "4", "vip": "$VIPName", "ip": "$VIPAddress", "ports": "$Port", "forwarding": "$ForwardingMethod", "protocol": "$Protocol" }] } "@ $response = Invoke-WebRequest -Uri $uri -Method Post -Body $payload -Credential $credential -UseBasicParsing -ContentType 'application/json' $result = ($response.content.split(',')[2]).split('"')[1] $result if ($result -ne 'completed') {Write-error $response.content} } End { } } <# .Synopsis Adds a real server to an exisiting VIP .DESCRIPTION Connects to loadbalancer.org appliance API to add a real server to an exisiting VIP .EXAMPLE New-LBLayer7VIP -APIKey 'abc123' -ConnectionURI 'https://lbmaster.domain.local:9443/api/' -Credential (get-credential) -VIPName 'MyWebApp' -VIPAddress '10.0.0.20' -Port '80' -Mode 'http' .EXAMPLE $ApiKey = 'abc123' $uri = 'https://lbmaster.domain.local:9443/api/' $cred = New-Object System.Management.Automation.PSCredential -ArgumentList 'loadbalancer', (ConvertTo-SecureString -AsPlainText 'loadbalancer' -Force) New-LBLayer7VIP -APIKey $APIKey -ConnectionURI $uri -Credential $cred -VIPName 'MyWebApp' -VIPAddress '10.0.0.20' -Port '80' -Mode 'http' #> function New-LBLayer7VIP { [CmdletBinding()] [Alias()] [OutputType([int])] Param ( # API Key [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [string]$APIKey, # Connection URI e.g. https://10.0.0.10:9443/api/ [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)] [string]$ConnectionURI, # Name of virtual IP (e.g. 'MyWebApp') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=2)] $VIPName, # Address of Virtual IP (e.g. '10.0.0.20') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=3)] $VIPAddress, # VIP Port Number (e.g. '80') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=5)] $Port, # Mode ('http', 'tcp') [validateset('http', 'tcp')][Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=6)] $Mode, # PSCredential object containing the API username and password, prompts if omitted [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, Position=5)] [pscredential]$Credential=(Get-Credential) ) Begin { Enable-SelfSignedCertificate -ErrorAction SilentlyContinue } Process { $payload = @" { "auth": { "apikey": "$apikey" }, "action": [{ "command": "add-vip" }], "syntax": [{ "layer": "7", "vip": "$VIPName", "ip": "$VIPAddress", "ports": "$Port", "mode": "$Mode" }] } "@ $response = Invoke-WebRequest -Uri $uri -Method Post -Body $payload -Credential $credential -UseBasicParsing -ContentType 'application/json' $result = ($response.content.split(',')[2]).split('"')[1] $result if ($result -eq 'completed') {Write-Warning 'You may need to reload haproxy for the changes to take effect'} if ($result -ne 'completed') {Write-error $response.content} } End { } } <# .Synopsis Adds a real server to an exisiting VIP .DESCRIPTION Connects to loadbalancer.org appliance API to add a real server to an exisiting VIP .EXAMPLE Remove-LBVIP -APIKey 'abc123' -ConnectionURI 'https://lbmaster.domain.local:9443/api/' -Credential (get-credential) -VIPName 'MyWebApp' .EXAMPLE $ApiKey = 'abc123' $uri = 'https://lbmaster.domain.local:9443/api/' $cred = New-Object System.Management.Automation.PSCredential -ArgumentList 'loadbalancer', (ConvertTo-SecureString -AsPlainText 'loadbalancer' -Force) Remove-LBVIP -APIKey $APIKey -ConnectionURI $uri -Credential $cred -VIPName 'MyWebApp' #> function Remove-LBVIP { [CmdletBinding()] [Alias()] [OutputType([int])] Param ( # API Key [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [string]$APIKey, # Connection URI e.g. https://10.0.0.10:9443/api/ [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)] [string]$ConnectionURI, # Name of virtual IP (e.g. 'MyWebApp') [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=2)] $VIPName, # PSCredential object containing the API username and password, prompts if omitted [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, Position=5)] [pscredential]$Credential=(Get-Credential) ) Begin { Enable-SelfSignedCertificate -ErrorAction SilentlyContinue } Process { $payload = @" { "auth": { "apikey": "$apikey" }, "action": [{ "command": "delete-vip" }], "syntax": [{ "vip": "$VIPName" }] } "@ $response = Invoke-WebRequest -Uri $uri -Method Post -Body $payload -Credential $credential -UseBasicParsing -ContentType 'application/json' $result = ($response.content.split(',')[2]).split('"')[1] $result if ($result -eq 'completed') {Write-Warning 'You may need to reload haproxy or ldirectord for the changes to take effect'} if ($result -ne 'completed') {Write-error $response.content} } End { } } |