paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

LXD環境のFirefly iiiのリカバリテストをする スクリプトで簡単にする編

前回行ったコンテナのリストアが思いの外簡単だったのでもっと簡単にします。
前回リカバリと言っていましたが、リストアのほうが適していそうなので今回はこちらで統一します。

ボタン一発でリストアできるのが理想ですね。

コンテナの命名規則

稼働中コンテナの名前は「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 1060 ...
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 1060 ...
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         |
+------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+

アクセスしてみます

前回と同じ初期化画面ですね。

f:id:paloma69:20210623222152p:plain

前回とり忘れたログイン画面。

f:id:paloma69:20210623222205p:plain

メイン画面は前回と同じデータが入ってます。

f:id:paloma69:20210623222222p:plain

成功だー!

まとめ

スクリプトの出力と主キーエラーを綺麗にする必要がありますが、ボタン一発というかシェルスクリプト一撃でリストアできました。
監視のトリガーからスクリプト呼び出せば自動で復旧できるってことですよね。
外から突く用のproxy設定の問題はありますが、だいぶ現状に近い状態に戻せるようになりました。

launchまでの手順ならテスト環境のデプロイにも使えるし、今回のスクリプトは活用できそうです。

ちなみに他の人はリストア時は自作スクリプトじゃなくてなにかパッケージとか使ってるんですかね?
あまり事例が出てこなくてわからないのですが気になります。

lxdがあまり使われていないだけかな。