Empowered by expect

希望は体力

2022年印象的だったこと

一年の振り返りエントリーです。今年はアウトプットも少なかったですが読書量も少なかったので、ぼんやりと"印象的だったこと"のくくりで書きます。

甲賀忍法帖

今年一番の衝撃はこれですね。


久々に曲を聴いて興奮したのもありますが、歌の上手さから立ち居振る舞いからステージングが完璧すぎて感動しました。凄かった

Web3/Web2.0

荒れましたねー
新しい物は既存の物の欠点を補うまたは改善するという面を持つものですが、既存の物をあまり攻撃しすぎてはいけませんね。
インフラエンジニアは知っているはずです、BIND9の欠点を散々なじってきた人たちがBIND10からBIND9に戻る宣言をしてしまうのを見た時のあの感情を

ZOHO SOHO

これも衝撃的でした。
過去のZoholics! Japanなどのユーザーイベントに於いて「ZOHOの語源はSOHOである。○か×か」というクイズが何度か出されました。
従来答えは×で、SOHOは当時たまたま持ってたドメイン名を使ったという説明だったのですが
今年のZOHOLICS JAPANにおいてCEOのSridharさんから「ZOHOの語源はSOHO」という言及がありました。ナ、ナンダッテー
個人的な推測ですが、「たまたま持ってたZOHOというドメイン名はSOHOをもじって取った」というさらに一段階踏み込んだ事実が明かされたのかなと思います、うん。

腱鞘炎

去年は帯状疱疹に苦しみましたが、今年は腱鞘炎に苦しみました。一番ヒドいときは上半身がろくに動かせず握力が12kgまで落ちていました。
リハビリしたりストレッチしたり姿勢に気を付けたりと難儀ですが職業病的な面もあるのでうまくなだめて付き合っていきたいです。

まとめ

今年も健康を維持できずご時世的にも難儀な一年でした。
実務の方では地に足の付いた活動ができてきたので、来年はアウトプットを増やしていきたいです。まず年末年始はようやく買ったISUCON本を読みます。
それでは2022年の御礼と2023年へのご挨拶に代えて

Zulipはいいぞ

tl;dr

Slackとここが違って良いです
・スレッドに名前を付けて個別に選択できる
・"すべてのメッセージ"画面でひとつのTLとして読める


チャット系ツールとしてZulipを長いこと使っています。「Zulipはいいぞ」と一言つぶやいてばかりなのも生産的ではないので一度まとめておきます。

概要

Zulipはひとことで言うとSlack競合のチャットツールです。
github.com
zulip.com
オープンソースGitHub上に公開されていてセルフホストが可能です。またSaaSサービスも提供されています。
元々はステルス段階のスタートアップだったのををDropboxが買収し、オープンソース公開したりスピンオフで再分離したりを経て現在はKandra Labsを中心に開発とサービスが行われています。
お気に入りのツールなのであらためてご紹介いたします。

昔話

私は2016年にそれまで使っていたLet's Chatからの乗り換えで使い始めました。
当時オープンソースのチャットツールではZulipの他にMattermost、Rocket.Chatを検討候補としました。

Zulipにしたのはコミュニティの反応の良さでした。
当時「日本語検索ができないけど何か設定漏れてるかしら?」とぼんやりしたイシューを投げました。
「Postgresのdictionaryファイル差し替えないといけないね」とすぐにお返事いただき、「マジか..Postgres分かんねー..」とメソメソしていました。

ちょうどその頃PGroongaの勉強会があったので、「こんなやりとりしてたけどPostgres分からなすぎるので学びに行きますっ」と申し込んだのですが、なんと
github.com
PGroonga作者様が全文検索機能をZulipに実装してくださるというミラクル!うおおおーすげえー @ktou さんかっけー
というわけでZulipは /etc/zulip/settings.py に USING_PGROONGA = True を設定して manage.py を実行するだけでPGroonga検索が有効になります。
zulip.readthedocs.io

Zulipのここが良い

(1)全文検索が強い

前述の通りです

(2)Home TL画面がある

