通过 API 创建工单


➡️ 使用 REST API 自动创建 iTop 工单

本指南演示如何通过 REST/JSON API 自动创建 iTop 工单,适用于监控告警自动转工单、邮件转工单等场景。

概述

本页包含各种语言的示例脚本,用于从命令行在 iTop 中创建工单。这些脚本使用 iTop 的 REST/JSON API 在远程 iTop 服务器上创建工单(脚本必须通过 http/https 访问 iTop)。这些脚本旨在与 Nagios 一起使用,因为它们需要 4 个参数:host、service、service_status 和 service_state_type,但唯一有意义的参数是 host,并且调整脚本以满足您的特定需求非常容易。

选择您最喜欢的脚本语言,不要犹豫定制它。

使用 PHP

本节提供了一个用 PHP 脚本语言编写的示例脚本,用于在(远程)iTop 中使用 REST/JSON Web 服务创建工单。为了简化此示例,仅执行了最少的参数验证和返回状态验证。

要求:带有 cURL 模块的 PHP。

限制:Nagios 中的 “host” 值必须对应于 iTop 中唯一的 FunctionalCI。

以下 PHP 脚本创建一个 UserRequest 工单(您可以将配置更改为创建 Incident 或 Change),并将提供的 host(= FunctionalCI)附加到它。工单在与 host 相同的组织中创建。

#!/usr/bin/php
<?php
// Configuration
$ITOP_URL = 'https://demo.combodo.com/simple';
$ITOP_USER = 'admin';
$ITOP_PWD = 'admin';
$TICKET_CLASS = 'UserRequest';
$TITLE = 'Service Down on %1$s';
$DESCRIPTION = 'The Service "%2$s" is down on "%1$s"';
$COMMENT = 'Created from PHP';
 
if ($argc != 5)
{
        echo "Usage: {$argv[0]} <host> <service> <service_status> <service_state_type>\n";
        exit;
}
$host = $argv[1];
$service = $argv[2];
$service_status = $argv[3];
$service_state_type = $argv[4];
$url = $ITOP_URL.'/webservices/rest.php?version=1.0';
 
if (($service_status != "OK") && ($service_status != "UP") && ($service_state_type == "HARD"))
{
        $payload = array(
                        'operation' => 'core/create',
                        'class' => $TICKET_CLASS,
                        'fields' => array(
                                        'org_id' => sprintf('SELECT Organization AS O JOIN FunctionalCI AS CI ON CI.org_id = O.id WHERE CI.name="%1$s"', $host),
                                        'title' => sprintf($TITLE, $host, $service),
                                        'description' => sprintf($DESCRIPTION, $host, $service),
                                        'functionalcis_list' => array(
                                                array('functionalci_id' => sprintf("SELECT FunctionalCI WHERE name='%s'", $host), 'impact_code' => 'manual'),       
                                        ),
                        ),
                        'comment' => $COMMENT,
                        'output_fields' => 'id',
        );
 
        $data = array(
                        'auth_user' => $ITOP_USER,
                        'auth_pwd' => $ITOP_PWD,
                        'json_data' => json_encode($payload)
        );
 
        $options = array(
                        CURLOPT_POST                    => count($data),
                        CURLOPT_POSTFIELDS              => http_build_query($data),
                        // Various options...
                        CURLOPT_RETURNTRANSFER  => true,     // return the content of the request
                        CURLOPT_HEADER                  => false,    // don't return the headers in the output
                        CURLOPT_FOLLOWLOCATION  => true,     // follow redirects
                        CURLOPT_ENCODING                => "",       // handle all encodings
                        CURLOPT_AUTOREFERER             => true,     // set referer on redirect
                        CURLOPT_CONNECTTIMEOUT  => 120,      // timeout on connect
                        CURLOPT_TIMEOUT                 => 120,      // timeout on response
                        // Disabling SSL verification
                        CURLOPT_SSL_VERIFYPEER  => false,    // Disable SSL certificate validation
                        CURLOPT_SSL_VERIFYHOST  => false,  // Disable host vs certificate validation
        );
 
        $handle = curl_init($url);
        curl_setopt_array($handle, $options);
        $response = curl_exec($handle);
        $errno = curl_errno($handle);
        $error_message = curl_error($handle);
        curl_close($handle);
 
        if ($errno !== 0)
        {
                echo "Problem opening URL: $url, $error_message\n";
                exit;
        }
        $decoded_response = json_decode($response, true);
        if ($decoded_response === false)
        {
                echo "Error: ".print_r($response, true)."\n";
        }
        else if ($decoded_response['code'] != 0)
        {
                echo $decoded_response['message']."\n";
        }
        else
        {
                echo "Ticket created.\n";
        }
}
else
{
        echo "Service state type !='HARD', doing nothing.\n";
}

