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