参加しているすべてのストリーム(Slackで言うチャンネル)を時系列に表示した"すべてのメッセージ"画面があります。
新しい物が下に表示されるという点を除けば、ツイ廃のみなさまがいつも見ている画面と同じ感じです。各チャンネルを選択して回るのが面倒な方にオススメです。

(3)スレッドがメールのように見やすい

各ストリームの中でさらにもう一階層"トピック"という分類ができます。スレッドに名前を付けて管理できます。
サイドバーにも各ストリームの下にトピック一覧が表示されるいて選択表示できます。
Slackのスレッド表示が苦手な方にはイチオシの機能です。


(4)自動リンクが地味に便利

特定のパターンを検知して自動的にリンクに変換する機能があります。
設定画面で表示されている下記画像の例では #の後に数字を書くとGitHubのIssueにリンクされます。

チケット番号やCVE番号に用いていますがとても便利です。

(5)Botが作りやすい

HubotのZulipコネクタがあるのでHubotでBot作成ができます。
また、zulip_botsという独自のフレームワークもありお手軽にbotを生み出せます。
https://zulip.com/api/running-bots

(6)Botだけでなく多様な連携

https://zulip.com/integrations/

これはイマドキ当然ですかね。様々なツールと連携できます。私はHubot以外にメールとRedmineとZabbix、GoCDなどと連携させたことがあります。

OSSコミュニティに便利な機能

Rust言語のコミュニティがZulipをヘビーに使用されていて参考になります。
https://rust-lang.zulipchat.com/

(日本語コミュニティ)
https://rust-lang-jp.zulipchat.com/

OSSコミュニティに向いている機能として以下が挙げられます。一言で言うとDiscourseっぽいことができます。

・ストリーム毎にパブリック公開設定が可能

https://zulip.com/help/public-access-option

SlackなどのWalled Gardenな環境は検索からアクセスできないので、OSSプロジェクトの場合過去の質問や検討を追うためにはログインしなければならないという状況があります。(最近は90以上前のやりとりは隠されるという状況もあります)
メーリングリストの書庫をウェブで公開していた時代よりも情報の検索アクセス性が劣るというのは残念なので、Q&Aやリリースのお知らせなどを公開できるというのは良いと思います。

・トピックを解決済みにマークできる

https://zulip.com/help/resolve-a-topic


トピック(スレッド)に解決済みのマークを付けることができます。
Q&Aやバグ修正の対応に便利です。
またトピックにメールの件名をそのまま用いることでMLのスレッド管理代わりに用いることもできます。
この機能は応用して問い合わせ管理の業務にも使えます。

ZulipはOSSプロジェクト向け無償オファーがあります。
zulip.com

気を付けたいところ

(1)インストールはまっさらな環境で行うべし

https://zulip.readthedocs.io/en/stable/production/install.html

動作環境にページにも書かれていますが、Zulipのインストーラーはサーバー上に他のサービスが共存している事は想定していません。
https://zulip.readthedocs.io/en/stable/production/requirements.html
既存のWebとnginxで振り分けて共存..といったことは考えず、まっさらなOS環境を用意しましょう。

(2)ToDoリストは期待したとおりに並ばない

https://zulip.com/help/format-your-message-using-markdown#to-do-lists

/todo のスラッシュコマンドでToDoリストの作成入力ボックスが登場します。
便利なのですが、最初に入力した物が一番下に表示されるので、なんだか直感に反します

(3)絵文字の一括登録がたまにコケる

https://zulip.com/help/custom-emoji#bulk-add-emoji

APIから絵文字の一括登録ができるのですが大量にやると稀によくコケます。
きっと大量にやってる私が悪いのでしょう、うん

まとめ

・スレッドに名前を付けて個別に選択できる
・Home画面でひとつのTLとしての見える

この2点がメインですがZulipについていろいろ述べてきました。
興味を持った方は是非使ってみてください。

Zulipはいいぞ

SSVCのDecision Tableを雑に実装してみる~Twine編~

DecisionRules編からの続編です。

概要