用法

create-ticket.php <host> <service> <service_status> <service_state_type>

配置

编辑脚本开头的以下行(在脚本开头)以根据您的环境进行调整:

// Configuration
$ITOP_URL = 'https://demo.combodo.com/simple';
$ITOP_USER = 'admin';
$ITOP_PWD = 'admin';
$TICKET_CLASS = 'UserRequest';
$TITLE = 'Service Down on %1$s';
$DESCRIPTION = 'The Service "%2$s" is down on "%1$s"';
$COMMENT = 'Created from PHP'

故障排除

您可以通过手动运行脚本来测试工单创建。例如,如果您的 iTop 中存在名为 Server1 的服务器,您可以运行以下命令来创建工单:

create-ticket.php "Server1" "Manual Test" "DOWN" "HARD"

使用 Perl

本节提供了一个用 Perl 脚本语言编写的示例脚本,用于在(远程)iTop 中使用 REST/JSON Web 服务创建工单。为了简化此示例,仅执行了最少的参数验证和返回状态验证。

要求:带有 LWP 和 JSON 模块的 Perl。

限制:Nagios 中的 “host” 值必须对应于 iTop 中唯一的 FunctionalCI。

以下 Perl 脚本创建一个 UserRequest 工单(您可以将配置更改为创建 Incident 或 Change),并将提供的 host(= FunctionalCI)附加到它。工单在与 host 相同的组织中创建。

#!/usr/bin/perl
use strict;
use warnings;
use LWP 5.64;
use JSON;
 
# Default values
my $ITOP_URL = 'https://demo.combodo.com/simple';
my $ITOP_LOGIN = "admin";
my $ITOP_PWD = "admin";
my $TICKET_CLASS = 'UserRequest';
my $DEFAULT_DESCRIPTION = 'Service "%1$s" is down on host "%2$s"';
my $DEFAULT_TITLE = 'Service down on "%1$s"';
my $COMMENT = "Created from $0";
 
# Parameters checking
my ($host, $service, $service_status, $service_state_type) = @ARGV;
if (not defined $host)
{
        die "Parameter 1: 'host' needed.\n";
}
if (not defined $service)
{
        die "Parameter 2: 'service' needed.\n";
}
if (not defined $service_status)
{
        die "Parameter 3: 'service status' needed.\n";
}
if (not defined $service_state_type)
{
        die "Parameter 4: 'service state type' needed.\n";
}
 
if ( ($service_status ne "OK" ) && ( $service_status ne "UP" ) && ( $service_state_type eq "HARD" ))
{
        my $url = "$ITOP_URL/webservices/rest.php?version=1.0";
        my $browser = LWP::UserAgent->new;
        $browser->ssl_opts(verify_hostname => 0, SSL_verify_mode => 0x00);
 
        my %ci_link = ( 'functionalci_id' => "SELECT FunctionalCI WHERE  name='$host'", 'impact_code' => 'manual');
 
        my %fields = (
                'org_id' => "SELECT Organization AS O JOIN FunctionalCI AS CI ON CI.org_id=O.id WHERE CI.name='$host'",
                'title' => sprintf($DEFAULT_TITLE, $host),
                'description' => sprintf($DEFAULT_DESCRIPTION, $service, $host),
                'functionalcis_list' => [ \%ci_link ],
        );
        my %data = (
                'operation' => 'core/create',
                'class' => $TICKET_CLASS,
                'comment' => $COMMENT,
                'output_fields' => 'id',
                'fields' => \%fields,
        );
 
        my $response = $browser->post($url, [
                'auth_user' => $ITOP_LOGIN,
                'auth_pwd' => $ITOP_PWD,
                'json_data' => encode_json \%data,
        ]);
 
        if ($response->is_success)
        {
                my $output = decode_json( $response->decoded_content);  # or whatever
                if ($output->{'code'} != 0)
                {
                        print $output->{'message'}."\n";
                }
                else
                {
                        print "Ticket created.\n";
                }                 
        }
        else
        {
                die $response->status_line;
        }
}
else
{
        print "Service state type !='HARD', doing nothing.\n";
}

用法

create-ticket.pl <host> <service> <service_status> <service_state_type>

配置

编辑脚本开头的以下行(在脚本开头)以根据您的环境进行调整:

