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なんかも触ってみようかなと思ったりしてます。
コメント