タイトルの通りです。Twineにインポートできるhtmlファイルを置いておきます。そのまま開いて実行もできます。
https://github.com/w4yh/SSVC-decision-tree
ファイル: HarloweとSugarCubeの2種類のスタイルで作ってみました。
SSVC_Supplier_Decision_Table_Harlowe_0.0.2.html
SSVC_Supplier_Decision_Table_SugarCube_0.0.2.html

完成品

最初にデモ代わりにSugarCube版のスクリーンショットを載せておきます。
ここでは Exploitation=Active, Automatable=yes, Value Density=concentrated, Technical Impact=Total, Safety Impact=Catastrophic を選択しています。

Twineスタート画面
Twine Exploitation選択画面
Twine Automatable選択画面
Twine Value Density選択画面
Twine Technical Impact選択画面
Twine Safety Impact選択画面
Twine選択終了画面
Twine判定結果画面

経緯

前回はSSVCの判定をDecisionRulesで作成してみました。
一覧が見えるので分かりやすい、APIも備えているのでcURLなどCLIからも実行できるなどの利点がありました。一方でツールチップで説明文を表示するなどの機能を実装していないので、実際に使用するシーンでは別途リンクURLなどの情報が必要でした。

今回はTwineを使ってリンクURLや説明文も表示しながら実装してみました。

Twine

公式サイト

Twineはオープンソースのノベルゲーム作成ツールです。
私は以前からTwineで業務フローを書くという間違った使い方をしています。フローチャートやBPMNだけだと通じる相手を選んでしまうケースがあるんですよね..ドメインサーバー証明書の購入といった事務寄りの方やサービスデスクの方などが関わる業務の説明で使ってウケたので愛用しています。

GitHub上に公開した冒頭のhtmlファイルを開くとこんな感じです。

Twineサンプル(Harlowe)

え、色が見にくいですか?cssを編集してください。別のテーマ(SugarCube)ではこうなります。

Twineサンプル(SugarCube)

ちょっと見やすくなりましたかね。Twine2ではデフォルトスタイルは一つ目の方(Harlowe)です。Harloweの方がノベルゲームっぽい雰囲気は出る気がしますが、お好みで選択 && css編集で色の変更 をしてください。

設計

DecisionRules編では"行を最下部に複製"を駆使して一覧にしました。今回は質問は5問しか無いですが一覧フルメッシュで作ると樹形図のようになり、枝分かれ先に同じ質問を何度も書くことになります。
そこで今回は各質問の回答をを変数に記憶しておき、最後に回答ごとの画面に遷移して判定結果を表示するという仕組みにしました。

Twine画面遷移一覧

最後をif文にするか迷いましたが、判定結果を「ここはimmediateにしたい」といったカスタマイズを行う場合に長いif文よりは扱い易いかと思いこの方法にしました。SSVCの資料に合わせて左から右に縦長で配置する方が良かったかもしれません。

インポートと実行

Twine公式サイトからダウンロードしてTwineをPCにインストールしてください。

実行すると初期メニュー画面になります。右側メニューから [Import From File] を選択します。

Twine初期メニュー画面

ファイル選択画面になるので、GitHubからダウンロードしたhtmlファイルを指定します。

インポートファイル選択画面

ファイル編集画面になります。

Twineでファイルを開いた画面

右下の [▶Play] を押すとデフォルトブラウザで開いて実際にプレイできます。

Twineの書き方の細かい説明は省略しますが、今回のファイルの流れだけ説明します。
設計のところでも述べましたが、各質問の答えを変数 $ans1 ~ $ans5 に記録しています。最後に連結して5桁の数字を $ans として生成し、該当の番号の選択肢(11111など)へジャンプして判定結果を表示しています。
最初のページに資料へのリンクを記載しています。独自の前提質問を追加する場合にはStartページから [0.始めましょう] の間に新しい画面(TwineではPassageと呼びます)挟むといいでしょう。Passageへのリンクは [[Passageの名前]] で表します。例えば「Javaは無いので対象外」のように「該当のパッケージがCMDB内に存在するか」といった質問を最初に加えるケースが想定されます。

振り返り

Twineで作るとディシジョンテーブル感は薄れるかもしれないですね。
しかしWiki上でパンくずリストを見ながら選択肢を大量に作るよりも扱い易いかと思います。本来ノベルゲーム用ツールなのでエンジニア向けツールというわけでもなくとっつきやすいかと思います。

