KUSANAGIコマンドとシェルスクリプトを組み合わせて運用する

石川英典

プライム・ストラテジー「KUSANAGI」開発チームの石川です。

KUSANAGIコマンドは、sshでログインしてコマンドラインで実行するだけでなく、シェルスクリプトから実行することもできます。
しかし、KUSANAGIコマンドの出力はコマンドラインで人が見ることを前提としているため、そのまま利用することが難しい場合があります。
今回はシェルスクリプトから実行KUSANAGIコマンドを実行して、その出力を組み合わせて運用する実例を紹介したいと思います。

KUSANAGIのプロファイル名の一覧を取得する

KUSANAGIの運用で一番最初に思い付くのはKUSANAGIのプロファイルに対しと処理を行うことです。
その際にまず必要なことは、プロファイル名の一覧を得ることです。

ここでは kusanagi_htmlkusanagi_test の2つのプロファイルがある環境を例にします。

KUSANAGIのプロファイルは /home/kusanagi/PROFILE のように、 /home/kusanagi 配下に作成されるため、シェルスクリプトで一覧にする際は様々なやり方があるように思えます。

この目的のために kusanagi list コマンドが用意されています。

# kusanagi list
kusanagi_html
kusanagi_test
list completed.

このままでは2つ問題があります。

  1. コマンドが正常に終了したかどうかが判断できない。
  2. 最後に list completed. のように、プロファイル以外の出力がある。

コマンドの正常終了を確認する

KUSANAGIコマンドの実行結果を確認する 方法は、過去に本コラムにて紹介していますので、詳細はそちらを参照してください。

ポイントは以下です。

  • 正常終了時は コマンド名 completed.緑文字で表示される。
  • ステータスコード 0 が返る。

実際にプロファイルの一覧を取得する

この点に注意して、上記のコマンドをフィルタリングする処理をシェルスクリプトで実行します。

#!/bin/bash

/opt/kusanagi/bin/kusanagi list | while read profile; do
    # プロファイル名が各行に出力されて ${profile} に格納されます

    # ただし、完了のメッセージ 'list completed.' は除きます
    if [[ "${profile}" == 'list completed.' ]]; then
        break
    fi

    # プロファイル名を処理します。
    # ここでは例として画面に出力してみます
    echo "プロファイル名は ${profile} です。"
done
# bash test.sh
プロファイル名は kusanagi_html です。
プロファイル名は kusanagi_test です。

無事にプロファイル名だけが抜き出せました。

KUSANAGIのプロファイルの詳細を得る

次に、このプロファイルの DocumentRoot の場所を特定してみましょう。

kusanagi show コマンドで、各プロファイルの詳細を得ることができます。

# kusanagi show kusanagi_html
type = wp
fqdn = host.example.com
dir = /home/kusanagi/kusanagi_html
dbname = kusanagi_html
dbuser = kusanagi_html
dbpass = ********
wplang = ja
mariadb = yes
psql = no
bcache = off
fcache = off
ratelimit = on
show completed.

実際にプロファイルの DocumentRoot を取得する

プロファイル名を取得したシェルスクリプトに DocumentRoot を取得する処理を加えます。
DocumentRootdir で示されたパスに /DocumentRoot を付加したものとなります。

#!/bin/bash

/opt/kusanagi/bin/kusanagi list | while read profile; do
    # プロファイル名が各行に出力されて ${profile} に格納されます

    # ただし、完了のメッセージ 'list completed.' は除きます
    if [[ "${profile}" == 'list completed.' ]]; then
        break
    fi

    # プロファイル名を処理します。
    /opt/kusanagi/bin/kusanagi show "${profile}" | while read detail; do
        # プロファイルの詳細が各行に出力されて ${detail} に格納されます

        # ただし、完了のメッセージ 'show completed.' は除きます
        if [[ "${detail}" == 'show completed.' ]]; then
            break
        fi

        # プロファイルのディレクトリは 'dir = ' で表示されます
        if [[ "${detail}" =~ ^dir[[:blank:]]=[[:blank:]](.+)$ ]]; then
            dir="${BASH_REMATCH[1]}"

            # ここでは例として画面に出力してみます
            echo "${profile} のDocumentRootは ${dir}/DocumentRoot です。"
        fi
    done
done
# bash test.sh
kusanagi_html のDocumentRootは /home/kusanagi/kusanagi_html/DocumentRoot です。
kusanagi_test のDocumentRootは /home/kusanagi/kusanagi_test/DocumentRoot です。

プロファイルごとにDocumentRootを取得することができました。

KUSANAGIのプロファイルのWordPressのバージョンを得る

次に応用編です。
プロファイルごとにWordPressのバージョンを取得してみましょう。

WordPressの情報を取得するには wp コマンドを使用します。
ここでは wp core version を使います。

また、プロファイルにはWordPress以外の場合があります。
そこで typewp 以外の場合はスキップするようにします。

#!/bin/bash

/opt/kusanagi/bin/kusanagi list | while read profile; do
    # プロファイル名が各行に出力されて ${profile} に格納されます

    # ただし、完了のメッセージ 'list completed.' は除きます
    if [[ "${profile}" == 'list completed.' ]]; then
        break
    fi

    # プロファイル名を処理します。
    /opt/kusanagi/bin/kusanagi show "${profile}" | while read detail; do
        # プロファイルの詳細が各行に出力されて ${detail} に格納されます

        # ただし、完了のメッセージ 'show completed.' は除きます
        if [[ "${detail}" == 'show completed.' ]]; then
            break
        fi

        # WordPressのプロファイルは 'type = wp' で表示されます
        if [[ "${detail}" != 'type = wp' ]]; then
            # WordPress以外の場合は処理をスキップします
            echo "${profile} は WordPress ではありません。"
            break
        fi

        # プロファイルのディレクトリは 'dir = ' で表示されます
        if [[ "${detail}" =~ ^dir[[:blank:]]=[[:blank:]](.+)$ ]]; then
            dir="${BASH_REMATCH[1]}"

            # wp core version でバージョンを出力させます。
            echo "${profile} の WordPress のバージョンは以下です。 "
            wp core version --path="${dir}/DocumentRoot"
        fi
    done
done
# bash test.sh
kusanagi_html の WordPress のバージョンは以下です。
6.5.2
kusanagi_test は WordPress ではありません。

更なる活用

kusanagi コマンド と wp コマンド を組み合わせた例をここまで紹介しました。

wp コマンドでは、アップデートはもちろんのこと、テーマやプラグインの情報を取得することもできます。
これらを組み合わせることで、例えば使用しているテーマを一覧にしたり、プラグインをアップデートしたりすることもできます。
また、シェルスクリクトからkusanagi コマンドを実行することで、 cron などで自動化することもできます。

kusanagi コマンドをシェルスクリプトで活用して、KUSANAGIの運用に役立ててみてください。

<< ロードバランサーを介してKUSANAGIを運用するNginx の location でアクセス制限をかける際の落とし穴 >>

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解