在 Oracle Solaris 11 上编译和部署 Nagios

作者:Joseph Balenzano 和 Edward Zhang

如何通过 Oracle Solaris 11 的映像包管理系统和服务管理工具特性仅用一条命令在任意 Oracle Solaris 11 系统上安装 Nagios。


2014 年 8 月发布


简介

Nagios 是一款流行的开源系统、网络和基础架构监视应用。Nagios 为服务器、交换机、应用和服务提供监视和报警服务。

想对本文发表评论吗?请将链接发布在 Facebook 的 OTN Garage 页面上。有类似文章要分享?请将其发布在 Facebook 或 Twitter 上,我们来进行讨论。

本文将引导您完成以下步骤:在 Oracle Solaris 11 系统上从源代码编译 Nagios 4.0.2,为 Nagios 服务创建 Oracle Solaris 服务管理工具清单,并且创建一个 Oracle Solaris 11 映像包管理系统软件包,在任何运行 Oracle Solaris 11 的系统上只需一条 Oracle Solaris 11 命令即可安装。

:系统可以基于 x64,也可以基于 SPARC;这些过程应适用于 Oracle Solaris 11 的所有版本(如 Oracle Solaris 11 和 Oracle Solaris 11.1)。

先决条件

熟悉 Oracle Solaris 11 系统管理(包括映像包管理系统的使用)尤佳。有关详细信息,请参见“另请参见”部分的资源。

任务摘要

本文分为若干不同部分,涵盖许多基本管理任务。每个主要部分都独立于其他部分。

表 1. 任务摘要
主要部分 涵盖主题
编译 Nagios Core - 准备编译过程
- 使用 Oracle Solaris Studio 编译 Nagios
- 使用 GNU 编译器编译 Nagios
- 编译 Nagios 插件
为 Nagios 生成服务管理工具清单 为 Nagios 生成服务管理工具清单
创建软件包清单 - 为 Nagios 生成软件包清单
- 创建元数据软件包
- 生成文件和目录列表
- 计算 Nagios 的依赖关系
发布和安装软件包 - 创建软件包信息库
- 发布软件包
- 安装软件包

编译 Nagios Core

您可以使用 GNU 编译器或 Oracle Solaris Studio 编译 Nagios Core。本文将介绍这两种方法,您可以从中选择一种编译 Nagios Core。

准备编译过程

开始编译 Nagios 之前,我们需要安装一些必需的软件包,并完成编译过程的一些准备工作。

首先,由于 Nagios 各组件需要 PHP 应用,您需要在系统上安装 PHP:

root@solaris:~# pkg install web/php-53 apache-php53

要使用 Nagios 的图表特性,需要 Graphics Draw Library 软件包。如果系统上未安装 Graphics Draw Library,使用以下命令在系统上进行安装:

root@solaris:~# pkg install gd

我们将使用编译器将 Nagios 快速安装到一个 PROTO 区域中。PROTO 区域本质上是文件系统中的一个隔离位置,让您可以轻松地将可执行文件、库、文档和其他随附文件收集到一个软件包中。

下载 Nagios Core 的最新稳定版本。在本文中,我们将使用 4.0.2 版。

解压缩下载的文件,将创建以下目录结构:

root@solaris:~# tar -zxf nagios-4.0.2.tar.gz
root@solaris:~# mv nagios-4.0.2 nagios
root@solaris:~# cd nagios
root@solaris:~/nagios# ls
base            functions       Makefile.in     subst.in
cgi             html            mkpackage       t
Changelog       include         module          t-tap
common          indent-all.sh   nagios.spec     tap
config.guess    indent.sh       OutputTrap.pm   THANKS
config.sub      install-sh      p1.pl           tools
configure       INSTALLING      pkg             update-version
configure.in    LEGAL           pkginfo.in      UPGRADING
contrib         LICENSE         README          xdata
daemon-init.in  make-tarball    sample-config

创建一个 PROTO 区域,用于编译 Nagios:

root@solaris:~/nagios# mkdir ../PROTO

现在选择下面一种方式编译 Nagios Core — 使用 Oracle Solaris Studio 使用 GNU 编译器 (gcc) — 并使用下面的对应过程。Nagios 配置文件将自动检测您使用的是哪个编译器。如果系统上已经安装了 gcc,请使用该方法。

使用 Oracle Solaris Studio 编译 Nagios Core

如果系统上未安装 Oracle Solaris Studio,需要现在安装它。

首先,转至 http://pkg-register.oracle.com/ 获取 Oracle Solaris Studio 证书。选择 Request Certificates 并登录 My Oracle Support 帐户。选择 Oracle Solaris Studio 并单击 Submit。按照说明获取 solarisstudio 发布者的密钥和证书。然后按照网站上的说明或者运行以下命令,设置 solarisstudio 发布者:

root@solaris:~# pkg set-publisher \
            -k /var/pkg/ssl/Oracle_Solaris_Studio.key.pem \
            -c /var/pkg/ssl/Oracle_Solaris_Studio.certificate.pem \
            -G '*' -g https://pkg.oracle.com/solarisstudio/release solarisstudio

设置 solarisstudio 发布者之后,在系统上安装 Oracle Solaris Studio 12.3:

root@solaris:~# pkg install solarisstudio-123

我们将使用 gnu-make 编译 Nagios,因此如果系统上没有 gnu-make,请现在进行安装:

root@solaris:~# pkg install gnu-make

为确保使用 gnu-make 和 Oracle Solaris Studio,请更改编译过程的系统路径:

root@solaris:~# export PATH=$PATH:/usr/gnu/bin:/opt/solarisstudio12.3/bin/

安装了所有必需的软件包之后,我们可以编译 Nagios Core 4.0.2 版了。

Nagios Core 使用标准的 configure 命令检查其环境,因此运行该命令,如清单 1 所示。