# Default values
my $ITOP_URL = 'https://demo.combodo.com/simple';
my $ITOP_LOGIN = "admin";
my $ITOP_PWD = "admin";
my $TICKET_CLASS = 'UserRequest';
my $DEFAULT_DESCRIPTION = 'Service "%1$s" is down on host "%2$s"';
my $DEFAULT_TITLE = 'Service down on "%1$s"';
my $COMMENT = "Created from $0";

故障排除

您可以通过手动运行脚本来测试工单创建。例如,如果您的 iTop 中存在名为 Server1 的服务器,您可以运行以下命令来创建工单:

create-ticket.pl "Server1" "Manual Test" "DOWN" "HARD"

使用 Python

本节提供了一个用 python 脚本语言编写的示例脚本,用于在(远程)iTop 中使用 REST/JSON Web 服务创建工单。为了简化此示例,仅执行了最少的参数验证和返回状态验证。

要求:带有 requests、json 和(显然)sys 包的 python。

限制:Nagios 中的 “host” 值必须对应于 iTop 中唯一的 FunctionalCI。

以下 python 脚本创建一个 UserRequest 工单(您可以将配置更改为创建 Incident 或 Change),并将提供的 host(= FunctionalCI)附加到它。工单在与 host 相同的组织中创建。

#!/usr/bin/python
import requests
import json
import sys
 
ITOP_URL = 'https://demo.combodo.com/simple'
ITOP_USER = 'admin'
ITOP_PWD = 'admin'
TICKET_CLASS = 'UserRequest'
TITLE = 'Service down on %(host)s'
DESCRIPTION = 'The service %(service)s is down on %(host)s'
COMMENT = 'Created from Python'
 
if len(sys.argv) != 5:
        print "Usage: "+sys.argv[0]+" host service service_status service_state_type\n"
        sys.exit()
else:
        print str(sys.argv)
        host = sys.argv[1]
        service = sys.argv[2]
        service_status = sys.argv[3]
        service_state_type = sys.argv[4]
 
if (service_status != "OK") and (service_status != "UP") and (service_state_type == "HARD" ):
        json_data = {
                'operation': 'core/create',
                'class': TICKET_CLASS,
                'fields': {
                        'title': TITLE % {'host': host },
                        'description': DESCRIPTION % {'host': host, 'service': service },
                        'org_id': 'SELECT Organization AS O JOIN FunctionalCI AS CI ON CI.org_id = O.id WHERE CI.name="%(host)s"' % {'host': host},
                        'functionalcis_list': [ {
                                'functionalci_id': "SELECT FunctionalCI WHERE name='%(host)s'" % {'host': host},
                                'impact_code': 'manual',
                        }],
                },
                'comment': COMMENT,
                'output_fields': 'id',
        }
        encoded_data = json.dumps(json_data)
        r = requests.post(ITOP_URL+'/webservices/rest.php?version=1.0', verify=False, data={'auth_user': ITOP_USER , 'auth_pwd': ITOP_PWD , 'json_data': encoded_data})
        result = json.loads(r.text);
        if result['code'] == 0:
                print "Ticket created.\n"
        else:
                print result['message']+"\n"
else:
        print "Service state type !='HARD', doing nothing.\n"

用法

create-ticket.py <host> <service> <service_status> <service_state_type>

配置

编辑脚本开头的以下行以根据您的环境进行调整:

ITOP_URL = 'https://demo.combodo.com/simple'
ITOP_USER = 'admin'
ITOP_PWD = 'admin'
TICKET_CLASS = 'UserRequest'
TITLE = 'Service down on %(host)s'
DESCRIPTION = 'The service %(service)s is down on %(host)s'
COMMENT = 'Created from Python'

故障排除

您可以通过手动运行脚本来测试工单创建。例如,如果您的 iTop 中存在名为 Server1 的服务器,您可以运行以下命令来创建工单:

create-ticket.py "Server1" "Manual Test" "DOWN" "HARD"

使用 bash 和 wget

本节提供了一个用 bash 脚本语言编写的示例脚本,用于在(远程)iTop 中使用 REST/JSON Web 服务创建工单。为了简化此示例,仅执行了最少的参数验证和返回状态验证。

要求:bash 和 wget。

限制:Nagios 中的 “host” 值必须对应于 iTop 中唯一的 FunctionalCI。

以下 bash 脚本创建一个 UserRequest 工单(您可以将配置更改为创建 Incident 或 Change),并将提供的 CI 附加到它。工单在与 CI 相同的组织中创建。

#!/bin/bash
##################################################################################
#                                                                                #
# Example script for creating a UserRequest ticket via the REST/JSON webservices #
#                                                                                #
##################################################################################
 
