ObserviumのインストールをShellスクリプトで半自動化する

昔の職場でMRTGとかいうのをサーバ監視に使ってて、サーバの可視化とかグラフ化とかありました。正直、サーバ運用は人が不幸になるだけであまり好きではないのでこういう監視系のツールにはあまりそそられないのですが、否応なく勉強せざるをえなくなったので仕方なしにツール入れてみることにしました。

選んだのObserviumですね。(他にもあるのに

正直なところGrafanaとかPrometheusとかmackerelとかDatadogとかキラキラで行けてる上の世界の方が使っているようなところをお勉強したかったのですが、行けてないのでなんかEC2の上にZabbixとかObserviumを乗っけるところからのお勉強です。

※筆者が行けていないだけなのでツールは悪くないです。

そして次に同じ作業できる自信がないので、相変わらずの芸のないShellスクリプトで一括インストールです。公式にもインストールスクリプトあるのでそっち使えばいいんですがRDSとかCloudSQL使うケースとかhttps化したかったのであえての自前で準備です。ラクできるときはラクする方がはるかにいいです。

ちなみにObserviumではPHP8.2以降で非推奨のMySQLライブラリ使ってるのでPHP8.1まででしか動かぬようです。早めの8.2以降対応に期待しましょう。


◆Shellスクリプト本体

#!/bin/bash
HOST_NAME=observium-srv
DATABASE=observium
DB_INITIAL_PASSWORD=dbpassword
DB_ROOT_PASSWORD=dbpassword
DB_USER=observium
DB_PASSWORD=observium
DB_HOST=localhost
PHP_VERSION=8.1
WEB_USER=www-data
HTPASSWORD_PATH=/etc/nginx/basic
SERVER_NAME=yourdomain.com
SITE_URL=https://yourdomain.com/
DOCUMENT_ROOT=/opt/observium/html
ADMIN_MAIL=mail@yourmail.com
OBS_ADMIN=admin
OBS_PASSWORD=admin
OBS_LEVEL=10
RO_COMMUNITY=public


sudo hostnamectl set-hostname ${HOST_NAME}


# ---------------------------------------------
# 1.PHPインストール
# ---------------------------------------------
read -p "## Do you want to install php? (y/n) [y]: " -e -i "y" phpResponseinput
if [ "$phpResponseinput" == "y" ] || [ "$phpResponseinput" == "Y" ]; then
    echo "# install php process..."
	sudo apt install -y \
	libapache2-mod-php${PHP_VERSION} \
	php${PHP_VERSION}-cli \
	php${PHP_VERSION}-mysql \
	php${PHP_VERSION}-gd \
	php${PHP_VERSION}-bcmath \
	php${PHP_VERSION}-mbstring \
	php${PHP_VERSION}-opcache \
	php${PHP_VERSION}-curl \
	php-apcu \
	php-pear \
	snmp \
	fping \
	rrdtool \
	subversion \
	whois \
	mtr-tiny \
	ipmitool \
	graphviz \
	imagemagick \
	python3-mysqldb \
	python3-pymysql \
	python-is-python3
    echo "# Install php done!"
fi


# ---------------------------------------------
# 2.Apacheインストール
# ---------------------------------------------
read -p "## Do you want to install Apache2? (y/n) [y]: " -e -i "y" apacheResponseinput
if [ "$apacheResponseinput" == "y" ] || [ "$apacheResponseinput" == "Y" ]; then
    echo "# install apache process..."
    sudo add-apt-repository ppa:ondrej/apache2
    sudo apt-get update
    sudo apt-get install -y apache2 libapache2-mod-php
    sudo cp /etc/apache2/conf-enabled/security.conf /etc/apache2/conf-enabled/security.conf.org
    # ---------------------------------------------
    # security.conf設定
    # ---------------------------------------------
    sudo tee /etc/apache2/conf-enabled/security.conf <<_EOF_
# バージョン情報の隠蔽
ServerTokens Prod
Header unset "X-Powered-By"
# httpoxy 対策
RequestHeader unset Proxy
# クリックジャッキング対策
Header append X-Frame-Options SAMEORIGIN
# XSS対策
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff
# XST対策
TraceEnable Off
_EOF_
    sudo sed -i 's#DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm#DirectoryIndex index.php index.html index.htm#' /etc/apache2/mods-enabled/dir.conf
    sudo sed -i 's#Options Indexes FollowSymLinks#Options FollowSymLinks#' /etc/apache2/apache2.conf
    sudo a2enmod headers
    sudo a2enmod proxy_fcgi setenvif
    sudo a2enconf${PHP_FPM}
    sudo systemctl restart ${PHP_FPM} apache2
    echo "# Install Apache2 done!"
fi


# ---------------------------------------------
# 3.Observium
# ---------------------------------------------
read -p "## Do you want to install Observium? (y/n) [y]: " -e -i "y" obsResponseinput
if [ "$obsResponseinput" == "y" ] || [ "$obsResponseinput" == "Y" ]; then
    echo "# install WordPress process..."
    wget http://www.observium.org/observium-community-latest.tar.gz
    tar zxvf observium-community-latest.tar.gz
    mkdir -p observium/logs
    mkdir -p observium/rrd
    sudo chown -R www-data:www-data observium
    sudo mv observium /opt/
    rm -Rf observium-community-latest.tar.gz
    sudo cp /opt/observium/config.php.default /opt/observium/config.php
    sudo sed -i "s/localhost/${DB_HOST}/g" /opt/observium/config.php
    sudo sed -i "s/USERNAME/${DB_USER}/g" /opt/observium/config.php
    sudo sed -i "s/PASSWORD/${DB_PASSWORD}/g" /opt/observium/config.php
fi


# ---------------------------------------------
# 4.MariaDBインストール
# ---------------------------------------------
read -p "## Do you want to install MariaDB? (y/n) [y]: " -e -i "y" MariaDBResponseinput
if [ "$MariaDBResponseinput" == "y" ] || [ "$MariaDBResponseinput" == "Y" ]; then
    read -p "## Do you want to Setting localDataBase? (y/n) [y]: " -e -i "y" localDBResponseinput
    if [ "$localDBResponseinput" == "y" ] || [ "$localDBResponseinput" == "Y" ]; then
        echo "# please password input ${DB_PASSWORD} "
        sudo apt-get -y install apt-transport-https curl
        sudo mkdir -p /etc/apt/keyrings
        sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
        sudo apt-get -y update
        sudo apt-get -y install mariadb-server
        sudo mysql -u root -p'${DB_INITIAL_PASSWORD}' -h localhost<<_EOF_
ALTER USER root@localhost IDENTIFIED BY '${DB_ROOT_PASSWORD}';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE IF EXISTS test;
FLUSH PRIVILEGES;
_EOF_
    #
    # データベース作成
    #
    sudo mysql -u root -p"${DB_ROOT_PASSWORD}" -h "${DB_HOST}"<<_EOF_
CREATE DATABASE ${DATABASE};
create user '${DB_USER}'@'${DB_HOST}' identified by '${DB_PASSWORD}';
grant all privileges on ${DATABASE}.* to '${DB_USER}'@'${DB_HOST}';
FLUSH PRIVILEGES;
_EOF_
    else
      #
      # ローカルデータベース以外にインストールする場合
      #
      sudo apt install -y mariadb-client
      #
      # データベース作成
      #
      echo "please input password:${DB_ROOT_PASSWORD}"
      sudo mysql -u root -h ${DB_HOST} -p<<_EOF_
CREATE DATABASE ${DATABASE};
create user '${DB_USER}'@'%' identified by '${DB_PASSWORD}';
grant all privileges on ${DATABASE}.* to '${DB_USER}'@'%';
FLUSH PRIVILEGES;
_EOF_
    fi
    /opt/observium/discovery.php -u
fi


# ---------------------------------------------
# 5.SSL設定 Let'sEncrypt使用しない場合はn
# ---------------------------------------------
read -p "## Do you want to install Let's Encrypt? (y/n) [y]: " -e -i "y" sslResponseinput
if [ "$sslResponseinput" == "y" ] || [ "$sslResponseinput" == "Y" ]; then
    echo "# install Let's Encrypt process..."
    sudo apt -y install certbot
    sudo certbot certonly --webroot -w /var/www/html -d ${SERVER_NAME} --agree-tos --email ${ADMIN_MAIL} --non-interactive
    echo "# Install Let'sEncrypt done!"
fi


# ---------------------------------------------
# 6.バーチャルホスト設定
# ---------------------------------------------
read -p "## Do you want to Setting Vitualhost? (y/n) [y]: " -e -i "y" vhostResponseinput
if [ "$vhostResponseinput" == "y" ] || [ "$vhostResponseinput" == "Y" ]; then
    echo "# Vitualhost setting process..."
    sudo tee /etc/apache2/sites-available/000-default.conf <<_EOT_
<VirtualHost *:80>
    ServerName ${SERVER_NAME}
    Redirect permanent / ${SITE_URL}
</VirtualHost>
_EOT_

sudo tee /etc/apache2/sites-available/default-ssl.conf <<_EOT_
<VirtualHost *:443>
    ServerAdmin ${ADMIN_MAIL}
    DocumentRoot ${DOCUMENT_ROOT}
    <FilesMatch \.php$>
      SetHandler application/x-httpd-php
    </FilesMatch>
    <Directory />
            Options FollowSymLinks
            AllowOverride None
    </Directory>
    <Directory /opt/observium/html/>
            DirectoryIndex index.php
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Require all granted
    </Directory>
    ErrorLog  \${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog  \${APACHE_LOG_DIR}/access.log combined
    ServerSignature On
    SSLEngine on
    SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key
    #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt
</VirtualHost>
_EOT_

	# Let'sEncrypt
	if [ "$sslResponseinput" == "y" ] || [ "$sslResponseinput" == "Y" ]; then
	    sudo sed -i 's#ServerAdmin webmaster@localhost#ServerAdmin '"${ADMIN_MAIL}"'#' /etc/apache2/sites-available/default-ssl.conf
	    sudo sed -i 's#/etc/ssl/certs/ssl-cert-snakeoil.pem#/etc/letsencrypt/live/'"${SERVER_NAME}"'/cert.pem#' /etc/apache2/sites-available/default-ssl.conf
	    sudo sed -i 's#/etc/ssl/private/ssl-cert-snakeoil.key#/etc/letsencrypt/live/'"${SERVER_NAME}"'/privkey.pem#' /etc/apache2/sites-available/default-ssl.conf
	    sudo sed -i 's|#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt|SSLCertificateChainFile /etc/letsencrypt/live/'"${SERVER_NAME}"'/chain.pem|' /etc/apache2/sites-available/default-ssl.conf
	fi

    sudo a2ensite default-ssl
    sudo sed -i 's|/var/www/html|${DOCUMENT_ROOT}|' /etc/apache2/sites-available/default-ssl.conf
    sudo a2enmod ssl
    sudo a2enmod rewrite
    sudo a2dismod mpm_event
    sudo a2enmod mpm_prefork
    sudo a2enmod php8.1
    sudo rm /var/www/html/index.html
    sudo systemctl restart apache2
    echo "# Vitualhost setting done!"
fi


# ---------------------------------------------
# 7.SNMP関連
# ---------------------------------------------
read -p "## Do you want to Setting SNMP? (y/n) [y]: " -e -i "y" snmpResponseinput
if [ "$snmpResponseinput" == "y" ] || [ "$snmpResponseinput" == "Y" ]; then
  sudo apt install -y snmpd
  
  sudo sed -i "s/rocommunity  public/rocommunity  ${RO_COMMUNITY}/" /etc/snmp/snmpd.conf
  sudo sed -i "s/rocommunity6 public/rocommunity6 ${RO_COMMUNITY}/" /etc/snmp/snmpd.conf
  sudo systemctl restart snmpd
  
  /opt/observium/adduser.php ${OBS_ADMIN} ${OBS_PASSWORD} ${OBS_LEVEL}
  /opt/observium//add_device.php localhost ${RO_COMMUNITY} v2c

  /opt/observium/discovery.php -h all
  /opt/observium/poller.php -h all

  sudo tee /etc/cron.d/observium <<_EOT_
# Run a complete discovery of all devices once every 6 hours
33  */6   * * *   root    /opt/observium/observium-wrapper discovery >> /dev/null 2>&1
# Run automated discovery of newly added devices every 5 minutes
*/5 *     * * *   root    /opt/observium/observium-wrapper discovery --host new >> /dev/null 2>&1
# Run multithreaded poller wrapper every 5 minutes
*/5 *     * * *   root    /opt/observium/observium-wrapper poller >> /dev/null 2>&1
# Run housekeeping script daily for syslog, eventlog and alert log
13 5 * * * root /opt/observium/housekeeping.php -ysel >> /dev/null 2>&1
# Run housekeeping script daily for rrds, ports, orphaned entries in the database and performance data
47 4 * * * root /opt/observium/housekeeping.php -yrptb >> /dev/null 2>&1
_EOT_

  sudo service cron restart
fi


◆参照URL

 ・observium

https://docs.observium.org/install_debian/

https://docs.vultr.com/install-observium-on-ubuntu-20-04

https://ja.linux-console.net/?p=1429

https://orebibou.com/ja/home/201603/20160303_001/

https://reintech.io/blog/configuring-network-monitoring-observium-ubuntu


・SNMP

https://qiita.com/tomoyk/items/7a2d48df583e2b1b9bc6

https://www.site24x7.jp/help/admin/adding-a-monitor/configuring-snmp-linux.html#ubuntu

https://qiita.com/nanbuwks/items/3632b3180e587152bfc7


信念はサーバは嫌いでServeless礼賛な人間なのですが、

今はサーバ系のお仕事なので仕方なしに勉強です。間違いなくサーバは人を不幸にしかしないので消えた方がいいと思うのです。(サーバ運用はビジネスの本質ではないので)

IT部門で監視ガチでやりだしたりするとほんとに人がいくらいても足りないし、高度に自動化しようとすると金と時間が足りないし、なんせ自動化しても台帳とかわけわからないもののせいで余計にコストかかるしでホントにいいことないというイメージしかないです。

※必要最小限以外はIaC管理にしてスケールする構成にしとけと思うIP管理すら不要


DXとか言って下らねぇ基幹システムとか運用が面倒なサーバとかに金かけるよりはSaaSとかFaaSとか使ってミニマム構成でスケールしていくことの方が重要だと思うわけです。もはやクラウドでもIaaS持つのとかってコストメリットないしリスクなのでやめてほしいとすら思う。


まぁそこまでボロカス言ってますが、一応お仕事なのでジョブ管理とかバッチ管理とかの統合とかもやらないといけないケースもあるので、そのうちHinemosなんかも触ってみようかなと思ったりしてます。

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)