ご挨拶!
前回の記事で、 SparrowHub-システム管理用の既製ユーティリティのリポジトリについて書いた。 さて、時間が経ちました。今、これらのユーティリティを開発し、SparrowHubにアップロードして誰でも再利用できるようにする方法についてお話したいと思います。
プラグインの作成の具体例を示す前に、スクリプトが実際に開発されているSparrowフレームワークのイデオロギーを少し明らかにしたいと思います。
第一に、Sparrowはスクリプト用のハードDSLを一切課していません。 Sparrowがサポートする3つの言語を選択できます。
- Perl
- ルビー
- バッシュ
したがって、必要な作業を行う通常のスクリプトを作成し、プラグインで「ラップ」するだけで、SparrowHubにダウンロードして再利用する準備が整います。 もちろん、実際にはそうではありませんが、少し簡単にしました。 スクリプトを開発するとき、ユーティリティを「スズメ」形式のプラグインにパッケージ化できるように、いくつかの規則(たとえば、スクリプトファイルの命名など)に引き続き従います。
Sparrowプラグインのもう1つの機能は、統合されたスクリプトテストシステムです。 ビルトイン。通常の完了コードに加えて、追加設定なしでスクリプトの追加チェックを実行できるため。 場合によっては、このチェックシステムは非常に便利です。 詳細は、具体的な例で明らかになります。
さて、Sparrowプラグインの前の機能に関連する3番目の機能は、作業の結果がTAP形式で表示されることです。 簡単に言えば、TAPはプログラムモジュールのテスト用に開発された特別なプロトコル(および出力形式)であり、Perlで単体テストを記述するための標準ですが、特定のプログラミング言語に縛られておらず、多くのシステムおよび言語でサポートされています。
したがって、システム管理スクリプトの記述を、スクリプト自体の動作をテストするシステムと組み合わせる試みが、Sparrowで行われました(どのように成功したプラクティスが示されます;))。 同様のアイデアは、さまざまな構成管理システム、たとえばchefで見ることができます。これは、 ミニテストシェフハンドラーであり、 chef inspecの新しい開発です。
そこで、最も単純なSparrowプラグインを作成します。
nginxパッケージをインストールし、nginxサーバーを起動するように構成するとします。 タスクを2つのシナリオに分割します-実際にパッケージ自体をインストールし、サーバーをセットアップします。 構成とは、サーバーをスタートアップに追加し、サーバーを起動し、ポート80でサーバーにアクセスできる最も簡単なテストを意味します。オペレーティングシステムはUbuntuです。 例が非常に推測的で些細なものであることをすぐに予約してください。システム管理者やプログラマは誰でも同様のタスクを実行できますが、Sparrowプラグインの記述方法を説明するのに適しています。
したがって、2つのシナリオがあります。
- パッケージのインストール
- サーバーチンキ
インストールスクリプト
プラグインを作成する言語として、 Bashを選択します この問題の声明(オペレーティングシステムのチューニングレベルでの非常に単純なアクション)では、それは私たちの主題分野に最も適しています。 原則として、すべて同じものをPerlまたはRubyで実装できます。
Sparrowに関しては、実行可能な特定のスクリプトがあり、stdoutに何かを表示するという意味で、実行スクリプトは履歴です(比speaking的に言えば、トレースを残します)。 スクリプトを実行した後、Sparrowでは2種類のチェックを実行できます。
- 完了コードが成功したことを確認します(== 0)
- スクリプトのテキスト出力に特定のデータが含まれていることを確認します(文字列と正規表現への準拠を確認します)
スクリプトの命名規則は単純です-ベース名は、スクリプト言語に適した拡張子を持つstory
でなければなりません:
- Bash-story.bash
- Perl-story.pl
- ルビー-story.rb
Bashの場合、次のようなストーリーがあります。
$ cat story.bash sudo DEBIAN_FRONTEND=noninteractive apt-get -y install nginx >/dev/null dpkg -s nginx | grep Status:
このスクリプトを手で起動すると、出力が表示されます。
$ bash story.bash Status: install ok installed
これで、このスクリプトの正しい動作のチェックを簡単に書くことができます。 Sparrowでは、これはテストファイルと呼ばれるものを使用して行われます。 各ストーリーには独自の検証ファイルがあり、実行するスクリプトと同じディレクトリにあり、story.checkと呼ばれる必要があります。 検証ファイルの内容は、検証ルールOutthentic :: DSLの言語で作成する必要があります。これは、任意のプログラムのテキスト出力の分析用に特別に開発されました。 DSLにはさまざまな機能がありますが、実際には、特定の行が1行ずつ含まれているかどうか、および正規表現の一致を確認するだけで十分な場合があります。 そのため、 story.check
は次のようになります。
$ cat story.check install ok installed
これで、Sparrowを使用してストーリーを実行できます。 これがプラグインのプロトタイプになります。 これを行うには、Sparrowプラグインを開発および実行するためのツールを提供するCPANからSparrowモジュールをインストールします。
$ cpanm Sparrow
スクリプトが置かれているディレクトリに移動し、 strun
ユーティリティを使用してstrun
ます。これは、Sparrow形式でスクリプトを実行するためのクライアントです。
$ strun /tmp/.outthentic/30382/home/melezhik/projects/nginx-example/story.t .. # Status: install ok installed ok 1 - output match 'Status: install ok installed' 1..1 ok All tests successful. Files=1, Tests=1, 1 wallclock secs ( 0.01 usr 0.00 sys + 0.51 cusr 0.03 csys = 0.55 CPU) Result: PASS
既に述べたように、スクリプトの結果をTAPレポートの形式で取得しました。これは、スクリプトが正しく機能したことを示しています。 ここで何が起こったのですか? strun
はスクリプトを実行し、次のことを確認しました。
- 正常終了コード
- スクリプトは、「Status:install ok installed」という行をstdoutに出力しました
セットアップスクリプト
次に、同じ方法で、検証ファイルとともにnginxサーバー構成スクリプトを作成します。 各ストーリーは独自のディレクトリにある必要があるため、構成スクリプト用に個別のディレクトリを作成します。
$ mkdir nginx-setup $ cd nginx-setup
セットアップスクリプトは非常に簡単です。
$ cat nginx-setup/story.bash sudo update-rc.d nginx defaults sudo service nginx start sudo service nginx status curl -sf -o /dev/null 127.0.0.1
開始するには、手でスクリプトを実行して出力を確認するだけです。
System start/stop links for /etc/init.d/nginx already exist. * nginx is running
これで、検証ファイルを作成できます。
$ cat nginx-setup/story.check nginx is running
すばらしい、 strun
クライアントを介してスクリプトを再度実行します。
$ strun /tmp/.outthentic/32332/home/melezhik/projects/nginx-example/nginx-setup/story.t .. # System start/stop links for /etc/init.d/nginx already exist. # * nginx is running ok 1 - output match 'nginx is running' 1..1 ok /tmp/.outthentic/32332/home/melezhik/projects/nginx-example/story.t .............. # Status: install ok installed ok 1 - output match 'Status: install ok installed' 1..1 ok All tests successful. Files=2, Tests=2, 1 wallclock secs ( 0.01 usr 0.00 sys + 0.58 cusr 0.08 csys = 0.67 CPU) Result: PASS
目標を達成したと確信しています。 Nginxはインストールされ、実行され、スタートアップに追加され、ポート80で利用可能です。
ただし、注意深い読者には、スクリプトセットの1つの機能、つまりnginxインストールスクリプトが構成スクリプトの後に実行されることがわかります。 問題は、 デフォルトでは、 strun
クライアントによって起動されたすべてのストーリーは独立していると見なされ、 接続されていないため、一般的に言えば、起動の順序は保証されておらず、さらに多くの異なるストーリーを並列モードで実行できます( proveユーティリティのパラメーターに関するドキュメントを参照してください) strunはテストの起動をディスパッチします)。
明らかに、この動作では、nginxパッケージがシステムにまだインストールされていないときに初めてプラグインを起動すると、エラーが発生します。
どうする? スクリプトが所定の順序で実行されるようにする方法。 まずnginxパッケージをインストールしてから、サーバーを構成する必要があります。 これを行うために、Sparrowにはモジュールまたはセカンダリ( ダウンストリーム )ストーリーの概念があります。
一次および二次シナリオ
セカンダリストーリーは、メインスクリプト(メイン( アップストリーム )ストーリー)を実行する前に呼び出すことができるシナリオです。 この場合、主なシナリオは構成スクリプトであり、副次的なシナリオはパッケージインストールスクリプトです。 セカンダリスクリプトは、 strun
クライアントによって直接実行されることはありません。メインスクリプトで明示的にstrun
ようにする必要があります。 方法は次のとおりです。
スクリプトがセカンダリになるには、対応するストーリーを./modules
というディレクトリに配置する必要があります。そのため、 strun
はこのストーリーがセカンダリであることを理解します。
$ mkdir -p modules/nginx-install $ mv story.bash story.check modules/nginx-install
二次履歴を呼び出すには、いわゆるhook
ファイルを使用します。これは、Sparrowのメインメカニズムです。これにより、メインスクリプトを実行する前に、 strun
クライアントのロジックを拡張し、サードパーティコードへの呼び出しを追加できます。
$ cat nginx-setup/hook.bash run_story nginx-install
フックAPIの詳細にはrun_story
ませんが、この例では、フックファイルで、 run_story
関数を使用してnginx-install
マイナーヒストリを呼び出しているとしか言えません。 関数の引数は、 modules
フラグメントが除外されるセカンダリヒストリが置かれているディレクトリへのパスであることに注意してください。
したがって、修正されたコードを実行します。
$ strun /tmp/.outthentic/367/home/melezhik/projects/nginx-example/nginx-setup/story.t .. # Status: install ok installed ok 1 - output match 'Status: install ok installed' # System start/stop links for /etc/init.d/nginx already exist. # * nginx is running ok 2 - output match 'nginx is running' 1..2 ok All tests successful. Files=1, Tests=2, 1 wallclock secs ( 0.01 usr 0.00 sys + 0.54 cusr 0.06 csys = 0.61 CPU) Result: PASS
結論から判断すると、構成スクリプトの前にインストールスクリプトが開始されることを確認します。
strun
クライアントのstrun
でメインストーリーとセカンダリストーリーの詳細をお読みください。
中央のSparrowHubリポジトリへのプラグインのダウンロード
スクリプトをテストし、すべてが正常に機能することを確認したら、スクリプトを世界中の人々と共有し、中央リポジトリであるSparrowHubにアップロードする準備ができました。 これを行うには、2つの簡単な手順を実行します。
- サイトhttps://sparrowhub.orgに登録する
- ログインしてプラグイン開発者トークンを取得する
その後、独自のオーサーシップでプラグインをアップロードできます。
ストーリーが存在するプロジェクトのルートで、プラグインメタデータを含むファイルを作成します。
$ cat sparrow.json { "name" : "nginx-example", "version" : "0.1.0", "description" : "simple nginx server installer for Ubuntu", "url" : "https://github.com/melezhik/nginx-example.git" }
ファイル形式についてはここで詳しく説明しますが、詳細については説明しません。 Sparrowはバージョン管理プラグインをサポートしているため、同じプラグインの異なるバージョンをダウンロードしてインストールできると言うことだけが重要です。
スクリプトディレクトリからsparrow managerコマンドを実行し、SparrowHubで識別子を示します
$ export sph_user=melezhik $ export sph_token=FOO-BAR-BAZ-FOO-BAR-BAZ $ sparrow plg upload sparrow.json file validated ... plugin nginx-example version 0.001000 upload OK
すべてが素晴らしいです。 プラグインがアップロードされ、SparrowHubリポジトリに配置されます。 別のサーバーに移動して、このプラグインを使用できます。
$ ssh some-other-host $ sparrow index update $ sparrow plg install nginx-example $ sparrow plg run nginx-example
おわりに
この記事では、SparrowシステムとOutthentic開発環境のすべての機能と微妙さを説明する方法はありません。 私はあなたに論文、他に何を明らかにすることができますか。 (読者がこれに興味を持っているなら、以下の記事でそれが可能になります)。
- PerlおよびRuby用のOutthenitc API
- マイナーストーリーのオプション
- Outthentic :: DSL-プレーンテキストバリデーター(検証ルールジェネレーター、イベント、キャップ、テキストブロックなど)
- Sparrowプラグインの構成(タスク、ランタイムパラメーター、YAML構成ファイル、および構成::一般形式)
PS建設的な批判を期待します:)、そしてもちろん、新しいプラグイン開発者をSparrowHubプロジェクトに引き付けます。
よろしくお願いします!