5つめの質問である "Safety Impact" の判定がかなり肝な印象です。被害に関することなので、CVSSアタックベクターの中にはそのまま当てはまる項目は無いような気がします。どちらかというとISMSなどで組織毎システム毎に行ったリスク評価みたいなものがベースになるのかなと思います。リスク評価メンドクサイですが、やっぱりやらないといけませんね。。

SSVCのDecision Tableを雑に実装してみる~DecisionRules.io編~

経緯

TwitterでSSVCのことを知りました。

元となるブログ記事やその引用記事などを読んで、これはPrologで書けそうなディシジョンテーブルだなあと思いました(本投稿ではSSVC自体の説明は一切しませんので以下リンクの素晴らしいコンテンツをご参照ください)。
shinobe179.hatenablog.com
www.pwc.com
github.com

しかしPrologで書いてもProlog実行環境のインストールから説明することになるよなあ...と察したので今回はDecisionRulesというサービスを使って実装してみます。
ここではまずSSVCの"Suggested Supplier Table"を作ってみます。

DecisionRules概要

ディシジョンテーブルなどを作成&実行できる便利SaaSです。
www.decisionrules.io

Freeプランもあるのでアカウントを作成してください。ただし企業名や電話番号を求められます。

DecisionRulesアカウント作成画面

Excelからのインポートでテーブルを作成する

ログイン後、左側メニューから [Decision Tables] を選択します。

DecisionRules初期メニュー

DecisionTablesのトップ画面で [+ Decision Table] を選択して新規作成していきます。

DecisionTableトップ画面

作成方法の選択画面では右の [EMPTY DECISION TABLE] を選択し、
画像の赤枠部分でこのディシジョンテーブルを命名して下の [Continue] を選択します。

DecisionTable作成初期画面

空のディシジョンテーブルが表示されます。
左側の [Rule Settings] タブに移動します。

空のDecisionTable初期画面

テーブル設定画面で右上のメニューから [Import Version] を選択します。

Rule Settings画面

Import Decision Table の画面に進んだら
[1. Select Version!] で [Current (version 1)] を選択し、
[2. Drop or choose file!] で本投稿先頭に示したGitHubからダウンロードしたxlsxファイルを指定します。

テーブルのimport画面

ファイルに問題が無ければ下に [Save] のボタンが表示されるので選択します。

読み込んだディシジョンテーブルが表示されます。

インポートされたテーブルの初期画面

なおSSVCの項目のうちUtilityはAutomatableとValue Densityの2つから決まるので、直接AutomatableとValue Densityを入力する形にしました。さらにPublic Safety Impactは実質Safety Impactで決まるのでSafety Impactのみの入力を必要としています。

実行

テーブルを眺め終わったらさっそく実行してみましょう。
左側メニューから [Test bench] を選択します。

テストベンチメニュー画面

[1. Select Meta Data] の部分は自動で値が入っていると思います。
(API Key情報を含むのでキャプチャ略)
[2. Fill Request Body & Solve!] の欄に入力値を入れていきます。
 Exploitation (Active | PoC | none)
 Automatable (yes | no)
 Value Density (concentrated | diffuse)
 Technical Impact (Total | Partial)
 Safety Impact (Catastrophic | Hazardous | Major | Minor | None)
プルダウン選択..とはいきませんが、Valueの入力欄右側のハンバーガーメニュー(?縦3dots?)から [Preset Values] を選択すると値のリスト選択ダイアログが出ます。

Preset Valuesメニュー
Preset Valuesリスト画面

5項目の値をすべて入力して中央の [▶Run] を押します。
右側のOutputの欄に結果が表示されます。この場合は Priority=immediate、すぐに対応せよとなりました。

テストベンチ結果画面

同じ画面の下の方に [Code example] という欄があります。ここに今行ったテストをcURLやプログラミングから実施する場合のコードが表示されます(ここもAPI Keyを含むのでキャプチャ省略)。便利ですね!

Code Example欄

振り返り