root@solaris:~/nagios# ./configure
checking for a BSD-compatible install... /usr/gnu/bin/install -c
checking build system type... sparc-sun-solaris2.11
checking host system type... sparc-sun-solaris2.11
checking for gcc... no
checking for cc... cc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... no
checking whether cc accepts -g... yes
checking for cc option to accept ISO C89... none needed
checking whether make sets $(MAKE)... yes
checking for strip... /usr/bin/strip
....
*** Configuration summary for nagios 4.0.2 11-25-2013 ***:

 General Options:
 -------------------------
        Nagios executable:  nagios
        Nagios user/group:  nagios,nagios
       Command user/group:  nagios,nagios
            Embedded Perl:  no
             Event Broker:  yes
        Install ${prefix}:  /usr/local/nagios
                Lock file:  ${prefix}/var/nagios.lock
   Check result directory:  ${prefix}/var/spool/checkresults
           Init directory:  /etc/init.d
  Apache conf.d directory:  /etc/httpd/conf.d
             Mail program:  /usr/bin/mail
                  Host OS:  solaris2.11
          IOBroker Method:  poll

 Web Interface Options:
 ------------------------
                 HTML URL:  http://localhost/nagios/
                  CGI URL:  http://localhost/nagios/cgi-bin/
 Traceroute (used by WAP):  /usr/sbin/traceroute

清单 1

查看清单 1 所示选项,确保准确性。

编译 Nagios 之前,必须先对源文件进行几处改动,因为该版本 Nagios 定义的一个结构 (struct comment) 与 /usr/include/sys/pwd.h 中的同名系统结构冲突。执行以下步骤修复此问题。

  1. 添加下面的代码行作为 ./worker/ping/worker-ping.c 文件的第 28 行:

    #include <pwd.h>
    
  2. ./include/config.h 文件中,注释掉下面这行代码(第 144 行):

    //#include <pwd.h>
    
  3. ./base/utils.c 文件中更改下面这行代码(第 27 行),原文为:

    #include "../include/comments.h"
    

    更改为:

    #include <pwd.h>
    
  4. ./base/Makefile 文件中更改下面这行代码(第 14 行),原文为:

    CFLAGS=-Wall -I.. -g -DHAVE_CONFIG_H -DNSCORE
    

    更改为:

    CFLAGS=-I.. -g -DHAVE_CONFIG_H -DNSCORE
    
  5. ./cgi/Makefile 文件中更改下面这行代码(第 29 行),原文为:

    CFLAGS=-Wall -I.. -g -O2 -DHAVE_CONFIG_H -DNSCGI
    

    更改为:

    CFLAGS=-I.. -g -O2 -DHAVE_CONFIG_H -DNSCGI -I/usr/include/gd2
    

然后运行以下命令编译 Nagios:

root@solaris:~/nagios# make all
cd ./base && make
make[1]: Entering directory `/root/projectNagios/nagios/base'
make -C ../lib
make[2]: Entering directory `/root/projectNagios/nagios/lib'
cc -g -DHAVE_CONFIG_H -c squeue.c -o squeue.o
cc -g -DHAVE_CONFIG_H -c kvvec.c -o kvvec.o
cc -g -DHAVE_CONFIG_H -c iocache.c -o iocache.o
....

全部编译完成后,使用 make installmake install-commandmodemake install-config 目标通过 DESTDIR 命令行替换,将编译好的二进制文件和示例配置安装到 PROTO 区域中,如清单 2 所示。为了成功完成以上操作,我们需要先创建 nagios 用户和 nagios 组。使用 useradd(1M) 和 groupadd(1M) 命令快速完成此操作,如清单 2 所示。

root@solaris:~/nagios# groupadd nagios
root@solaris:~/nagios# useradd -g nagios nagios
root@solaris:~/nagios# make install DESTDIR=/root/PROTO
cd ./base && make install
make[1]: Entering directory `/root/projectNagios/nagios/base'
make install-basic
make[2]: Entering directory `/root/projectNagios/nagios/base'
/usr/gnu/bin/install -c -m 775 -o nagios -g nagios -d 
/root/PROTO/usr/local/nagios/bin
/usr/gnu/bin/install -c -m 774 -o nagios -g nagios nagios 
/root/PROTO/usr/local/nagios/bin
/usr/gnu/bin/install -c -m 774 -o nagios -g nagios nagiostats 
/root/PROTO/usr/local/nagios/bin
....
  make install-config
     - This installs sample config files in /root/PROTO/usr/local/nagios/etc

