Zabbix API maintenance

Octopus.Script exported 2018-04-11 by dpijl10 belongs to ‘Zabbix’ category.

This step template adds single host on Zabbix maintenance.

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Zabbix Server

zserver

null

Zabbix Username

zuser

null

Zabbix Password

zpass

null

Host

zhost = #{Octopus.Machine.Name}

host in maintenance - single host

action

null

GMT

gmt = 0

This option depends on Zabbix server configuration. If it is not necessary, set GMT=0 (UTC). If UTC+2, insert 2. If UTC-4, insert -4.

Maintenance Period

hours = 4

in hours

ID for maintenance name

number = #{Octopus.Release.Number}

maintenance name: Octo-[number]-[host]

Script body

Steps based on this template will execute the following PowerShell script.

$Zserver="#{zserver}"
$Zuser="#{zuser}"
$Zpassword="#{zpass}"
$Zhost="#{zhost}"
$setgmt=#{gmt}
$hours=#{hours}
$action="#{action}"
$number="#{number}"

[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;

function Get-Auth{
    param(
        $server,
        $user,
        $pass,
        $url
    )
    $body='{"jsonrpc": "2.0", "method": "user.login", "params": {"user": "'+"$user"+'", "password": "'+"$pass"+'"}, "id": 1, "auth": null}'
    try {
        $key=Invoke-WebRequest -Uri "$url" -ContentType application/json-rpc -Body $body -Method Put -UseBasicParsing
        } catch [Exception] {
            Write-Error "Error: cannot connect to zabbix server ($($_.Exception.Message)), check hostname/url! Frequently zabbix is installed on a virtual folder like {hostname}/zabbix, please include the folder into the hostname variable.`r`n" -ErrorAction Stop
        }
    $token=($key.Content | ConvertFrom-Json).result
    return $token
}

function Remove-Maintenance{
    param(
        $srvr,
        $usr,
        $pswd,
        $uri,
        $mname
    )
    $remove='{"jsonrpc": "2.0", "method": "maintenance.get", "params": {"output": "extend", "selectHosts": "extend", "selectTimeperiods": "extend"},"auth": "'+"$auth"+'","id": 1}'

    $maintenace=Invoke-WebRequest -Uri "$uri" -ContentType application/json-rpc -Body $remove -Method Put -UseBasicParsing
    $select= ($maintenace.Content | ConvertFrom-Json).result | where{$_.name -like "$mname"}
    $id=$select.maintenanceid
    if($id){
        Write-Output "Remove maintenance ID: $id"
        $rmv='{"jsonrpc": "2.0", "method": "maintenance.delete", "params": ["'+"$id"+'"], "auth": "'+"$auth"+'","id": 1}'
        $actionremove=Invoke-WebRequest -Uri "$uri" -ContentType application/json-rpc -Body $rmv -Method Put -UseBasicParsing
        $check=(($actionremove.Content | ConvertFrom-Json).result).maintenanceids
        if($check -like $id){
            Write-Output "Maintenance $id removed"
        }
        else{
            Write-Error "Something wrong. Please contact your system administrator"
        }
    }
    else{
        Write-Error "NO Maintenance ID - contact your system administrator"
    }
}

###GLOBAL VARIABLES###
if (!$Zserver.StartsWith("http")) { $Zserver="http://$Zserver" } 
$Zurl="$Zserver/api_jsonrpc.php"
$maintenancename="Octo-$number-$Zhost"

###GET AUTH FROM ZABBIX SERVER###
$auth=Get-Auth -server $Zserver -user $Zuser -pass $Zpassword -url $Zurl
if ($auth -eq $null) { 
    Write-Error "Authentication failure for user $Zuser on server $Zserver!" -ErrorAction Stop 
    exit
}

###GET HOST ID###
$content='{"jsonrpc": "2.0", "method": "host.get", "params": {"output": "extend", "filter": {"host": "'+"$Zhost"+'"}},"auth": "'+"$auth"+'","id": 1}'
$zabbixhost=Invoke-WebRequest -Uri "$Zurl" -ContentType application/json-rpc -Body $content -Method Put -UseBasicParsing
$nameserver=$zabbixhost.Content | ConvertFrom-Json
$hostid=$nameserver.result.hostid
if($hostid){
    Write-Output "Host $Zhost found with ID: $hostid"
}
else{
    Write-Error "Host $Zhost not found, or user not authorized for this host - please contact your system administrator!"
    exit
}

###ADD NEW MAINTENANCE###
if ($action -eq "create"){
    ###REMOVE MAINTENANCE IF ALREADY EXISTS WITH THE SAME NAME###
    $remove='{"jsonrpc": "2.0", "method": "maintenance.get", "params": {"output": "extend", "selectHosts": "extend", "selectTimeperiods": "extend"},"auth": "'+"$auth"+'","id": 1}'
    $maintenace=Invoke-WebRequest -Uri "$Zurl" -ContentType application/json-rpc -Body $remove -Method Put -UseBasicParsing

    $select= ($maintenace.Content | ConvertFrom-Json).result | where{$_.name -like "$maintenancename"}
    if(!$select){
        Write-Output "No maintenance with the same name is already registered"
    }
    else{
        Remove-Maintenance -srvr $Zserver -usr $Zuser -pswd $Zpassword -uri $Zurl -mname $maintenancename
    }

    ###START TO CREATE NEW MAINTENANCE###
    $since=[int][double]::Parse((get-date -UFormat %s))
    $till=0

    ###ATTENTION ON GMT - THIS WORK FOR ITALIAN ZONE AND TAKES DAYLIGHT SAVINGSTIME FROM###
    ###start check your ZABBIX configuration###
    $workdate=(Get-Date)
    if (![int32]::TryParse($setgmt, [ref] $gmt)) { $gmt=([TimeZoneInfo]::Local.BaseUtcOffset).Hours }
    if ($workdate.IsDaylightSavingTime()) { $gmt+=1 }

    $min=$workdate.AddHours(-$gmt).Minute
    $h=$workdate.AddHours(-$gmt).Hour
    $minutetoseconds=$min*=60
    $hourstoseconds=$h*=3600
    $starttime=$minutetoseconds+=$hourstoseconds
    $seconds=$hours*=3600

    $sincesum=$since
    $till=$sincesum+=$seconds
    $since=$since-=(60*60*$gmt)
    $till=$till-=(60*60*$gmt)

    ###stop check your ZABBIX configuration###
    $add='{"jsonrpc": "2.0", "method": "maintenance.create", "params": {"name": "'+"$maintenancename"+'", "active_since": "'+"$since"+'", "active_till": '+"$till"+', "hostids": ["'+$hostid+'"], "timeperiods": [{"timeperiod_type": 0, "start_time": '+$starttime+', "period": '+$seconds+'}]}, "auth": "'+$auth+'", "id": 1}'
    $maintenance=Invoke-WebRequest -Uri "$Zurl" -ContentType application/json-rpc -Body $add -Method Put -UseBasicParsing
    $check=(($maintenance.Content | ConvertFrom-Json).result).maintenanceids
    if($check){
        Write-Output "Maintenance $check created"
    }
    else{
        Write-Error "Something wrong. Please contact your system administrator"
    }
}
else{
    if($action -eq "remove"){
        Remove-Maintenance -srvr $Zserver -usr $Zuser -pswd $Zpassword -uri $Zurl -mname $maintenancename        
    }
    else{
        Write-Error "Action $action not possible"
    }
}

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "2fdc47cd-d120-4919-b0d5-2ed22ca8ff62",
  "Name": "Zabbix API maintenance",
  "Description": "This step template adds single host on Zabbix maintenance.",
  "Version": 12,
  "ExportedAt": "2018-04-11T11:33:40.330Z",
  "ActionType": "Octopus.Script",
  "Author": "dpijl10",
  "Parameters": [
    {
      "Id": "2d679eba-f403-4548-a57d-dacacfb5b299",
      "Name": "zserver",
      "Label": "Zabbix Server",
      "HelpText": null,
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "898bbce8-28d3-43d1-9d19-a659ffce3865",
      "Name": "zuser",
      "Label": "Zabbix Username",
      "HelpText": null,
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "86e4c608-e37f-4a0a-a432-e1c07b8f2b6b",
      "Name": "zpass",
      "Label": "Zabbix Password",
      "HelpText": null,
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      },
      "Links": {}
    },
    {
      "Id": "1f51ac2a-852a-4f88-be40-a1304eb11cb2",
      "Name": "zhost",
      "Label": "Host",
      "HelpText": "host in maintenance - single host",
      "DefaultValue": "#{Octopus.Machine.Name}",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "50e5fbdd-949e-4ce8-8a10-94a403c3fb2d",
      "Name": "action",
      "Label": "",
      "HelpText": null,
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "create|Create maintenance\nremove|Remove maintenance"
      },
      "Links": {}
    },
    {
      "Id": "b1ef0d32-ec8e-44f3-a7f4-a34af6cd252c",
      "Name": "gmt",
      "Label": "GMT",
      "HelpText": "This option depends on Zabbix server configuration.\nIf it is not necessary, set GMT=0 (UTC).\nIf UTC+2, insert 2. If UTC-4, insert -4.",
      "DefaultValue": "0",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "6fa1f56d-b9ee-4830-9e88-a434c6b82774",
      "Name": "hours",
      "Label": "Maintenance Period",
      "HelpText": "in hours",
      "DefaultValue": "4",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "ca825d16-f0ff-4bcc-b0e7-abcde1f2188e",
      "Name": "number",
      "Label": "ID for maintenance name",
      "HelpText": "maintenance name: Octo-[number]-[host]",
      "DefaultValue": "#{Octopus.Release.Number}",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    }
  ],
  "Properties": {
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.ScriptBody": "$Zserver=\"#{zserver}\"\n$Zuser=\"#{zuser}\"\n$Zpassword=\"#{zpass}\"\n$Zhost=\"#{zhost}\"\n$setgmt=#{gmt}\n$hours=#{hours}\n$action=\"#{action}\"\n$number=\"#{number}\"\n\n[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;\n\nfunction Get-Auth{\n    param(\n        $server,\n        $user,\n        $pass,\n        $url\n    )\n    $body='{\"jsonrpc\": \"2.0\", \"method\": \"user.login\", \"params\": {\"user\": \"'+\"$user\"+'\", \"password\": \"'+\"$pass\"+'\"}, \"id\": 1, \"auth\": null}'\n    try {\n        $key=Invoke-WebRequest -Uri \"$url\" -ContentType application/json-rpc -Body $body -Method Put -UseBasicParsing\n        } catch [Exception] {\n            Write-Error \"Error: cannot connect to zabbix server ($($_.Exception.Message)), check hostname/url! Frequently zabbix is installed on a virtual folder like {hostname}/zabbix, please include the folder into the hostname variable.`r`n\" -ErrorAction Stop\n        }\n    $token=($key.Content | ConvertFrom-Json).result\n    return $token\n}\n\nfunction Remove-Maintenance{\n    param(\n        $srvr,\n        $usr,\n        $pswd,\n        $uri,\n        $mname\n    )\n    $remove='{\"jsonrpc\": \"2.0\", \"method\": \"maintenance.get\", \"params\": {\"output\": \"extend\", \"selectHosts\": \"extend\", \"selectTimeperiods\": \"extend\"},\"auth\": \"'+\"$auth\"+'\",\"id\": 1}'\n\n    $maintenace=Invoke-WebRequest -Uri \"$uri\" -ContentType application/json-rpc -Body $remove -Method Put -UseBasicParsing\n    $select= ($maintenace.Content | ConvertFrom-Json).result | where{$_.name -like \"$mname\"}\n    $id=$select.maintenanceid\n    if($id){\n        Write-Output \"Remove maintenance ID: $id\"\n        $rmv='{\"jsonrpc\": \"2.0\", \"method\": \"maintenance.delete\", \"params\": [\"'+\"$id\"+'\"], \"auth\": \"'+\"$auth\"+'\",\"id\": 1}'\n        $actionremove=Invoke-WebRequest -Uri \"$uri\" -ContentType application/json-rpc -Body $rmv -Method Put -UseBasicParsing\n        $check=(($actionremove.Content | ConvertFrom-Json).result).maintenanceids\n        if($check -like $id){\n            Write-Output \"Maintenance $id removed\"\n        }\n        else{\n            Write-Error \"Something wrong. Please contact your system administrator\"\n        }\n    }\n    else{\n        Write-Error \"NO Maintenance ID - contact your system administrator\"\n    }\n}\n\n###GLOBAL VARIABLES###\nif (!$Zserver.StartsWith(\"http\")) { $Zserver=\"http://$Zserver\" } \n$Zurl=\"$Zserver/api_jsonrpc.php\"\n$maintenancename=\"Octo-$number-$Zhost\"\n\n###GET AUTH FROM ZABBIX SERVER###\n$auth=Get-Auth -server $Zserver -user $Zuser -pass $Zpassword -url $Zurl\nif ($auth -eq $null) { \n    Write-Error \"Authentication failure for user $Zuser on server $Zserver!\" -ErrorAction Stop \n    exit\n}\n\n###GET HOST ID###\n$content='{\"jsonrpc\": \"2.0\", \"method\": \"host.get\", \"params\": {\"output\": \"extend\", \"filter\": {\"host\": \"'+\"$Zhost\"+'\"}},\"auth\": \"'+\"$auth\"+'\",\"id\": 1}'\n$zabbixhost=Invoke-WebRequest -Uri \"$Zurl\" -ContentType application/json-rpc -Body $content -Method Put -UseBasicParsing\n$nameserver=$zabbixhost.Content | ConvertFrom-Json\n$hostid=$nameserver.result.hostid\nif($hostid){\n    Write-Output \"Host $Zhost found with ID: $hostid\"\n}\nelse{\n    Write-Error \"Host $Zhost not found, or user not authorized for this host - please contact your system administrator!\"\n    exit\n}\n\n###ADD NEW MAINTENANCE###\nif ($action -eq \"create\"){\n    ###REMOVE MAINTENANCE IF ALREADY EXISTS WITH THE SAME NAME###\n    $remove='{\"jsonrpc\": \"2.0\", \"method\": \"maintenance.get\", \"params\": {\"output\": \"extend\", \"selectHosts\": \"extend\", \"selectTimeperiods\": \"extend\"},\"auth\": \"'+\"$auth\"+'\",\"id\": 1}'\n    $maintenace=Invoke-WebRequest -Uri \"$Zurl\" -ContentType application/json-rpc -Body $remove -Method Put -UseBasicParsing\n\n    $select= ($maintenace.Content | ConvertFrom-Json).result | where{$_.name -like \"$maintenancename\"}\n    if(!$select){\n        Write-Output \"No maintenance with the same name is already registered\"\n    }\n    else{\n        Remove-Maintenance -srvr $Zserver -usr $Zuser -pswd $Zpassword -uri $Zurl -mname $maintenancename\n    }\n\n    ###START TO CREATE NEW MAINTENANCE###\n    $since=[int][double]::Parse((get-date -UFormat %s))\n    $till=0\n\n    ###ATTENTION ON GMT - THIS WORK FOR ITALIAN ZONE AND TAKES DAYLIGHT SAVINGSTIME FROM###\n    ###start check your ZABBIX configuration###\n    $workdate=(Get-Date)\n    if (![int32]::TryParse($setgmt, [ref] $gmt)) { $gmt=([TimeZoneInfo]::Local.BaseUtcOffset).Hours }\n    if ($workdate.IsDaylightSavingTime()) { $gmt+=1 }\n\n    $min=$workdate.AddHours(-$gmt).Minute\n    $h=$workdate.AddHours(-$gmt).Hour\n    $minutetoseconds=$min*=60\n    $hourstoseconds=$h*=3600\n    $starttime=$minutetoseconds+=$hourstoseconds\n    $seconds=$hours*=3600\n\n    $sincesum=$since\n    $till=$sincesum+=$seconds\n    $since=$since-=(60*60*$gmt)\n    $till=$till-=(60*60*$gmt)\n\n    ###stop check your ZABBIX configuration###\n    $add='{\"jsonrpc\": \"2.0\", \"method\": \"maintenance.create\", \"params\": {\"name\": \"'+\"$maintenancename\"+'\", \"active_since\": \"'+\"$since\"+'\", \"active_till\": '+\"$till\"+', \"hostids\": [\"'+$hostid+'\"], \"timeperiods\": [{\"timeperiod_type\": 0, \"start_time\": '+$starttime+', \"period\": '+$seconds+'}]}, \"auth\": \"'+$auth+'\", \"id\": 1}'\n    $maintenance=Invoke-WebRequest -Uri \"$Zurl\" -ContentType application/json-rpc -Body $add -Method Put -UseBasicParsing\n    $check=(($maintenance.Content | ConvertFrom-Json).result).maintenanceids\n    if($check){\n        Write-Output \"Maintenance $check created\"\n    }\n    else{\n        Write-Error \"Something wrong. Please contact your system administrator\"\n    }\n}\nelse{\n    if($action -eq \"remove\"){\n        Remove-Maintenance -srvr $Zserver -usr $Zuser -pswd $Zpassword -uri $Zurl -mname $maintenancename        \n    }\n    else{\n        Write-Error \"Action $action not possible\"\n    }\n}"
  },
  "Category": "Zabbix",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/zabbix-node-api-maintenance.json",
  "Website": "/step-templates/2fdc47cd-d120-4919-b0d5-2ed22ca8ff62",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Wednesday, April 11, 2018