SSVC Supplier Decision Tableの決定木をDecionRulesで実装することができました。
一覧で見通せる上Excel形式でのインポート&エクスポートもできお手軽だったと思います。

しかし、入力値のそれぞれの値についてツールチップなどで説明を表示といった機能を持たせていないので「別途資料を見ながら値の判定を行った後で最後に決定木を辿る部分だけの実装」となっています。Code Exampleの欄にPython等のコードも表示されるので周辺機能を作りこめばいいんですけどね。。でもそれならPrologでも苦労変わらないし。。

次回、「Decision TableをTwineでノベルゲームっぽく長い説明付きで実装する編」モノはできたので書けたら書きます。

エクスカーション

DecisionRules良かったです

今回たまたま見つけて使ってみましたが分かりやすかったです。コードを書けない人とビジネスルールの意識合わせをする場合にも使えそうな気がします。
また今回はインポートするので空白テーブルから作成しましたが、サンプルテーブルの内容はディシジョンテーブル界のHello Worldこと"複数の条件からなる割引率の決定"です。

テーブルが力業

今回作ったExcelテーブルは凝ったことはせずに、愚直にすべてのケースを羅列しています。
将来判定基準が変わったり、それぞれの組織やシステムの事情で「ここはout-of-cycleにしたい」といった時にも改変しやすいようにこの形式としました。
なので今回の主な作業は「この行を一番下に複製」の連打でした :P

decisionのカタカナ表記

ディシジョンで統一しましたがデシジョンだったでしょうか?
どちらが良いか判断つかないので機会あれば詳しそうな松井玲奈さんに質問しておきます。

IPアドレスのリストアップと集約(prips, aggregate)ついでにgrepcidr

きっかけ

@m4g さんのツイートでいろんなツールを思い出したのでまとめておきます

prips (print IP address)

私も以前同様のツールを探して、blacknonさんのブログでpripsを知りました。

orebibou.com

ここではRPMLinuxでのインストールと動作確認を記します。

pripsのインストール

$ git clone https://gitlab.com/prips/prips.git
$ cd prips
$ make

$ make test
prove t
t/01-cidr.t ...... ok
t/02-range.t ..... ok
t/03-skip.t ...... ok
t/04-format.t .... ok
t/05-except.t .... ok
t/06-cidrize.t ... ok
t/07-features.t .. skipped: The feature-check tool does not seem to be present
All tests successful.
Files=7, Tests=74,  1 wallclock secs ( 0.06 usr  0.02 sys +  0.34 cusr  0.12 csys =  0.54 CPU)
Result: PASS
$ sudo make install
$ hash -r

pripsの使用例

まずはヘルプを見てみます。

$ prips -h
usage: prips [options] <start end | CIDR block>
        -c              print range in CIDR notation
        -d <x>          set the delimiter to the character with ASCII code 'x'
                        where 0 <= x <= 255
        -h              display this help message and exit
        -f <x>          set the format of addresses (hex, dec, or dot)
        -i <x>          set the increment to 'x'
        -e <x.x.x,x.x>  exclude a range from the output, e.g. -e ..4. will
                        not print 192.168.4.[0-255]

        prips --help | --version | --features

Report bugs to Peter Pentchev <roam@ringlet.net>

元々のお題をであるCIDRを入れたらレンジ内のIPアドレスを列挙する、をやってみます。

prips 203.0.113.0/29
203.0.113.0
203.0.113.1
203.0.113.2
203.0.113.3
203.0.113.4
203.0.113.5
203.0.113.6
203.0.113.7

残念ながらCIDR表記指定などのオプションは無いので、末尾に/32を付けたい場合はsedします。

$ prips 203.0.113.0/29 | sed -e 's/$/\/32/g'
203.0.113.0/32
203.0.113.1/32
203.0.113.2/32
203.0.113.3/32
203.0.113.4/32
203.0.113.5/32
203.0.113.6/32
203.0.113.7/32

aggregate

ついでに関連ツールも書いていきます。
aggregateはその名の通りCIDR表記のアドレスリストを集約するツールです。

aggregateのインストール

epelにパッケージがあるのでyumで導入できます。

yum install aggregate

