プライム・ストラテジー「KUSANAGI」開発チームの福田です。
今回はkusanagi initを利用してできることを解説します。
KUSANAGIのBusiness EditionやPremium Editionでは自動的に内部で実行されるため使うことがほぼないうえに、原則としてKUSANAGIのFree Editionでも初回起動時にしか実行しないためあまり利用する頻度が多くないものではあります。
それでも多くの引数があり、これらを活用することでバッチスクリプトなどを経由してのインスタンスの自動セットアップなどが可能となります。
なお、この記事のコマンド解説はKUSANAGI 9をベースとしています。また、弊社でもKUSANAGI 8からKUSANAGI 9の最新バージョン(CentOS Stream 9/AlmaLinux OS 8/AlmaLinux OS 9)ベースへの移行を推奨しております。先日弊社の石川からもkusanagiコマンドについて解説記事がありましたが、kusanagi migrateコマンドを利用することでスムーズな移行を実現できますのでぜひご利用ください。
なぜkusanagi initを実行するのか
まず、なぜこのコマンドを実行するのかについて説明します。
通常のOSでは、初回起動時に数多くのコマンドの実行が必要となり、これによって多数のコマンドや手順を覚える必要があり時間と手数がかかっていました。
そこでKUSANAGIはkusanagi initという機能を用意し、この問題を解決しました。このコマンドによって一発で使うミドルウェアの設定や、今後のアップデートや管理に備えての鍵/パスワードなどを設定できます。また、日本語化や時間を現地の正しい時間に設定することが可能となり、初回起動時の手間を削減することが可能となっています。さらに、KUSANAGI 8では対話型のセットアップが中心でしたが、KUSANAGI 9ではコマンドラインオプションで設定することも可能となり、自動化が更に容易になりました。
注意事項
KUSANAGIコマンド類は通常rootユーザーもしくはwwwグループに所属している場合のみ利用できます。もしPermission Deniedや実行中にエラーが発生した場合はユーザーやグループを確認してください。
また、初回起動時ではイメージが古いこともあるので、忘れずにdnf upgradeを実行してください。
必須のコマンドラインオプションを設定する
KUSANAGI 9のkusanagiコマンドはKUSANAGI 8と比較し、必須のコマンドラインオプションが増えています。まずはそれら必須のオプションをご紹介していきます。
KUSANAGIユーザのパスワード
オプション: --passwd
まずは--passwd
です。これはkusanagiユーザに対してUNIXパスワードを設定するオプションとなります。WordPressでプラグインを更新する際にFTP接続情報が要求されたときに利用します。なお、--kusanagi-pass
というエイリアスもあります。
SSH鍵のパスフレーズ
オプション: --phrase
その次に--phrase
です。これはサーバ上のkusanagiユーザにSSHでログインするための公開鍵認証で用いる鍵にパスフレーズをつける場合にそのパスフレーズを指定するためにあります。もし指定したくない場合ば--no-phrase
や--nophrase
オプションを利用すると設定をスキップできます。もちろん、--no-phrase
と--phrase
は相反するオプションですので両方セットした場合エラーが戻されます。上記と同じく--kusanagi-phrase
というエイリアスがあります。
データベースルートユーザのパスワード
オプション: --dbrootpass
そして--dbrootpass
も必須のオプションとなっています。こちらは比較的直感的な名前となっているかと思いますが、データベースサーバのルートユーザのパスワードを設定するために使用します。
rootユーザは強力な権限をもっており、また他のユーザがログインできなくなった場合に回復する際にも利用可能なので、忘れにくくかつ極力複雑で長い文字列を設定することを推奨します。なお、KUSANAGIにおいてはバリデーション(入力文字列検証機能)があり、あまりにも弱いパスワードは指定できない仕様となっています。
任意のコマンドライン オプションを設定する
上記で指定が必須のオプションを解説しました。ここから先は任意設定のオプションとなります。つまり指定しなかった場合でもデフォルト値が設定されます。
タイムゾーン
オプション: --tz
任意指定最初のオプションは--tz
です。これはタイムゾーンを設定するのに使います。KUSANAGI 8の場合インタラクティブに検索で絞り込むなどで入力していましたが、KUSANAGI9ではCLIのオプションで指定します。指定がなかった場合、執筆時現在(2023年2月前後)では、Asia/Tokyo、つまりGMT+9が選択されます。国際的に利用する場合、例えば、KUSANAGIのインスタンスをニューヨークで動かすときは--tz America/New_York
などと設定すれば大丈夫です。なお、timedatectl list-timezones
を実行することでこのオプションで利用可能なタイムゾーンIDを調べることが可能です。
言語
オプション: --lang
これはコンソールで表示される言語の指定に利用します。現時点ではen(英語)およびja(日本語)の設定に対応しています。指定しなかった場合日本語が選択されます。特に、国際的なプロジェクトではenを使う場面が多いでしょう。そうでない場合は状況に応じてとはなりますが(たとえばSSHを使わずディスプレイ直結のうえランレベル3でコンソールを動かす場合などは特段の処置をしない限りenでないと文字化けを起こします)、jaでも問題ないし多くの場合わかりやすいものと思われます。
キーボード配列
オプション: --keyboard
こちらはキーボード配列の設定をするのに使います。US配列のキーボードを使っている場合などに利用します。なお、デフォルトのオプションはjaです。このオプションの指定を間違えると一部の記号が入力できない、もしくは期待した動作にならない可能性があるので注意が必要です。
Webサーババージョン
オプション: --nginx123
, --nginx122
, --httpd24
これらは(執筆時現在では)次のうちのいずれかから一つを選択します:--nginx123
, --nginx122
, --httpd24
。選択しなかった場合、デフォルトではNginxの最新版が利用されます。nginx123はNginx 1.23, nginx122はNginx1.22, httpd24はApacheの2.4が選択されます。htaccessなどを利用したいなどの都合がある場合は–httpd24を、そうでなければ特段の事情がなければNginxの最新版を利用することをおすすめします。
なぜNginxを推奨し、またデフォルトがそうなっているかというと、通常ApacheよりNginxのほうが高パフォーマンスが出ることが多く、KUSANAGIの高パフォーマンスを最大限発揮できるためです。
ちなみにinitでNginxを指定した場合でもApacheが入りますが、実際にはNginxのほうが起動します。また逆もしかりです。ご安心ください。
PHPバージョン
オプション: --php74
, --php80
, --php81
, --php82
同じように、PHPやデータベースサーバのバージョンの設定オプションがあり、指定なき場合はPHP 8.0が利用可能となっています。PHPのオプションでは7.4, 8.0, 8.1, 8.2(それぞれ--php74
, --php80
, --php81
, --php82
)が利用可能です。
データベースバージョン
オプション: --mariadb10.5
, --mariadb10.6
, --mariadb10.7
, --mariadb10.8
, --mariadb10.9
(CentOS Stream 8またはAlmaLinux OS 8のみ追加で--mariadb10.3
, --mariadb10.4
, --psql13
)
データベースサーバのオプションではMariaDBの10.5, 10.6, 10.7, 10.8, 10.9(--mariadb10.5
, --mariadb10.6
, --mariadb10.7
, --mariadb10.8
, --mariadb10.9
)が利用可能です。
またCentOS Stream 8またはAlmaLinux OS 8のみですが、MariaDB 10.3と10.4(--mariadb10.3
, --mariadb10.4
)およびPostgreSQL 13(--psql13
)を利用可能です。
指定がない場合、MariaDB 10.5が利用されます。
なお、それぞれのオプションで複数のバージョンやMariaDBとPostgreSQLを同時に指定することはできません。
そのほか
また、こちらもCentOS Stream 8またはAlmaLinux OS 8のみですが、Ruby2.6も利用可能となっています。これを利用する際は--ruby26
を指定します。
モデルケース
ここではモデルケースとして「日本を拠点とする企業が少し古いミドルウェアでしか動かないものをKUSANAGI上で動作させたい」「海外の企業が最新版のPHP/データベースを試してみたい」という2つのケースでのコマンドラインのサンプルを紹介したいと思います。なお実行時にはあらかじめrootになっています。また、いずれのケースにせよ、初回実行ですのでdnf upgradeも合わせて実行することとします。
まず、前者の場合ですが、今回はタイムゾーンはAsia/Tokyo (GMT+9)、日本語設定で日本語配列キーボードを利用し、Apache 2.4とPHP 7.4、そしてMariaDB 10.3を利用してのセットアップを想定します。また、パスワードはあらかじめ乱数生成器を利用してセキュアなものを生成しておくこととしました。ただし、SSH鍵にはパスフレーズを設定しません。また、このケースに限り、うっかりKUSANAGI 8と間違えて必須のオプションを指定しなかった場合の結果も載せておきます。
[root@test ~]# dnf upgrade -y
(省略)
[root@test ~]# kusanagi init
usage: kusanagi init [-h] --passwd PASSWD (--phrase PHRASE | --nophrase) --dbrootpass DBROOTPASS [--tz TZ]
[--lang {en,ja}] [--keyboard {en,ja}] [--nginx123 | --nginx122 | --httpd24]
[--php80 | --php74 | --php81 | --php82]
[--mariadb10.5 | --mariadb10.3 | --mariadb10.4 | --mariadb10.6 | --mariadb10.7 | --mariadb10.8 | --mariadb10.9 | --psql13]
[--ruby26]
kusanagi init: error: the following arguments are required: --passwd/--kusanagi-pass, --dbrootpass
[root@test ~]# kusanagi init --passwd (非公開) --nophrase --dbrootpass (非公開) --tz Asia/Tokyo \
--lang ja --keyboard ja --httpd24 --php74 --mariadb10.3
Generating SSL SESS ticket key for security
Generating 2048bit DHE key for security
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...++*++*++*++*
Finish.
Applying Location: Asia/Tokyo.
Set kusanagi user password used for software update.
Generate kusanagi user ssh-key.
Generating public/private rsa key pair.
Your identification has been saved in /root/kusanagi.pem.
Your public key has been saved in /root/kusanagi.pem.pub.
The key fingerprint is:
SHA256:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA root@test
The key's randomart image is:
+---[RSA 3072]----+
| |
| |
| |
| |
| |
| |
| |
| |
| |
+----[SHA256]-----+
(dnfが走っています。省略します)
Generating a RSA private key
..........................................+++++
......................................+++++
writing new private key to '/tmp/k_ssl_key.19p7MT'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:State or Province Name (full name) []:Locality Name (eg, city) [Default City]:Organization Name (eg, company) [Default Company Ltd]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server's hostname) []:Email Address []:Syntax OK
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service -> /usr/lib/systemd/system/httpd.service.
httpd completed.
(dnfが走っています。省略します)
nginx: the configuration file /etc/opt/kusanagi/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/opt/kusanagi/nginx/nginx.conf test is successful
nginx completed.
(dnfが走っています。省略します)
Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service -> /usr/lib/systemd/system/php-fpm.service.
php completed.
(dnfが走っています。省略します)
Created symlink /etc/systemd/system/mysql.service -> /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service -> /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service -> /usr/lib/systemd/system/mariadb.service.
innodb_buffer_pool_size = 3072M
query_cache_size = 320M
dbinit mariadb configure completed.
dbinit mariadb completed.
dbinit completed.
(dnfが走っています。省略します)
init completed.
後者のモデルケースではタイムゾーンをAmerica/New_York (GMT-13/-14)、英語設定でUS配列キーボードを利用し、Nginx 1.23とPHP 8.2、およびMariaDB 10.9を利用してのセットアップを想定しました。上に同じく、パスワードは予め乱数生成器を利用してセキュアなものを生成しています。
[root@test ~]# dnf upgrade -y
(省略)
[root@test ~]# kusanagi init --passwd (Hidden) --nophrase --dbrootpass (Hidden) \
--tz America/New_York --lang en --keyboard en --nginx123 --php82 --mariadb10.9
(上と同じような内容ですので省略します)
init completed.
どちらでも最初にdnfでアップデートを実施し、そのあと上記の設定通りinitを実施、途中時間がかかりつつ、また大量のメッセージが出力されるも、kusanagi initコマンドの最後にinit completedと出た段階でセットアップが完了したことがわかっています。
両方セットアップが終わったら、きちんと設定されたか、そして動作しているかバージョンを確認してみましょう。ついでに時間帯などがきちんと設定されているかも合わせて調べることとします。
まず前者のモデルケースからです。
[root@test ~]# httpd -v
Server version: Apache/2.4.55 (Unix)
Server built: Jan 18 2023 06:18:57
[root@test ~]# php -v
PHP 7.4.33 (cli) (built: Dec 23 2022 06:58:37) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.33, Copyright (c), by Zend Technologies
[root@test ~]# mysql -V
mysql Ver 15.1 Distrib 10.3.38-MariaDB, for Linux (x86_64) using readline 5.1
[root@test ~]# systemctl is-active httpd
active
[root@test ~]# systemctl is-active php-fpm
active
[root@test ~]# systemctl is-active mariadb
active
[root@test ~]# date
2023年 2月 15日 水曜日 18:02:18 JST
そして後者のモデルケースです。
[root@test ~]# /opt/kusanagi/sbin/nginx -v
nginx version: nginx/1.23.3
[root@test ~]# php -v
PHP 8.2.3 (cli) (built: Feb 15 2023 06:28:58) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.3, Copyright (c) Zend Technologies
with Zend OPcache v8.2.3, Copyright (c), by Zend Technologies
[root@test ~]# mysql -V
mysql Ver 15.1 Distrib 10.9.5-MariaDB, for Linux (x86_64) using readline 5.1
[root@test ~]# systemctl is-active nginx
active
[root@test ~]# systemctl is-active php-fpm
active
[root@test ~]# systemctl is-active mariadb
active
[root@test ~]# date
Wed Feb 15 04:01:54 EST 2023
httpd -vや/opt/kusanagi/sbin/nginx -vでWebサーバのバージョンが正しく設定されていることを確認しています。
その次にphp -vでPHPのミドルウェアのバージョンが正しく設定されていることを確認しています。
最後にmysql -VでMariaDBのバージョンが正しく設定されていることを確認しています。
その後にsystemctl is-activeで各種デーモンが動作しているかどうか(これはkusanagi statusでも可能ですが、今回は表示スペースの都合上systemctl is-activeを利用しています)を確認しています。
また時刻をチェックすること(date)であわせて言語が正しいかのチェックもしています。
これらを実行して問題がなければ、ワンストップでセットアップが完了し、他の構築作業にすぐにうつることができます。
まとめ
KUSANAGIであまり実行されないであろうコマンドでも、ノンインタラクティブに実行が可能になっていて自動化が可能な設計となっています。皆様もこれを活用してKUSANAGIの高速な実行環境を試していただければと思います。
なお、これらのデフォルト値や利用できるミドルウェアは将来変更されることがあるので、以下にあるリンクからドキュメントをあわせて確認することをおすすめします。