LinuxでDBのインストールに加えてDBの初期設定(パスワードの設定)やテーブル作成までを自動化したいことがあると思います。特にPipelineやJenkinsで環境構築を自動化するときにニーズがあります。
しかしDBの初期設定は対話モードなので通常のシェルコマンドでは難しそうです。expectコマンドを使用すると実現できたのでサンプルとともに紹介します。
動作確認環境
・AmazonLinux2(EC2)
・CodeDeployでも動作することを確認済み
MariaDBインストール・初期パスワード設定
冒頭9行目まででmariadbをインストールしています。
14行目からがbashのexpectを使用して対話モードのコマンドをスクリプト化しています。expect、sendでこう来たらこう入力するというのを定義できます。
#!/bin/bash
# 対話モードをスクリプト化するexpectをインストール(すでに導入済みの場合不要)
sudo yum install expect -y
# mariadbのインストールおよび起動
sudo yum install mariadb mariadb-server -y
sudo systemctl start mariadb
sudo systemctl enable mariadb
# パスワード指定
MysqlRootPasswd=Password@123
# mysql_secure_installationの対話モードをスクリプト化
expect -c '
set timeout 1;
spawn sudo mysql_secure_installation;
expect "Enter current password for root (enter for none): ";
send -- "\n";
expect "Set 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;'
ユーザ作成・DB作成・権限付与
つくりは初期パスワード設定と同じようにexpectでスクリプト化しています。
地味にハマったのがSQLの場合は‘(シングルクォーテーション)を使用するのですがexpectの一番外側でシングルクォーテーションを使ってしまっているのでネストする必要があります。
しかし、bashの仕様上、シングルクォーテーションのネストは不可能です。そこで動作させるためにはネストさせる予定だったシングルクォーテーションをシングルクォーテーションの外に出し、外に出したシングルクォーテーションをエスケープする必要があります。16行目のCREATE USERでその小細工を行っています。
#!/bin/bash
# 対話モードをスクリプト化するexpectをインストール(すでに導入済みの場合不要)
sudo yum install expect -y
# パスワード指定
MysqlRootPasswd=Password@123
# mysqlユーザ作成、テーブル作成スクリプト化
expect -c '
set timeout 1;
spawn mysql -u root -p;
expect "Enter password:";
send -- "'"${MysqlRootPasswd}"'\n";
expect "MariaDB \[\(none\)\]>";
send -- "CREATE USER '\''user01'\''@'\''localhost'\'' IDENTIFIED BY '\''my_password'\'';\n"
expect "MariaDB \[\(none\)\]>";
send -- "CREATE DATABASE `db01`;\n"
expect "MariaDB \[\(none\)\]>";
send -- "GRANT ALL PRIVILEGES ON `db01`.* TO \"user01\"@\"localhost\";\n"
expect "MariaDB \[\(none\)\]>";
send -- "FLUSH PRIVILEGES;\n"
expect "MariaDB \[\(none\)\]>";
send -- "exit;\n"
interact;'
同じようにexpectを使用すればテーブルの作成もスクリプト化できるかと思います。
環境構築を自動化したい場合はぜひ参考にしてください!
PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!
SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ
システムエンジニア
AWSを中心としたクラウド案件に携わっています。
IoTシステムのバックエンド開発、Datadogを用いた監視開発など経験があります。
IT資格マニアでいろいろ取得しています。
AWS認定:SAP, DOP, SAA, DVA, SOA, CLF
Azure認定:AZ-104, AZ-300
ITIL Foundation
Oracle Master Bronze (DBA)
Oracle Master Silver (SQL)
Oracle Java Silver SE
■略歴
理系の大学院を卒業
IT企業に就職
AWSのシステム導入のプロジェクトを担当