そっち系の方は
yum install aggregate-ios
も便利かもしれません。

ソースコードからコンパイルしたい方はこちらから。
みんな大好きBIND DNSサーバーのISCさんのサーバーから入手できます。
https://ftp.isc.org/isc/aggregate/

aggregate使用例

簡単な例として、先ほどのpripsコマンドで作ったIPアドレス一覧(/32表記)を/29に戻します。

$ prips 203.0.113.0/29 | sed -e 's/$/\/32/g'  | aggregate
aggregate: maximum prefix length permitted will be 32
203.0.113.0/29


/32も含め入力データはCIDR表記でなければいけませんが、サブネットマスク計算などメンドクサイことをパッとやってくれます。

grepcidr

grepcidrはCIDR表記のレンジやIPアドレスについて包含関係を判定するコマンドです。

当時yunazunoさんのブログで知りました。
yunazuno.hatenablog.com

grepcidrのインストール

atomic repoを用いてyumでインストールできます。

# curl -s https://updates.atomicorp.com/installers/atomic | sh
# yum --enablerepo=atomic install grepcidr
===================================================================================================================================
 Package                       アーキテクチャー            バージョン                            リポジトリー                 容量
===================================================================================================================================
インストール中:
 grepcidr                      x86_64                      2.0-1.el7.art                         atomic                       21 k

トランザクションの要約
===================================================================================================================================
インストール  1 パッケージ

grepcidrの使用例

man grepcidrに様々な例が載っています。

somescript | grepcidr -vf whitelist > blacklist
  • v はgrep同様 "含まない"条件指定になるので、この例はスクリプトが出力するIPアドレス(レンジ)リストから許可リストを除外して拒否リストを作っています。
grepcidr "192.168.0.1-192.168.10.13" iplog

このようにCIDR表記ではなく範囲指定で抽出することもできます。

(難点: grep cidrとタイプしてしまいがち)

sort

IPアドレスのソートは以下のsortコマンドオプションが使えます。

sort -n -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4
$ cat sampleIPaddress.list
203.0.113.64
192.0.2.12
198.51.100.230
192.0.2.1
$ cat sampleIPaddress.list | sort -n -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4
192.0.2.1
192.0.2.12
198.51.100.230
203.0.113.64

/32表記でも同じ結果が得られます。

$ cat sampleIPaddress.list
203.0.113.64/32
192.0.2.12/32
198.51.100.230/32
192.0.2.1/32
$ sort -n -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4 sampleIPaddress.list
192.0.2.1/32
192.0.2.12/32
198.51.100.230/32
203.0.113.64/32

まとめ

IPアドレスやCIDRは小数でもない直接扱いにくい形式ですが、先人のみなさまが便利ツールを提供してくださっているので便利にシュッと使っていきたいですね。

Docusaurus v2のコンテンツをCloudflare Pagesで公開する

タイトルの通りです。

参考にしたのはこちら。ほぼこの手順のままですがアップデートされた点もあったので残しておきます。
dev.to

重要なアップデート

一番書きたかったのはここです。

Cloudflare Pagesのフレームワーク選択画面でDocusaurusを認識するようになっているっ...

大まかな流れ

(1)GitHubに空リポジトリを作っておく

(2)手元にDocusaurusをセットアップ

(3)DocusaurusのコンテンツをGitHubにpush

(4)CloudflareでPagesのプロジェクトを作成

(5)build!

(6)サイトのできあがり

成果物はこちらです。
docusaurus-cfpages.pages.dev

(テストとしてDocusaurus初期状態でデプロイしてるのでそのうち消します)

今回の作業ではlocalの作業用ディレクトリ、GitHubリポジトリ名、Cloudflare PagesのURLをすべて docusaurus-cfpages で作成しました。

(1)GitHubに空リポジトリを作っておく

GitHubでPublicリポジトリを作成しておきます。
READMEも無くてよいでしょう。

(2)手元にDocusaurusをセットアップ

以下はLinux環境での手順です。
DocusaurusはNode.jsのLTS版を動作確認対象としています。今回は16.15.0をpyenv(anyenv)環境で使用しました。