make[1]: Leaving directory `/root/projectNagios/nagios'

root@solaris:~/nagios# make install-commandmode DESTDIR=/root/PROTO
/usr/gnu/bin/install -c -m 775 -o nagios -g nagios -d /root/PROTO/usr/local/nagios/var/rw
chmod g+s /root/PROTO/usr/local/nagios/var/rw

*** External command directory configured ***

root@solaris:~/nagios# make install-config DESTDIR=/root/PROTO
/usr/gnu/bin/install -c -m 775 -o nagios -g nagios -d 
/root/PROTO/usr/local/nagios/etc
/usr/gnu/bin/install -c -m 775 -o nagios -g nagios -d 
/root/PROTO/usr/local/nagios/etc/objects
/usr/gnu/bin/install -c -b -m 664 -o nagios -g nagios sample-config/nagios.cfg 
/root/PROTO/usr/local/nagios/etc/nagios.cfg
/usr/gnu/bin/install -c -b -m 664 -o nagios -g nagios sample-config/cgi.cfg 
/root/PROTO/usr/local/nagios/etc/cgi.cfg
....
*** Config files installed ***

Remember, these are *SAMPLE* config files.  You'll need to read
the documentation for more information on how to actually define
services, hosts, etc. to fit your particular needs.

清单 2

现在将以下代码添加到 PROTO/local/nagios/etc/cgi.cfg,以获取正确的 Nagios 授权:
default_user_name=nagiosadmin
authorized_for_system_information=nagiosadmin
authorized_for_system_commands=nagiosadmin
authorized_for_configuration_information=nagiosadmin
authorized_for_all_hosts=nagiosadmin
authorized_for_all_host_commands=nagiosadmin
authorized_for_all_services=nagiosadmin
authorized_for_all_service_commands=nagiosadmin

使用 GNU 编译器编译 Nagios Core

也可以使用 GNU C 编译器 (gcc) 编译 Nagios。如果系统上未安装 gcc,现在请进行安装,如清单 3 所示。

root@solaris:~# pkg search -p gcc

PACKAGE                                                   PUBLISHER
pkg:/developer/gcc-3@3.4.3-0.175.1.0.0.24.0               solaris
pkg:/developer/gcc-45@4.5.2-0.175.1.0.0.24.0              solaris
pkg:/library/gc@7.2-0.175.1.0.0.17.0                      solaris
pkg:/system/library/gcc-3-runtime@3.4.3-0.175.1.0.0.24.0  solaris
pkg:/system/library/gcc-45-runtime@4.5.2-0.175.1.0.0.24.0 solaris

清单 3

您的信息库中可能有多种版本的 gcc,如清单 3 所示。在以下示例中,我们将安装最新版本 4.5.2:

root@solaris:~# pkg install gcc-45

安装完所有必需软件包后,现在可以编译 Nagios 了。我们将使用 Nagios 4.0.2 版。

Nagios 使用标准的 configure 命令检查其环境,因此运行该命令,如清单 4 所示。

root@solaris:~/nagios# ./configure
checking for a BSD-compatible install... /usr/bin/ginstall -c
checking build system type... i386-pc-solaris2.11
checking host system type... i386-pc-solaris2.11
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
....
*** Configuration summary for nagios 4.0.2 11-25-2013 ***:

 General Options:
 -------------------------
        Nagios executable:  nagios
        Nagios user/group:  nagios,nagios
       Command user/group:  nagios,nagios
            Embedded Perl:  no
             Event Broker:  yes
        Install ${prefix}:  /usr/local/nagios
                Lock file:  ${prefix}/var/nagios.lock
   Check result directory:  ${prefix}/var/spool/checkresults
           Init directory:  /etc/init.d
  Apache conf.d directory:  /etc/httpd/conf.d
             Mail program:  /usr/bin/mail
                  Host OS:  solaris2.11
          IOBroker Method:  poll

 Web Interface Options:
 ------------------------
                 HTML URL:  http://localhost/nagios/
                  CGI URL:  http://localhost/nagios/cgi-bin/
 Traceroute (used by WAP):  /usr/sbin/traceroute

清单 4

查看清单 4 所示选项,确保准确性。

开始编译 Nagios 之前,必须先对源文件进行几处改动,因为该版本 Nagios 定义的一个结构 (struct comment) 与 /usr/include/sys/pwd.h 中的同名系统结构冲突。执行以下步骤修复此问题。

  1. 添加下面的代码行作为 ./worker/ping/worker-ping.c 文件的第 28 行:

    #include <pwd.h>
    
  2. ./include/config.h 文件中,注释掉下面这行代码(第 144 行):

    //#include <pwd.h>
    
  3. ./base/utils.c 文件中更改下面这行代码(第 27 行),原文为:

    #include "../include/comments.h"
    

    更改为:

    #include <pwd.h>
    
  4. ./cgi/Makefile 文件中更改下面这行代码(第 29 行),原文为:

    CFLAGS=-Wall -I.. -g -O2 -DHAVE_CONFIG_H -DNSCGI
    

    更改为:

    CFLAGS=-Wall -I.. -g -O2 -DHAVE_CONFIG_H -DNSCGI -I/usr/include/gd2
    

然后运行以下命令编译 Nagios:

root@solaris:~/nagios# gmake all
cd ./base && gmake
gmake[1]: Entering directory `/root/nagios/base'
gcc -Wall -g -O2 -DHAVE_CONFIG_H -DNSCORE   -c -o broker.o broker.c
gcc -Wall -g -O2 -DHAVE_CONFIG_H -DNSCORE   -c -o nebmods.o nebmods.c
gcc -Wall -g -O2 -DHAVE_CONFIG_H -DNSCORE -c -o ../common/shared.o ../common/shared.c
gcc -Wall -g -O2 -DHAVE_CONFIG_H -DNSCORE   -c -o checks.o checks.c
gcc -Wall -g -O2 -DHAVE_CONFIG_H -DNSCORE   -c -o config.o config.c
...

全部编译完成后,使用 gmake installgmake install-commandmodegmake install-config 目标通过 DESTDIR 命令行替换,将编译好的二进制文件和示例配置安装到 PROTO 区域中,如清单 5 所示。为了成功完成以上操作,我们需要先创建 nagios 用户和 nagios 组。使用 useradd(1M) 和 groupadd(1M) 命令快速完成此操作,如清单 5 所示。

root@solaris:~/nagios# groupadd nagios
root@solaris:~/nagios# useradd -g nagios nagios
root@solaris:~/nagios# gmake install DESTDIR=/root/PROTO
cd ./base && gmake install
gmake[1]: Entering directory `/root/nagios/base'
gmake install-basic
gmake[2]: Entering directory `/root/nagios/base'
/usr/bin/ginstall -c -m 775 -o nagios -g nagios -d /root/PROTO/usr/local/nagios/bin
/usr/bin/ginstall -c -m 774 -o nagios -g nagios nagios 
/root/PROTO/usr/local/nagios/bin
/usr/bin/ginstall -c -m 774 -o nagios -g nagios nagiostats 
/root/PROTO/usr/local/nagios/bin
....
make install-config
     - This installs sample config files in /root/PROTO/usr/local/nagios/etc