# iTop location and credentials, change them to suit your iTop installation
ITOP_URL="https://demo.combodo.com/simple"
ITOP_USER="admin"
ITOP_PWD="admin"
 
 
# Parameters checking, see below for default values
if [ "$1" == "" ]; then
        echo "Missing parameter 1: host"
        exit -1
else
        HOST="$1"
fi
 
if [ "$2" == "" ]; then
        echo "Missing parameter 2: Service"
        exit -1
else
        SERVICE="$2"
fi
 
if [ "$3" == "" ]; then
        echo "Missing parameter 3: Service Status"
        exit -1
else
        SERVICE_STATUS="$3"
fi
 
if [ "$4" == "" ]; then
        echo "Missing parameter 4: Service State Type"
        exit -1
else
        SERVICE_STATUS_TYPE="$4"
fi
 
# Default values, adapt them to your configuration
TICKET_CLASS="UserRequest"
ORGANIZATION="SELECT Organization JOIN FunctionalCI AS CI ON CI.org_id=Organization.id WHERE CI.name='"${HOST}"'"
TITLE="Service Down on $1"
DESCRIPTION="The service $SERVICE is in state $SERVICE_STATUS on $HOST"
 
# Let's create the ticket via the REST/JSON API
if [[ ( "$SERVICE_STATUS" != "OK" ) && ( "$SERVICE_STATUS" != "UP" ) && ( "$SERVICE_STATUS_TYPE" == "HARD" ) ]]; then
        CIS_LIST='[{"functionalci_id":"SELECT FunctionalCI WHERE  name=\"'"$1"'\"", "impact_code": "manual"}]'
        JSON_DATA='{"operation":"core/create", "class":"'"${TICKET_CLASS}"'", "fields": {"functionalcis_list":'"${CIS_LIST}"', "org_id":"'"${ORGANIZATION}"'", "title":"'"$TITLE"'", "description":"'"$DESCRIPTION"'"}, "comment": "Created by the Monitoring", "output_fields": "id"}'
 
        RESULT=`wget -q --post-data='auth_user='"${ITOP_USER}"'&auth_pwd='"${ITOP_PWD}"'&json_data='"${JSON_DATA}" --no-check-certificate -O -  "${ITOP_URL}/webservices/rest.php?version=1.0"`
 
        PATTERN='"key":"([0-9])+"'
        if [[ $RESULT =~ $PATTERN ]]; then
                echo "Ticket created successfully"
        else
                echo "ERROR: failed to create ticket"
                echo $RESULT
        fi
else
        echo "Service State Type != HARD, doing nothing"
fi

用法

create-ticket.bash <host> <service> <service_status> <service_state_type>

配置

更改脚本顶部的 3 行以适应您的环境:

ITOP_URL="https://demo.combodo.com/simple"
ITOP_USER="admin"
ITOP_PWD="admin"

然后更改默认值以满足您的需求:

# Default values, adapt them to your configuration
TICKET_CLASS="UserRequest"
ORGANIZATION="SELECT Organization JOIN FunctionalCI AS CI ON CI.org_id=Organization.id WHERE CI.name='"${HOST}"'"
TITLE="Service Down on $1"
DESCRIPTION="The service $SERVICE is in state $SERVICE_STATUS on $HOST"

故障排除

您可以通过手动运行脚本来测试工单创建。例如,如果您的 iTop 中存在名为 Server1 的服务器,您可以运行以下命令来创建工单:

create-ticket.bash "Server1" "Manual Test" "DOWN" "HARD"

使用 bash 和 curl

本节提供了一个用 bash 脚本语言编写的示例脚本,用于在(远程)iTop 中使用 REST/JSON Web 服务更新工单。

复制粘贴此命令作为示例:

curl -X POST -F 'version=1.3' -F 'auth_user=admin' -F 'auth_pwd=admin' http://localhost/itop/webservices/rest.php --form-string 'json_data={"operation":"core/create","comment":"Synchronization from blah...", "class":"UserRequest","output_fields":"id, friendlyname", "fields":{"org_id":"SELECT Organization WHERE id=3", "caller_id":{"name":"monet","first_name":"claude"},"title":"issue blah","description":"something happened"}}'

原文:https://www.itophub.io/wiki/page?id=3_2_0:advancedtopics:create_ticket

2024/09/10 10:25 by127.0.0.1

版本:3_2_0/advancedtopics/create_ticket.txt · Last modified: 2024/09/10 10:25 by 127.0.0.1