nodejsのインストール

anyenv install nodenv
~/.anyenv/bin/anyenv install --init
eval "$(anyenv init -)"
anyenv install nodenv
exec #SHELL -l
nodenv init
eval "$(nodenv init -)"
nodenv install 16.15.0
nodenv global 16.15.0

Docusaurusのインストール

npx create-docusaurus@latest docusaurus-cfpages classic
cd docusaurus-cfpages

vi docusaurus.config.js (urlを設定します)
  url: 'https://docusaurus-cfpages.pages.dev',

(3)DocusaurusのコンテンツをGitHbにpush

git init
git remote add origin git@github.com:w4yh/docusaurus-cfpages.git
git add .
git commit -m "Initial commit"
git branch -M main
git push -u origin main

(4)CloudflareでPagesのプロジェクトを作成

Cloudflare管理画面にログインします。
Pagesはドメイン選択前のトップ階層のサイドバーメニューにあります。

[プロジェクトを作成] をクリックしてウィザードを開始します

リポジトリの選択 の画面でGitHubまたはGitLabのアカウントとリポジトリを指定します
[セットアップの開始] をクリックします

②ビルドとデプロイのセットアップ 画面で以下を指定します。

フレームワークプリセット: Docusaurus
 プルダウンの選択肢の中にDocusaurusがあります。素晴らしい
・ビルドコマンド: npm runbuild
・ビルド出力ディレクトリ: build
環境変数: NODE_VERSION = 16.15.0

[保存してデプロイする] をクリックします

(5)build!

③サイトをデプロイ 画面に進行状況が表示されます。

