サーバ構築時の面倒な初期設定もこれで解決 〜 さくらインターネット スタートアップスクリプト〜
目次
はじめに
こんにちは、システム開発グループの鈴木です。
CentOS7のサポート終了が2024年6月30日と、あと1ヶ月程度に迫っていますが、対応はお済みでしょうか?
私が運用保守を担当しているサーバもCentOS7を使用しているものがいくつかあり、ただいま絶賛対応中です。対象の各サーバはさくらインターネットのVPSを利用しており、RockyLinux8にて新サーバを構築しています。
いずれのサーバも、いわゆるLAMP(LinuxOS + Apache HTTP Server + MySQL + PHP)構成でWordPressを使用しています。ベースの構成が同じですので初期設定作業もほぼ同じであり、似たような作業をサーバ台数分繰り返すというとても面倒な作業になります。
そこで役に立つのが今回ご紹介するスタートアップスクリプトです。
スタートアップスクリプトをご存知ですか?
スタートアップスクリプトとは
さくらインターネットの「さくらのVPS」で無料で使える機能として「スタートアップスクリプト」があります。
Swap領域の作成、パッケージの更新やインストール、各種設定作業などの初期設定時に定型となっている作業を自動で実行してくれる機能です。
シェルスクリプトで記載できるため、コマンドインターフェースで可能な操作はすべて実行できます。
スタートアップスクリプトは、さくらインターネットが公開している公式スクリプトもありますが、独自のスクリプトの作成もできます。「マイスクリプト」として登録しておけば、そのスクリプトを登録した会員IDのすべてのサーバで利用できますし、公開設定をすれば他の会員IDにも公開できます。
スタートアップスクリプトの作成方法
さくらのVPS コントロールパネルのメニューから「スクリプト」→「マイスクリプト」を選択して「スクリプト追加」でスクリプトの登録ができます。
スクリプト追加では、以下のような内容を入力します。
- スクリプト名称(使用時に指定する名称)
- スクリプトの説明
- このスクリプトが利用可能なOS
- パラメータ
- スクリプト本文
パラメータ
スクリプト使用時にパラメータを入力でき、入力したパラメータはスクリプト本文中の置換対象文字列(「@@@置換文字列@@@」のような@@@で囲んだ文字列)と置き換えられます。
スクリプト本文
Bashなど使用するOS環境で利用可能なシェルスクリプトで記載します。
以下は、ホスト名を設定するスクリプトの例です。
パラメータで指定されたFQDN(ホスト名)を変数fqdn
として使用します。
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash fqdn=@@@fqdn@@@ set -x # Hostname setting if [ -n "$fqdn" ]; then nmcli general hostname "$fqdn" else fqdn=$(hostname -f) fi |
詳細については「マイスクリプトの追加」「スタートアップスクリプトの作り方」を参照ください。
スタートアップスクリプトの使用方法
スタートアップスクリプトは、契約中のVPSサーバでOS再インストールをする場合、または、VPSサーバを新規追加(新規契約)する場合に使用できます。
「マイスクリプト」から使用したいスクリプトを選択→「スクリプトを利用」で、利用したいサーバを選択、もしくは、「サーバーを新規追加して利用する」で使用できます。
また、VPS コントロールパネルの「OS再インストール」、および、VPS サーバ追加(新規サーバ申込)の画面でスタートアップスクリプトを選択すると使用できます。
詳細については「スクリプトを利用したサーバー作成」を参照ください。
こんな定型作業も自動化できる
実メモリサイズを元にSwap領域を作成
実メモリサイズからSwap領域のサイズを計算し、Swap領域を作成するといったことも自動化できます。
以下はSwap領域を作成してリブートするBashのサンプルスクリプトです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#!/bin/bash set -x SWAPFILENAME=/swap.img MEMSIZE=`cat /proc/meminfo | awk '/MemTotal/ {print $2}'` # Calculate the size of Swap area if [ $MEMSIZE -lt 2097152 ] then SIZE=`expr $MEMSIZE \\* 2` elif [ $MEMSIZE -lt 33554432 ] then SIZE=`expr 2097152 + ${MEMSIZE}` elif [ $MEMSIZE -lt 67108864 ] then SIZE=${MEMSIZE} else SIZE=33554432 fi # Create Swap area COUNT=`expr $SIZE / 131072` dd if=/dev/zero of=$SWAPFILENAME bs=128M count=$COUNT chmod 600 $SWAPFILENAME mkswap $SWAPFILENAME && swapon $SWAPFILENAME # Setting for mount the Swap area cp -p /etc/fstab /etc/fstab.org echo "$SWAPFILENAME swap swap defaults 0 0" >> /etc/fstab # Reboot reboot |
対話形式のMySQL初期設定コマンドを実行
スタートアップスクリプトでは、対話形式のコマンドを操作するためのexpectが利用できます。
MySQL初期設定コマンドmysql-secure-installation
は対話形式でパラメータを入力するため、そのままではシェルスクリプトでの実行はできません。そこでexpect
を利用して、Change the root password?
のプロンプトが表示されたら「Y」を入力する、といった対話処理を記述することでスクリプトの中でも実行できます。
以下はexpect
を使ってMySQL初期設定コマンドmysql-secure-installation
を実行するBashのサンプルスクリプトです。MySQLのrootユーザパスワードは入力パラメータで指定された値を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/bin/bash mysqlrootpasswd=@@@mysqlrootpasswd@@@ set -x # Initialize MariaDB systemctl start mariadb systemctl enable mariadb expect -c ' set timeout 2; spawn mariadb-secure-installation; expect "Enter current password for root (enter for none):"; send -- "\n"; expect "Switch to unix_socket authentication"; send -- "'Y'\n"; expect "Change the root password?"; send -- "'Y'\n"; expect "New password:"; send -- "'"${mysqlrootpasswd}"'\n"; expect "Re-enter new password:"; send -- "'"${mysqlrootpasswd}"'\n"; expect "Remove anonymous users?"; send "Y\n"; expect "Disallow root login remotely?"; send "Y\n"; expect "Remove test database and access to it?"; send "Y\n"; expect "Reload privilege tables now?"; send "Y\n"; interact;' |
おわりに
今回ご紹介したスタートアップスクリプトは、スクリプト本文はただのシェルスクリプトです。なので同じOS環境であれば、実はさくらインターネットのVPS以外でも利用できます。
最近では、Terraform、AWS CloudFormation、Azure Resource Managerなど、Infrastructure as Code(IaC)としてプログラムのようにコードで環境構築ができる便利なサービスがいろいろと提供されていますが、それなりに利用コストがかります。複雑なクラウド環境の構築ではそういう専用サービスを利用し、構成がそこまで複雑ではない環境ではお金をかけずに環境構築を自動化できるスタートアップスクリプトを活用するというのが良いのではないかと思います。
また、普段利用しているコマンドの延長としてシェルスクリプトを作るので、学習コストもそれほどかけなくて良いというのもメリットです。
スクリプトは1度作成しておけば、似たようなサーバを構築するのに便利ですし、障害やスケールアウトなどでサーバ再構築するときにも便利です。そこまで難しいものではありませんので、是非スタートアップスクリプトを作成して活用してみてください。