前回行ったコンテナのリストアが思いの外簡単だったのでもっと簡単にします。
前回リカバリと言っていましたが、リストアのほうが適していそうなので今回はこちらで統一します。
ボタン一発でリストアできるのが理想ですね。
コンテナの命名規則
稼働中コンテナの名前は「firefly」ですがデプロイする際には重複しない様ちょっと変えたいです。
連番でもいいんですが通番をチェックしないといけないので面倒ですね。
一意にわかればいいのでランダムな文字列をくっ付けます。
ランダム文字列
shellでやろうとすると/dev/urandomから引っ張る例が多いですが、シンプルなの見つけました。
10 Ways to Generate a Random Password from the Linux Command Line
masashi@PC-ubuntu:~/scripts$ date | md5sum f638d6896fb86b6e375a2d96a75ed06e -
これで十分ですね。
あまり長いのも困るので8桁くらいまでにしましょう。
masashi@PC-ubuntu:~/scripts$ date | md5sum | fold -w 8 | head -n 1 cf94a96f
dockerのcontainer idみたいw
サーバ名とくっ付けます。
lxdはサーバ名はハイフンしか記号使えないみたいです。
masashi@PC-ubuntu:~/scripts$ echo firefly-$(date | md5sum | fold -w 8 | head -n 1) firefly-aaa9676e masashi@PC-ubuntu:~/scripts$ echo firefly-$(date | md5sum | fold -w 8 | head -n 1) firefly-778bfd32 masashi@PC-ubuntu:~/scripts$ echo firefly-$(date | md5sum | fold -w 8 | head -n 1) firefly-63d9eff8
いいんじゃないでしょうか。
間隔無しで打たない限りは重複しませんね。
スクリプト化
コンテナのデプロイはlaunch打てばいいので簡単なんですが、重要なのはデータのインポートです。
前回はコンテナ内でsqlをインポートしましたが、今回ホストからデータを流し込みます。
テキストだからホストから直で行けるんじゃない?という考えのもとやってみます。
執筆中にいろいろテストしまして、コンテナを上げてすぐだとmysqldがあがっていなくてエラーになるのでステータスをウォッチするようにしました。
また、当初はpsで確認していましたがどこかエスケープしきれていないのかコマンドがミスるのでsystemdに直しました。
masashi@PC-ubuntu:~$ cmd="lxc exec firefly-a5d5d413 -- ps aux | grep mysqld" masashi@PC-ubuntu:~$ $cmd error: garbage option Usage: ps [options] Try 'ps --help <simple|list|output|threads|misc|all>' or 'ps --help <s|l|o|t|m|a>' for additional help text. For more details see ps(1).
最終的にスクリプトはこんな感じです。
mysqlのパスワードも平文なのでマスクします。
ここも暗号化しないとな。
masashi@PC-ubuntu:~/scripts$ cat firefly_restore.sh #!/bin/bash uniqid=$(date | md5sum | fold -w 8 | head -n 1) servername="firefly-$uniqid" lxc launch firefly-image $servername cmd="lxc exec $servername -- systemctl --no-pager status mysqld" while : do $cmd if [ $? == 0 ] ; then break else sleep 1 $cmd fi done lxc exec $servername -- mysql --force -u fireflyiii -p<パスワード> -t fireflyiii < ./fireflyiii-db.sql
実行してみる
今回はscriptsフォルダで作業しています。
masashi@PC-ubuntu:~/scripts$ pwd
/home/masashi/scripts
dumpしたsqlも直下にあります。
masashi@PC-ubuntu:~/scripts$ ls fireflyiii-db.sql
fireflyiii-db.sql
現状はこんな感じ。
masashi@PC-ubuntu:~/scripts$ lxc list +----------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +----------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | debian | RUNNING | 10.28.57.205 (eth0) | fd42:24ab:b835:ae42:216:3eff:fe98:2560 (eth0) | CONTAINER | 0 | +----------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | dokuwiki | RUNNING | 10.28.57.198 (eth0) | fd42:24ab:b835:ae42:216:3eff:fe2e:4f6a (eth0) | CONTAINER | 0 | +----------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | firefly | RUNNING | 10.28.57.107 (eth0) | fd42:24ab:b835:ae42:216:3eff:fea8:7ef0 (eth0) | CONTAINER | 1 | +----------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | firefly-backup | STOPPED | | | CONTAINER | 0 | +----------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | lxd-proxy | RUNNING | 10.28.57.177 (eth0) | fd42:24ab:b835:ae42:216:3eff:fecd:d475 (eth0) | CONTAINER | 0 | +----------------+---------+---------------------+-----------------------------------------------+-----------+-----------+
ではスクリプト実行!
masashi@PC-ubuntu:~/scripts$ bash firefly_restore.sh Creating firefly-a5d5d413 Starting firefly-a5d5d413 ● mariadb.service - MariaDB 10.3.25 database server Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled) Active: inactive (dead) Docs: man:mysqld(8) https://mariadb.com/kb/en/library/systemd/ ● mariadb.service - MariaDB 10.3.25 database server Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled) Active: inactive (dead) Docs: man:mysqld(8) https://mariadb.com/kb/en/library/systemd/ ● mariadb.service - MariaDB 10.3.25 database server Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled) Active: inactive (dead) Docs: man:mysqld(8) https://mariadb.com/kb/en/library/systemd/ ● mariadb.service - MariaDB 10.3.25 database server Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled) Active: inactive (dead) Docs: man:mysqld(8) https://mariadb.com/kb/en/library/systemd/ ● mariadb.service - MariaDB 10.3.25 database server Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled) Active: inactive (dead) Docs: man:mysqld(8) https://mariadb.com/kb/en/library/systemd/ ● mariadb.service - MariaDB 10.3.25 database server Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled) Active: activating (start) since Tue 2021-06-22 23:13:23 JST; 1s ago Docs: man:mysqld(8) https://mariadb.com/kb/en/library/systemd/ Process: 241 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS) Process: 267 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS) Process: 273 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS) Main PID: 360 (mysqld) Tasks: 28 (limit: 14162) Memory: 78.5M CGroup: /system.slice/mariadb.service └─360 /usr/sbin/mysqld Jun 22 23:13:23 firefly-a5d5d413 systemd[1]: Starting MariaDB 10.3.25 database server... Jun 22 23:13:23 firefly-a5d5d413 mysqld[360]: 2021-06-22 23:13:23 0 [Note] /usr/sbin/mysqld (mysqld 10…60 ... Jun 22 23:13:23 firefly-a5d5d413 mysqld[360]: 2021-06-22 23:13:23 0 [Warning] Could not increase numbe…32186) Hint: Some lines were ellipsized, use -l to show in full. ● mariadb.service - MariaDB 10.3.25 database server Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2021-06-22 23:13:24 JST; 475ms ago Docs: man:mysqld(8) https://mariadb.com/kb/en/library/systemd/ Process: 241 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS) Process: 267 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS) Process: 273 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS) Process: 466 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS) Process: 468 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS) Main PID: 360 (mysqld) Status: "Taking your SQL requests now..." Tasks: 31 (limit: 14162) Memory: 84.3M CGroup: /system.slice/mariadb.service └─360 /usr/sbin/mysqld Jun 22 23:13:23 firefly-a5d5d413 systemd[1]: Starting MariaDB 10.3.25 database server... Jun 22 23:13:23 firefly-a5d5d413 mysqld[360]: 2021-06-22 23:13:23 0 [Note] /usr/sbin/mysqld (mysqld 10…60 ... Jun 22 23:13:23 firefly-a5d5d413 mysqld[360]: 2021-06-22 23:13:23 0 [Warning] Could not increase numbe…32186) Jun 22 23:13:24 firefly-a5d5d413 systemd[1]: Started MariaDB 10.3.25 database server. Jun 22 23:13:24 firefly-a5d5d413 /etc/mysql/debian-start[473]: Looking for 'mysql' as: /usr/bin/mysql Jun 22 23:13:24 firefly-a5d5d413 /etc/mysql/debian-start[473]: Looking for 'mysqlcheck' as: /usr/bin/mys…heck Jun 22 23:13:24 firefly-a5d5d413 /etc/mysql/debian-start[473]: This installation of MySQL is already upg…rade Hint: Some lines were ellipsized, use -l to show in full. ERROR 1062 (23000) at line 42: Duplicate entry '1' for key 'PRIMARY' ERROR 1062 (23000) at line 163: Duplicate entry '1' for key 'PRIMARY' ERROR 1062 (23000) at line 246: Duplicate entry '1' for key 'PRIMARY' ERROR 1062 (23000) at line 460: Duplicate entry '1' for key 'PRIMARY' ERROR 1062 (23000) at line 551: Duplicate entry '1' for key 'PRIMARY' ERROR 1062 (23000) at line 581: Duplicate entry '1' for key 'PRIMARY'
mysqldが上がるまで何回かウォッチしてますね。
ウォッチ部分の出力はいらないので後で直しましょう。
あと上がるまでちょっとかかるのでsleep 3秒くらいでいいかな。
また、最後の主キー重複エラーは前回と同じですね。
ということはデータを流し込めたということです。
コンテナは追加されています。
masashi@PC-ubuntu:~/scripts$ lxc list +------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | debian | RUNNING | 10.28.57.205 (eth0) | fd42:24ab:b835:ae42:216:3eff:fe98:2560 (eth0) | CONTAINER | 0 | +------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | dokuwiki | RUNNING | 10.28.57.198 (eth0) | fd42:24ab:b835:ae42:216:3eff:fe2e:4f6a (eth0) | CONTAINER | 0 | +------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | firefly | RUNNING | 10.28.57.107 (eth0) | fd42:24ab:b835:ae42:216:3eff:fea8:7ef0 (eth0) | CONTAINER | 1 | +------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | firefly-a5d5d413 | RUNNING | 10.28.57.148 (eth0) | fd42:24ab:b835:ae42:216:3eff:fe66:8932 (eth0) | CONTAINER | 0 | +------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | firefly-backup | STOPPED | | | CONTAINER | 0 | +------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+ | lxd-proxy | RUNNING | 10.28.57.177 (eth0) | fd42:24ab:b835:ae42:216:3eff:fecd:d475 (eth0) | CONTAINER | 0 | +------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+
アクセスしてみます
前回と同じ初期化画面ですね。
前回とり忘れたログイン画面。
メイン画面は前回と同じデータが入ってます。
成功だー!
まとめ
スクリプトの出力と主キーエラーを綺麗にする必要がありますが、ボタン一発というかシェルスクリプト一撃でリストアできました。
監視のトリガーからスクリプト呼び出せば自動で復旧できるってことですよね。
外から突く用のproxy設定の問題はありますが、だいぶ現状に近い状態に戻せるようになりました。
launchまでの手順ならテスト環境のデプロイにも使えるし、今回のスクリプトは活用できそうです。
ちなみに他の人はリストア時は自作スクリプトじゃなくてなにかパッケージとか使ってるんですかね?
あまり事例が出てこなくてわからないのですが気になります。
lxdがあまり使われていないだけかな。