成功すると"成功しました!"のメッセージとともにデプロイ先のURLが表示されます。
(今回はhttps://docusaurus-cfpages.pages.dev)

(6)サイトのできあがり

デプロイ先URLをクリックして出来栄えを確認します。

一度デプロイに成功すれば、次回以降のpush(merge)の際は自動的に再デプロイされます。


感想

自前サーバーのGitLab Pagesは使ってきましたが、Cloudflare Pagesもとてもお手軽で良いです。
Docusaurus以外にも多様なプリセットが指定可能なので一部のスクショを載せておきます。


GLPI Agent 1.2をAmazon Linux2にインストール

資産管理というか運用管理ツールというか機能豊富なツールであるGLPIがバージョン10に到達しました。
(途中0.9xから9.xへの変更で飛び番しています)

glpi-project.org

これまでもOCS-Inventory NGなどと連携するディスカバリ機能がありましたが10ではNative inventoryが追加されました。
FusionInventoryをforkしたそうで、GLPI10本体のfinal releaseに先駆けてAgentはバージョン1.2まで公開されています。

glpi-project.org

このGLPI Agent 1.2をAmazon Linux 2のインスタンスに導入してみたので手順を残しておきます。

標準インストーラーではNG

perlスクリプトインストーラーが用意されています。まずはこちらを試してみます。

# wget https://github.com/glpi-project/glpi-agent/releases/download/1.2/glpi-agent-1.2-linux-installer.pl

# perl glpi-agent-1.2-linux-installer.pl --install
Not supported linux distribution

...ディストリビューション判定でひっかかりますね...Alma Linuxは行けたのですが。
次の手としてRPMパッケージからのインストールを試みます。

RPMパッケージからインストール

まずは準備として、Perl modulesの依存が多いのでEPELを有効にしてyumからインストール出来るようにしておきます。

# amazon-linux-extras install epel
# yum repolist
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
209 packages excluded due to repository priority protections
repo id                                              repo name                                                           status
amzn2-core/2/x86_64                                  Amazon Linux 2 core repository                                          27,693
amzn2extra-docker/2/x86_64                           Amazon Extras repo for docker                                               56
amzn2extra-epel/2/x86_64                             Amazon Extras repo for epel                                                  1
amzn2extra-kernel-5.10/2/x86_64                      Amazon Extras repo for kernel-5.10                                         143
epel/x86_64                                          Extra Packages for Enterprise Linux 7 - x86_64                      13,542+209
repolist: 41,435

ではRPMをダウンロードしてインストールしていきましょう。

# wget https://github.com/glpi-project/glpi-agent/releases/download/1.2/glpi-agent-1.2-1.noarch.rpm
# yum install glpi-agent-1.2-1.noarch.rpm

Perl modulesが大量にインストールされますが正常にインストールできました。
他のパッケージも同様にインストールしていきます。

# yum install glpi-agent-task-collect-1.2-1.noarch.rpm
# yum install glpi-agent-task-deploy-1.2-1.noarch.rpm
# yum install glpi-agent-cron-1.2-1.noarch.rpm
# yum install glpi-agent-task-network-1.2-1.noarch.rpm

設定

通信先サーバーなどの設定を行います。
tagのところにagentをインストールした機器自身のFQDNを設定します。
ここで設定しているuser, passwordはGLPIサーバー側でbasic認証を設定している場合に必要です。GLPIのログインアカウントではありません。

# diff /etc/glpi-agent/agent.cfg /etc/glpi-agent/agent.cfg.20220422
12c12
< server = http://glpi-server.example.com/
---
> #server = http://server.domain.com/front/inventory.php
16c16
< local = /tmp
---
> #local = /tmp
72c72
< user = glpi
---
> user =
74c74
< password = foobar
---
> password =
95c95
< httpd-trust = 127.0.0.1/32,GLPIサーバーのIPアドレス/32
---
> httpd-trust =
117c117
< tag = amzn2.example.com
---
> tag =

ではAgentを起動してします。

# systemctl enable glpi-agent
# systemctl start glpi-agent
# systemctl status glpi-agent
● glpi-agent.service - GLPI agent
   Loaded: loaded (/usr/lib/systemd/system/glpi-agent.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-04-22 07:05:17 UTC; 45min ago
     Docs: man:glpi-agent
 Main PID: 4184 (glpi-agent (tag)
   CGroup: /system.slice/glpi-agent.service
           └─4184 glpi-agent (tag amzn2.example.com): waiting

Apr 22 07:17:15 amzn2.example.com glpi-agent[4207]: running task Inventory
Apr 22 07:17:15 amzn2.example.com glpi-agent[4207]: New inventory from amzn2.example.com-2022-04-22-05-38-59 ....com)
Apr 22 07:17:16 amzn2.example.com glpi-agent[4207]: Inventory saved in /tmp/amzn2.example.com-2022-04-22-05-38-59.xml
Apr 22 07:17:17 amzn2.example.com glpi-agent[4252]: running task RemoteInventory
Apr 22 07:17:17 amzn2.example.com glpi-agent[4184]: target local0: next run: Fri Apr 22 08:11:07 2022 - /tmp
Apr 22 07:35:55 amzn2.example.com glpi-agent[4184]: target server0: server http://glpi-server.example.com/glpi/
Apr 22 07:35:55 amzn2.example.com glpi-agent[4184]: sending contact request to server0
Apr 22 07:35:55 amzn2.example.com glpi-agent[4336]: running task Inventory
Apr 22 07:35:55 amzn2.example.com glpi-agent[4336]: New inventory from amzn2.example.com-2022-04-22-05-38-59 ....com)
Apr 22 07:35:58 amzn2.example.com glpi-agent[4184]: target server0: next run: Sat Apr 23 07:23:46 2022 - http://mgmt...glpi/
Hint: Some lines were ellipsized, use -l to show in full.

動作確認

しばらくするとtarget local0の処理が行われ、インベントリ情報が/tmp以下のファイルに出力されます。

# ls -l /tmp
total 276
-rw-r--r-- 1 root     root     264870 Apr 22 10:01 amzn2.example.com-2022-04-22-05-38-59.xml

さらにtarget server0の処理が行われ、GLPIサーバーに登録が行われます。
GLPIサーバーの画面はこのような内容になります。

GLPI10-Inventory

ソフトウェアとしてRPMパッケージも登録されます。
今回のAmazon Linux 2インスタンスは起動直後のVanilla状態ですが、DBサービスを起動した場合は作成したデータベースの情報も登録されます。

Next


今後はリモートコマンドの活用や登録情報のメンテナンスをやってみようと思います。