gmake[1]: Leaving directory `/root/nagios'

root@solaris:~/nagios# gmake install-commandmode DESTDIR=/root/PROTO
/usr/bin/ginstall -c -m 775 -o nagios -g nagios -d 
/root/PROTO/usr/local/nagios/var/rw
chmod g+s /root/PROTO/usr/local/nagios/var/rw

*** External command directory configured ***

root@solaris:~/nagios# gmake install-config DESTDIR=/root/PROTO
/usr/bin/ginstall -c -m 775 -o nagios -g nagios -d /root/PROTO/usr/local/nagios/etc
/usr/bin/ginstall -c -m 775 -o nagios -g nagios -d 
/root/PROTO/usr/local/nagios/etc/objects
/usr/bin/ginstall -c -b -m 664 -o nagios -g nagios sample-config/nagios.cfg 
/root/PROTO/usr/local/nagios/etc/nagios.cfg
/usr/bin/ginstall -c -b -m 664 -o nagios -g nagios sample-config/cgi.cfg 
/root/PROTO/usr/local/nagios/etc/cgi.cfg
....
*** Config files installed ***

Remember, these are *SAMPLE* config files.  You'll need to read the documentation for
more information on how to actually define services, hosts, etc. to fit your 
particular needs.  

清单 5

现在将以下代码添加到 PROTO/local/nagios/etc/cgi.cfg,以获取正确的 Nagios 授权:

default_user_name=nagiosadmin
authorized_for_system_information=nagiosadmin
authorized_for_system_commands=nagiosadmin
authorized_for_configuration_information=nagiosadmin
authorized_for_all_hosts=nagiosadmin
authorized_for_all_host_commands=nagiosadmin
authorized_for_all_services=nagiosadmin
authorized_for_all_service_commands=nagiosadmin

编译 Nagios 插件

下一步是在我们的 /root/PROTO 区域中编译 Nagios 插件。您可以选择为插件创建单独的软件包,但为了简单起见,我们将创建一个包含了 Nagios Core 和插件的软件包。

root@solaris:~# wget https://www.nagios-plugins.org/download/nagios-plugins-1.5.tar.gz
root@solaris:~# tar -zxf nagios-plugins-1.5.tar.gz
root@solaris:~# cd nagios-plugins-1.5

对于这一特定版本的插件,我们必须修改 ./configure 文件,将第 18226 行更改为以下内容:

elif $PATH_TO_SWAP -l 2>/dev/null | egrep -i "^swapfile +dev + swaplo +blocks +free" >/dev/null

然后运行以下命令:

root@solaris: ~/nagios-plugins-1.5# ./configure

现在将插件安装到 PROTO 区域中:

root@solaris: ~/nagios-plugins-1.5# gmake install DESTDIR=/root/PROTO

为 Nagios 生成服务管理工具清单

服务管理工具清单用于描述服务及其配置,以及如何启动和停止。

服务管理工具清单是基于 XML 的文件,通常位于 /lib/svc/manifest 中。虽然可以手动编写服务管理工具清单,但我们将使用 svcbundle(1M) 命令生成一个简单的清单。

svcbundle 命令让管理员可以创建和(可选)安装常见场景的清单或系统配置文件。因此,svcbundle 进行一些简单的假设(手册页中有详细介绍)来处理这些常见场景,包括默认情况下自动启动此服务。我们可按以下方式创建服务管理工具清单:

root@solaris:~# mkdir -p PROTO/lib/svc/manifest/site
root@solaris:~# cd PROTO/lib/svc/manifest/site
root@solaris:~# svcbundle -o nagios.xml \
 -s service-name=application/nagios \
 -s start-method="/usr/local/nagios/bin/nagios  /usr/local/nagios/etc/nagios.cfg"
root@solaris:~# cat nagios.xml
<?xml version="1.0" ?>
<!DOCTYPE service_bundle
  SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<!--
    Manifest created by svcbundle (2014-Feb-01 00:39:14+0000)
-->
<service_bundle type="manifest" name="application/nagios">
   <service version="1" type="service" name="application/nagios">
      <!--
          The following dependency keeps us from starting until the
          multi-user milestone is reached.
      -->
      <dependency restart_on="none" type="service"
          name="multi_user_dependency" grouping="require_all">
          <service_fmri value="svc:/milestone/multi-user"/>
      </dependency>
      <exec_method timeout_seconds="60" type="method" name="start"
          exec="/usr/local/nagios/bin/nagios /usr/local/nagios/etc/nagios.cfg"
        />
        <!--
        The exec attribute below can be changed to a command that SMF
        should execute to stop the service.  See smf_method(5) for more
        details.
        -->
        <exec_method timeout_seconds="60" type="method" name="stop"
            exec=":true"/>
        <!--
        The exec attribute below can be changed to a command that SMF
        should execute when the service is refreshed.  Services are
        typically refreshed when their properties are changed in the
        SMF repository.  See smf_method(5) for more details.  It is
        common to retain the value of :true which means that SMF will
        take no action when the service is refreshed.  Alternatively,
        you may wish to provide a method to reread the SMF repository
        and act on any configuration changes.
        -->
        <exec_method timeout_seconds="60" type="method" name="refresh"
            exec=":true"/>
        <property_group type="framework" name="startd">
            <propval type="astring" name="duration" value="transient"/>
        </property_group>
        <instance enabled="true" name="default"/>
        <template>
            <common_name>
                <loctext xml:lang="C">
                    <!--
                    Replace this comment with a short name for the
                    service.
                    -->
                </loctext>
            </common_name>
            <description>
                <loctext xml:lang="C">
                    <!--
                    Replace this comment with a brief description of
                    the service
                    -->
                </loctext>
            </description>
        </template>
    </service>
</service_bundle>

创建软件包清单

每个软件包背后都有一个软件包清单用于描述软件包的组装方式。它包含软件包名称、版本、软件包依赖关系及文件、目录、链接及其他软件包内容的列表等信息。

为 Nagios 生成软件包清单

我们将需要为 Nagios 软件包创建一个软件包清单,作为将流程发布到信息库的一部分。

您可以使用带 -m 选项的 pkg contents 命令看看一个典型的软件包清单,如下所示:

root@solaris:~/nagios# pkg contents -m gzip
set name=pkg.fmri value=pkg://solaris/compress/gzip@1.4,5.11-0.175.1.0.0.24.0:20120904T170603Z
set name=org.opensolaris.consolidation value=userland
set name=pkg.summary value="GNU Zip (gzip)"
set name=pkg.description value="The GNU Zip (gzip) compression utility"
set name=info.source-url value=ftp://ftp.gnu.org/gnu/gzip/gzip-1.4.tar.gz
set name=info.classification value="org.opensolaris.category.2008:Applications/System Utilities"
set name=info.upstream-url value=http://www.gnu.org/software/gzip/
set name=org.opensolaris.arc-caseid value=PSARC/2000/488
set name=variant.arch value=i386 value=sparc
depend fmri=pkg:/system/library@0.5.11-0.175.1.0.0.23.0 type=require
depend fmri=pkg:/shell/bash@4.1.9-0.175.1.0.0.23.0 type=require
dir group=sys mode=0755 owner=root path=usr
dir group=bin mode=0755 owner=root path=usr/bin
dir group=sys mode=0755 owner=root path=usr/share
....
signature 235c7674d821032ae3eeda280c7837d1f1f4fdb5 algorithm=rsa-sha256 
chain="8e422c1bb80b05f08f7a849f3d7ae90a976e048e 
754665e03bd28ef63b05a416073eb6d649624781" 
chain.chashes="083e40bb50e6964834ebfd3c66b8720b46028068 
f85dabbb0d56b37de3c3de98663dd8f27a12ff8e" chain.csizes="1273 1326" chain.sizes="1773 
2061" chash=05654e46fc5cac3b9b9bd11c39512bc92bc85089 pkg.csize=1281 pkg.size=1753 
value=41df24b2bc4fe0cc705642f7bcad54f8d96017d919865d12da22bbb42ab451b2d1e28c50c0d2b5a
52b1e49e2732aeae9296216a3418c57fab6ed68624d492e68b8f8a4c728ec03f823608c2f95437ced3591
a957fc8c9a69fdbb3e5f0e45cf6a74b9341c97d727a60ef1f8be78a91114e378d84b530ae1b6565e15e06
0802f96fdbbea19823f0e2c8e4dc2e5f6f82c6e9b85362c227704ecefc4460fc56dc947af2d8728231383
78e4c1d224012f135281c567ef854b63cc75b43336142a5db78c0544f3e31cd101a347a55c25b77463431
ce65db04f5821fe9e7d5e27718fb9be71373d110ca8eea4a82b5b3571684a6a182910b87e7f65c22d590a
8e6523f9 version=0

每行定义一个操作 — 是否设置有关软件包的某些元数据(如名称和描述),是否指定在软件包中包含文件和目录。为 Nagios 软件包创建软件包清单时,我们将清单拆分成三个不同的部分。

创建软件包元数据

第一部分是关于如何创建软件包元数据。在 gzip 的软件包清单开头部分,可以看到以下几行:

set name=pkg.fmri value=pkg://solaris/compress/gzip@1.4,5.11-0.175.1.0.0.24.0:20120904T170603Z
set name=org.opensolaris.consolidation value=userland
set name=pkg.summary value="GNU Zip (gzip)"
set name=pkg.description value="The GNU Zip (gzip) compression utility"
set name=info.source-url value=ftp://ftp.gnu.org/gnu/gzip/gzip-1.4.tar.gz
set name=info.classification value="org.opensolaris.category.2008:Applications/System Utilities"
set name=info.upstream-url value=http://www.gnu.org/software/gzip/

我们需要为 Nagios 创建类似的元数据。首先编辑一个名为 nagios.mog 的文件,包括清单 6 所示的以下代码:

set name=pkg.fmri value=nagios@4.0.2,5.11-0
set name=pkg.summary value="Nagios monitoring utility"
set name=pkg.description value="Nagios is a host/service/network monitoring program"
set name=variant.arch value=$(ARCH)

清单 6

我们来快速浏览清单 6 所示的初始清单的各个部分。set 操作表示一种设置软件包属性(如软件包版本、摘要和描述)的方法。将软件包 FMRI(故障管理资源标识符)设置为 nagios@4.0.2,5.11-0,这表示我们在 Oracle Solaris 11 (5.11) 使用 Nagios 4.0.2。变体是映像包管理系统的一个特性,让我们能够将对多个架构的支持打包到一个软件包中(例如,一个软件包同时适用于 SPARC 和 x86)。我们将 variant.arch 设置为一个变量,稍后将替换它。

生成文件和目录列表

下一步是查看我们的 PROTO 目录,生成希望在本软件包中包含的文件和目录列表。幸运的是,我们可以使用 pkgsend(1) generate 命令自动执行大部分任务。我们将通过 pkgfmt(1) 命令以管道方式改进输出,然后将其置入 nagios.p5m.gen 文件中,如清单 7 所示:

执行 Nagios 的 nagios 用户需要对清单 7 中使用 touch(1) 命令创建的文件的读写访问权限。我们将在清单中设置该文件的所有权和权限。

root@solaris:~# touch PROTO/usr/local/nagios/var/rw/nagios.cmd

root@solaris:~# pkgsend generate PROTO | pkgfmt > nagios.p5m.gen
root@solaris:~# cat nagios.p5m.gen   
dir  path=usr owner=root group=bin mode=0755
dir  path=usr/local owner=root group=bin mode=0755
dir  path=usr/local/nagios owner=root group=bin mode=0755
dir  path=usr/local/nagios/bin owner=root group=bin mode=0775
file usr/local/nagios/bin/nagios path=usr/local/nagios/bin/nagios owner=root \
    group=bin mode=0774
file usr/local/nagios/bin/nagiostats path=usr/local/nagios/bin/nagiostats \
    owner=root group=bin mode=0774
dir  path=usr/local/nagios/etc owner=root group=bin mode=0775
....
dir  path=usr/local/nagios/var/archives owner=root group=bin mode=0775
dir  path=usr/local/nagios/var/rw owner=root group=bin mode=0775
file usr/local/nagios/var/rw/nagios.cmd \
    path=usr/local/nagios/var/rw/nagios.cmd owner=root group=bin mode=0644
dir  path=usr/local/nagios/var/spool owner=root group=bin mode=0755
dir  path=usr/local/nagios/var/spool/checkresults owner=root group=bin mode=0775

清单 7

在清单 7 中,我们将看到几个新操作:filedir。这些操作指定软件包内容,以及其用户和组所有权和权限。我们需要修改 /usr/local/nagios/var/usr/local/nagios/var/rw/usr/local/var/spool/checkresults 的用户和组权限以使用 nagios 用户和组。为此,编辑 nagios.p5m.gen 并对其中以粗体突出显示的五行进行以下更改:

file usr/local/nagios/bin/nagios path=usr/local/nagios/bin/nagios owner=nagios group=nagios mode=0774
....
dir  path=usr/local/nagios/var owner=nagios group=nagios mode=0775
dir  path=usr/local/nagios/var/archives owner=root group=root mode=0775
dir  path=usr/local/nagios/var/rw owner=nagios group=nagios mode=0775
file usr/local/nagios/var/rw/nagios.cmd \
    path=usr/local/nagios/var/rw/nagios.cmd owner=nagios group=nagios mode=0663
dir  path=usr/local/nagios/var/spool owner=root group=bin mode=0755
dir  path=usr/local/nagios/var/spool/checkresults owner=nagios group=nagios mode=0775

如果我们计划将 Nagios 安装到 /usr/bin 中,对于 Oracle Solaris 11,较好的打包做法是浏览此列表,查看哪些目录将由 Nagios 安装,哪些是作为默认系统安装的一部分已经提供的。该目录列表可以从软件包清单动态删除,也称为转换。在本例中,我们计划将文件安装到系统已经提供的 /usr 中。因此,我们需要将其从清单中删除。我们可以将下面这行代码添加到 nagios.mog 文件来删除此 dir 操作:

<transform dir path=usr$ -> drop>

我们还要添加四个转换来删除 /lib/lib/svc/lib/svc/manifest/lib/svc/manifest/application,因为这些是系统提供的位置,我们来添加一个新的转换处理本服务管理工具清单,如清单 8 所示:

<transform dir path=lib$ -> drop>
<transform dir path=lib/svc$ -> drop>
<transform dir path=lib/svc/manifest$ -> drop>
<transform dir path=lib/svc/manifest/site$ -> drop>
<transform file path=lib/svc/manifest/.*\.xml$ -> \
    default restart_fmri svc:/system/manifest-import:default>

清单 8

清单 8 中的最后一个转换查找 lib/svc/manifest 目录中任何扩展名为 .xml 的文件,并添加一个执行器 在安装软件包时重新启动 system/manifest-import 服务。这将向服务管理工具服务框架注册我们的 Nagios 服务描述。

现在我们已经有了 nagios.mognagios.p5m.gen,下面使用 pkgmogrify(1) 命令将其合并形成 nagios.p5m.mog。我们还将替换 $(ARCH) 变量中的架构类型,如清单 9 所示:

root@solaris:~# pkgmogrify -DARCH=`uname -p` nagios.p5m.gen nagios.mog | pkgfmt > nagios.p5m.mog
root@solaris:~# cat nagios.p5m.mog
set name=pkg.fmri value=nagios@4.0.2,5.11-0
set name=pkg.summary value="Nagios monitoring utility"
set name=pkg.description \
    value="Nagios is a host/service/network monitoring program"
set name=variant.arch value=sparc
....
dir  path=usr/local/nagios/var owner=nagios group=nagios mode=0775
dir  path=usr/local/nagios/var/archives owner=root group=bin mode=0775
dir  path=usr/local/nagios/var/rw owner=nagios group=nagios mode=0775
file usr/local/nagios/var/rw/nagios.cmd \
    path=usr/local/nagios/var/rw/nagios.cmd owner=nagios group=nagios mode=0663
dir  path=usr/local/nagios/var/spool owner=root group=bin mode=0755
dir  path=usr/local/nagios/var/spool/checkresults owner=nagios group=nagios mode=0775

清单 9

在清单 9 中,您可以看到这两个文件已经合并。注意,现在 variant.arch 的值为 sparc

计算 Nagios 的依赖关系

下一步是生成 Nagios 的软件包依赖关系。映像包管理系统能够扫描软件包内容来尝试检测可能存在的依赖关系。为此,它要检测文件类型 — 文件是脚本还是可执行文件。如果是脚本,映像包管理系统将查看脚本开头的 #! 语句的值,确定脚本是 Perl、Python、Bash 还是其他 shell 脚本。如果文件是可执行文件,映像包管理系统将查看可执行和可链接格式 (ELF) 头,看看成功的运行时执行需要其他哪些库。此过程包括两个步骤,因为我们接下来需要将这些文件依赖关系变成软件包依赖关系。

首先生成 Nagios 拥有的文件依赖关系列表。我们使用 pkgdepend(1) generate 命令并传入本 PROTO 区域的位置,如清单 10 所示:

root@solaris:~# pkgdepend generate -md PROTO nagios.p5m.mog > nagios.p5m.dep
root@solaris:~# tail nagios.p5m.dep
depend fmri=__TBD pkg.debug.depend.file=libc.so.1 pkg.debug.depend.path=lib 
pkg.debug.depend.path=usr/lib pkg.debug.depend.reason=usr/local/nagios/sbin/outages.cgi pkg.debug.depend.type=elf 
type=require
depend fmri=__TBD pkg.debug.depend.file=libsocket.so.1 pkg.debug.depend.path=lib 
pkg.debug.depend.path=usr/lib pkg.debug.depend.reason=usr/local/nagios/sbin/outages.cgi pkg.debug.depend.type=elf 
type=require
depend fmri=__TBD pkg.debug.depend.file=libsocket.so.1 pkg.debug.depend.path=lib 
pkg.debug.depend.path=usr/lib pkg.debug.depend.reason=usr/local/nagios/sbin/status.cgi pkg.debug.depend.type=elf 
type=require
depend fmri=__TBD pkg.debug.depend.file=libc.so.1 pkg.debug.depend.path=lib 
pkg.debug.depend.path=usr/lib pkg.debug.depend.reason=usr/local/nagios/sbin/showlog.cgi pkg.debug.depend.type=elf 
type=require
depend fmri=__TBD pkg.debug.depend.file=libc.so.1 pkg.debug.depend.path=lib 
pkg.debug.depend.path=usr/lib pkg.debug.depend.reason=usr/local/nagios/bin/nagiostats
pkg.debug.depend.type=elf type=require
depend fmri=__TBD pkg.debug.depend.file=libc.so.1 pkg.debug.depend.path=lib 
pkg.debug.depend.path=usr/lib pkg.debug.depend.reason=usr/local/nagios/sbin/config.cgi pkg.debug.depend.type=elf 
type=require
depend fmri=__TBD pkg.debug.depend.file=libsocket.so.1 pkg.debug.depend.path=lib 
pkg.debug.depend.path=usr/lib pkg.debug.depend.reason=usr/local/nagios/bin/nagiostats pkg.debug.depend.type=elf 
type=require
depend fmri=__TBD pkg.debug.depend.file=libm.so.2 pkg.debug.depend.path=lib 
pkg.debug.depend.path=usr/lib pkg.debug.depend.reason=usr/local/nagios/bin/nagiostats
pkg.debug.depend.type=elf type=require
depend fmri=__TBD pkg.debug.depend.file=libsocket.so.1 pkg.debug.depend.path=lib 
pkg.debug.depend.path=usr/lib pkg.debug.depend.reason=usr/local/nagios/sbin/config.cgi pkg.debug.depend.type=elf 
type=require
depend fmri=__TBD pkg.debug.depend.file=libc.so.1 pkg.debug.depend.path=lib 
pkg.debug.depend.path=usr/lib pkg.debug.depend.reason=usr/local/nagios/sbin/cmd.cgi 
pkg.debug.depend.type=elf type=require
...

清单 10

在清单 10 中,我们可以看到已经生成了一些以 depend 操作开头的代码行。如果您仔细查看,可以看到 pkg.debug.depend.file 值为 libc.so.1libsocket.so.1(在输出的行中),这表示对共享对象的依赖关系。我们通过查看 ELF 头即可看到已找到所有依赖关系,还可以通过查看 pkg.debug.depend.reason 值看到导致此依赖关系的文件。

我们现在需要将这些依赖关系解析到其来源软件包中。为此,我们使用 pkgdepend resolve 命令:

root@solaris:~# pkgdepend resolve -m nagios.p5m.dep
root@solaris:~# tail nagios.p5m.dep.res
file usr/local/nagios/share/stylesheets/trends.css 
path=usr/local/nagios/share/stylesheets/trends.css owner=root group=bin mode=0664
dir  path=usr/local/nagios/var owner=nagios group=nagios mode=0775
dir  path=usr/local/nagios/var/archives owner=root group=bin mode=0775
dir  path=usr/local/nagios/var/rw owner=nagios group=nagios mode=0775
file usr/local/nagios/var/rw/nagios.cmd \
    path=usr/local/nagios/var/rw/nagios.cmd owner=nagios group=nagios mode=0663
dir  path=usr/local/nagios/var/spool owner=root group=bin mode=0755
dir  path=usr/local/nagios/var/spool/checkresults owner=nagios group=nagios mode=0775
depend fmri=pkg:/image/library/libjpeg@6.0.2-0.175.0.0.0.0.0 type=require
depend fmri=pkg:/image/library/libpng@1.4.11-0.175.1.0.0.16.0 type=require
depend fmri=pkg:/library/gd@2.0.35-0.175.1.0.0.24.0 type=require
depend fmri=pkg:/library/openldap@2.4.30-0.175.1.14.0.3.0 type=require
depend fmri=pkg:/library/security/openssl@1.0.0.11-0.175.1.7.0.4.0 type=require
depend fmri=pkg:/library/zlib@1.2.3-0.175.1.0.0.24.0 type=require
depend fmri=pkg:/runtime/perl-512@5.12.5-0.175.1.8.0.4.0 type=require
depend fmri=pkg:/shell/ksh93@93.21.0.20110208-0.175.1.15.0.2.0 type=require
depend fmri=pkg:/system/library/math@0.5.11-0.175.1.13.0.4.0 type=require
depend fmri=pkg:/system/library@0.5.11-0.175.1.15.0.4.2 type=require
depend fmri=pkg:/system/linker@0.5.11-0.175.1.13.0.1.2 type=require

pkgdepend 命令不会提取 PHP 的依赖关系和适用于 PHP 的 Apache 模块,因此需要手动添加:

depend fmri=pkg:/web/php-53@5.3.14-0.175.1.0.0.24.0 type=require
depend fmri=pkg:/web/server/apache-22/module/apache-php53@5.3.14-0.175.1.0.0.24.0 type=require

此时,我们需要创建 nagios 用户和组,这是软件包安装的一部分。映像包管理系统有两个可执行该任务的操作。以下两行需要添加到 nagios.p5m.dep.res

group groupname=nagios
user username=nagios group=nagios

现在我们完成了将用于软件包发布的最终软件包清单:nagios.p5m.dep.res

发布和安装软件包

下一步要做的是将编译后的 Nagios 应用和软件包清单发布到软件包信息库。

创建软件包信息库

首先,我们将新建一个 ZFS 数据集来容纳信息库,然后使用 pkgrepo create 命令创建信息库:

root@solaris:~# zfs create rpool/extra-software
root@solaris:~# zfs set mountpoint=/extra-software rpool/extra-software
root@solaris:~# pkgrepo create /extra-software
root@solaris:~# ls /extra-software
pkg5.repository

我们需要使用 pkgrepo set 命令设置此信息库的发布者前缀:

root@solaris:~# pkgrepo -s /extra-software set publisher/prefix=extra-software

如果我们想让此区域/机器成为本地信息库并在其他区域/机器上安装,需要使用以下命令设置信息库服务器:

root@solaris:~# svccfg -s application/pkg/server setprop \ 
pkg/inst_root=/extra-software
root@solaris:~# svccfg -s application/pkg/server setprop pkg/port=9001
root@solaris:~# svccfg -s application/pkg/server setprop \ 
pkg/readonly=false
root@solaris:~# svcadm enable application/pkg/server
root@solaris:~# svcs application/pkg/server
STATE          STIME    FMRI
online         Jan_28   svc:/application/pkg/server:default

发布软件包

现在,我们的信息库已创建,该发布软件包了。为此,我们使用 pkgsend publish 命令并为其提供信息库位置(我们的 PROTO 区域)以及最终映像包管理系统软件包清单。

root@solaris:~# pkgsend -s http://localhost:9001 publish -d PROTO nagios.p5m.dep.res

root@solaris:~# pkgrepo -s http://localhost:9001 refresh
root@solaris:~# pkgrepo -s http://localhost:9001 info
PUBLISHER      PACKAGES STATUS           UPDATED
extra-software 1        online           2013-08-11T21:01:31.353448Z

安装软件包

现在,我们已经发布了软件包,该在系统上安装软件包了。您可以将它安装在 localhost 上,也可以安装在任何能够连接到 localhost 区域的区域上。您可以将发布者设置为 http://localhost:9001http://ip-address:9001。为此,您需要使用 pkg set-publisher 命令添加新信息库:

root@solaris:~# pkg set-publisher -p http://ip-address-of-the-localrepo:9001

root@solaris:~# pkg publisher
PUBLISHER                   TYPE     STATUS P LOCATION
...
extra-software              origin   online F http://ip-address:9001/

最后,使用 pkg install 安装软件包:

root@solaris:~# pkg install nagios
           Packages to install:  1
       Create boot environment: No
Create backup boot environment: No

DOWNLOAD                                PKGS         FILES    XFER (MB)   SPEED
Completed                                1/1       432/432      4.8/4.8    0B/s

PHASE                                          ITEMS
Installing new actions                       496/496
Updating package state database                 Done
Updating image state                            Done
Creating fast lookup database                   Done
root@solaris:~# pkg info nagios
          Name: nagios
       Summary: Nagios monitoring utility
   Description: Nagios is a host/service/network monitoring program
         State: Installed
     Publisher: extra-software
       Version: 4.0.2
 Build Release: 5.11
        Branch: 0
Packaging Date: Wed Jan 29 22:10:54 2014
          Size: 11.43 MB
          FMRI: pkg://extra-software/nagios@4.0.2,5.11-0:20140129T221054Z

为了验证此软件包是否正常工作,我们需要执行以下步骤。首先,我们配置 Apache,让它知道 Nagios。我们将以下代码添加到 /etc/apache2/2.2/httpd.conf

<IfModule alias_module>
    ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"
    Alias /nagios /usr/local/nagios/share
</IfModule>
<Directory "/usr/local/nagios/sbin/">
    Options ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory "/usr/local/nagios/share">
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

我们还启用 Apache 服务并检查其是否在线,如清单 11 所示:

root@solaris:~# svcadm enable apache22
root@solaris:~# svcs apache22
STATE          STIME    FMRI
online          2:10:22 svc:/network/http:apache22

root@solaris:~# svcs nagios
STATE          STIME    FMRI
online          1:02:12 svc:/application/nagios:default

清单 11

在清单 11 中,我们可以看到 Nagios 实例已经上线,并由服务管理工具管理。

启动 Web 浏览器,导航到 http://localhost/nagios;您应看到类似图 1 所示情形,否则需要检查命令行输出查找错误。

图 1. 指示 Nagios 已安装的屏幕截图

图 1. 指示 Nagios 已安装的屏幕截图

另请参见

有关如何管理 Oracle Solaris 11 的更多信息,请参见以下资源:

下面是其他一些资源:

关于作者

Joseph Balenzano 是 Oracle ISV 工程小组的首席软件工程师。Joe 主要与独立软件供应商 (ISV) 一起工作,专攻云技术、虚拟化和系统管理软件。

Edward Zhang 是 Oracle ISV 工程小组的软件工程师。Edward 的主要工作是指导 ISV 的 Oracle Solaris 系统管理。

修订版 1.0,2014 年 8 月 27 日

关注我们:
博客 | Facebook | Twitter | YouTube