Sparrowdoツールを使用したシェフクックブックの開発とテスト

こんにちは シェフクックブックと関連インフラストラクチャの開発について多くのことが書かれており、この分野にはすでに多くのツールがあります。 その中には、 vagranttest kitchenfood criticchef specminitest-chef-handlerserverspecinspecなどのソリューションをリストできます。 それらはすべて、シェフクックブックとそれらが構成するインフラストラクチャの産業開発とテストをある程度まで簡素化および加速します。







この領域があなたの近くにあり、Perl言語(より正確にはPerl6 )に関係がある場合は、このトピックへようこそ。







そこで、今日はシェフクックブックの開発とテストの際にSparrowdoをどのように使用するかを説明します。









最初に、少し紹介します。







Sparrowdoとは何ですか?



Sparrowdoは、リモートサーバー上のsshを介してこれらのプラグインを実行できる、 Sparrowプラグインシステムのアドオンです。 同様に、 sparrowプラグインは、 Perl5およびBashで主に(ただしこれらの言語に限定されない)記述されたさまざまな自動化スクリプトです。 habrahabrに関する一連の記事はすべてこれについてすでに書かれていますので、興味がある場合は、sparrowという単語で検索クエリを入力し、それに応じて読むことができます 。 しかし、 初心者の読者には明らかなように、他のリモートサーバーでさまざまなタスクを開始する集中サーバーがある場合、これはすべてアンシブルイデオロギーに非常に似ています。







そのため、サーバーでchefクライアントを実行したまたは実行する前に 、さまざまなsparrowプラグインを実行し、さまざまなチェックを実行して、展開手順が成功したか特定の条件を満たすかを判断できます。







これはすべてserverspecまたはinspecのスタイルのスクリプトと非常に似ていますが、唯一の違いは、雀プラグインは多目的であり、テストおよび監査タスクに限定されないことです。シェフの料理本に詰め込みたい。







実際、sparrowdoはサーバーを自動的にセットアップするタスクに非常に便利に「適合する」ので、シェフクライアント自体を起動することもできます。しかし、かなり理論的には、特定の単純だが重要な例を見てみましょう。







nginx + tomcatをインストールするためのクックブックを作成し、sparrowdoでテストします



簡単にするために、事前にインストールされたchefクライアントでec2インスタンスを使用し、ローカルchefサーバーで構成します。 つまり システムの初期セットアップに関連するすべての問題は、「括弧の外側」に残されます。 さらに、インスタンスへのsshキーがあり、sudoでログインします。







$ ssh remote.server
      
      





サーバーアクセスの問題から少し離れて、シンボリックCookieを作成しましょう。









クックブックを書く



コードは簡単です。この記事の焦点はシェフクックブックを書くことを学ぶことではなく、sparrowdo / sparrowと組み合わせてシェフを使用することです。







 # recipes/default.rb package 'nginx' package 'tomcat7' service 'nginx' do action [ :enable, :start ] end service 'tomcat7' do action [ :enable, :start ] end template '/etc/nginx/conf.d/default.conf' do source 'nginx.conf' mode '644' variables :tomcat_redirect => node[:tomcat_redirect] notifies :restart, 'service[nginx]', :delayed end # attributes/default.rb default[:tomcat_redirect] = false # cat templates/default/nginx.conf server { listen 80 default_server; server_name _; root /usr/share/nginx/html; index index.html index.htm; <% if @tomcat_redirect %> location / { proxy_pass http://127.0.0.1:8080; } <% else %> location / { try_files $uri $uri/ $uri.html =404; } <% end %> error_page 404 /404.html; location = /404.html { } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { } }
      
      





クックブックコードに対するコメントは不要だと思いますtomcat_redirect



属性tomcat_redirect



falseに設定されているため、デフォルトではnginxはTomcatでプロキシを実行しないことに注意してください。 最後に、nginx-app Cookieを呼び出して、シェフサーバーにアップロードします。







 # cat metadata.rb name 'app-nginx' version '0.0.1' $ knife cookbook upload app-nginx -o ../
      
      





次に、作成したCookieをサーバーで実際に実行します。







sparrowdoスクリプトを書く



Sparrowdoスクリプト-リモートサーバーでタスクを実行するPerl6コード。 タスクは、パラメーター付きの雀プラグインにすぎません。 私が言ったように、私たちはスズメを使ってシェフクライアントも起動します







 $ cat sparrowfile task_run %( task => "set up chef run list an attributes", plugin => "file", parameters => %( target => "/tmp/chef.json", content => q:to/JSON/, { "run_list" : [ "recipe[nginx-app]", ], "tomcat_redirect" : false } JSON ), ); task_run %( task => "run chef-client", plugin => "bash", parameters => %( command => "chef-client --color --json /tmp/chef.json" ), );
      
      





コードに関する簡単な説明。









これで、スクリプトを実行できます。 なぜなら 指定されたsparrowサーバーでは、クライアントはまだインストールされていません。最初にクライアントをインストールするようにsparrowdoに要求する--bootstrapオプションで開始します。これにより、すべてのタスクが実行されます。







 $ sparrowdo --http_proxy=$http_proxy --https_proxy=$https_proxy --host=remote.server --ssh_user=root --no_sudo --no_index_update running sparrow tasks on remote.server ... target OS is - centos6 push task <set up chef run list an attributes> plg <file> OK push task <run chef-client> plg <bash> OK set up task box file - /tmp/sparrowdo-box.json - OK public@file is uptodate (0.0.2) public@bash is uptodate (0.1.1) running task box from /tmp/sparrowdo-box.json ... <set-up-chef-run-list-an-attributes> / started set target content target created set target mode to 644 ok scenario succeeded ok output match /target (created|removed)/ ok output match 'set target content' STATUS SUCCEED <run-chef-client> / started [2016-10-19T10:02:48+00:00] INFO: Forking chef instance to converge... [2016-10-19T10:02:48+00:00] INFO: *** Chef 11.16.4 *** [2016-10-19T10:02:48+00:00] INFO: Chef-client pid: 5389 [2016-10-19T10:02:49+00:00] INFO: Setting the run_list to ["recipe[nginx-app]"] from CLI options [2016-10-19T10:02:49+00:00] INFO: Run List is [recipe[nginx-app]] [2016-10-19T10:02:49+00:00] INFO: Run List expands to [nginx-app] [2016-10-19T10:02:49+00:00] INFO: Starting Chef Run for sandbox-generic-ci-i-ef7cbedf [2016-10-19T10:02:49+00:00] INFO: Running start handlers [2016-10-19T10:02:49+00:00] INFO: Start handlers complete. [2016-10-19T10:02:49+00:00] INFO: HTTP Request Returned 404 Not Found: [2016-10-19T10:02:50+00:00] INFO: Loading cookbooks [nginx-app@0.0.1] [2016-10-19T10:02:50+00:00] INFO: Processing package[nginx] action install (nginx-app::default line 1) [2016-10-19T10:02:53+00:00] INFO: Processing package[tomcat7] action install (nginx-app::default line 3) [2016-10-19T10:02:53+00:00] INFO: Processing service[nginx] action enable (nginx-app::default line 5) [2016-10-19T10:02:53+00:00] INFO: Processing service[nginx] action start (nginx-app::default line 5) [2016-10-19T10:02:53+00:00] INFO: Processing service[tomcat7] action enable (nginx-app::default line 9) [2016-10-19T10:02:53+00:00] INFO: Processing service[tomcat7] action start (nginx-app::default line 9) [2016-10-19T10:02:53+00:00] INFO: Processing template[/etc/nginx/conf.d/default.conf] action create (nginx-app::default line 13) [2016-10-19T10:02:53+00:00] INFO: Chef Run complete in 3.604494597 seconds [2016-10-19T10:02:53+00:00] INFO: Running report handlers [2016-10-19T10:02:53+00:00] INFO: Report handlers complete bash-command-done ok scenario succeeded ok output match 'bash-command-done' STATUS SUCCEED
      
      





スクリプトの最初の実行は正常に機能しました。cookieで指定されたロジックに従って、chefクライアントが必要なパッケージをインストールして構成したことがわかります。







sparrowdoスクリプトを少し変更して、次の起動時にクライアントのシェフからの出力を最小限に抑えます。







 task_run %( task => "run chef-client", plugin => "bash", parameters => %( command => "chef-client --color --json /tmp/chef.json -l error" ), );
      
      





次は、デプロイが成功したことを確認するいくつかのチェックを追加します。









これは不必要に見えるかもしれません chefは、サービスの起動に関連するすべてのエラーの処理/出力を保証しますが、経験は、これは必ずしも十分ではないことを示しています。たとえば、chefクライアントが正常に完了した後、サービスが少し遅れることがあります。 そして、sparrowdoを使用してこれを行うのは非常に簡単であるため、さらに2、3の「並行」テスト(クライアントのシェフのコンテキストの外で実行できる)を書くことは決して痛いことはありません。 sparrowdoスクリプトにいくつかのタスクを追加します。







 task_run %( task => 'check nginx process', plugin => 'proc-validate', parameters => %( pid_file => '/var/run/nginx.pid', footprint => 'nginx.*master' ) ); task_run %( task => 'check tomcat7 process', plugin => 'proc-validate', parameters => %( pid_file => '/var/run/tomcat7.pid', footprint => 'java' ) );
      
      





ここでは、所定のPIDファイルを使用してプロセスの存在を確認し、実行中のプロセスのリストの「トレース」で検索するproc-validateプラグインを使用しました。







  $ sparrowdo --http_proxy=$http_proxy --https_proxy=$https_proxy --host=remote.server --ssh_user=root --no_sudo --no_index_update running sparrow tasks on remote.server ... target OS is - centos6 push task <set up chef run list an attributes> plg <file> OK push task <run chef-client> plg <bash> OK push task <check nginx process> plg <proc-validate> OK push task <check tomcat7 process> plg <proc-validate> OK set up task box file - /tmp/sparrowdo-box.json - OK public@file is uptodate (0.0.2) public@bash is uptodate (0.1.1) public@proc-validate is uptodate (0.0.5) running task box from /tmp/sparrowdo-box.json ... <set-up-chef-run-list-an-attributes> / started set target content target created set target mode to 644 ok scenario succeeded ok output match /target (created|removed)/ ok output match 'set target content' STATUS SUCCEED <run-chef-client> / started bash-command-done ok scenario succeeded ok output match 'bash-command-done' STATUS SUCCEED <check-nginx-process> / started pid_file - /var/run/nginx.pid pid file exists pid:4526 process footprint: 4526 nginx: master process /usr/ 31:47 ok scenario succeeded ok output match /pid_file - \S+/ ok output match 'pid file exists' ok output match /pid:\d+/ ok output match /process footprint:/ ok 'process footprint: 4526 nginx: master process /usr/ 31:47' match /nginx.*master/ STATUS SUCCEED <check-tomcat7-process> / started pid_file - /var/run/tomcat7.pid pid file exists pid:29458 process footprint: 29458 /usr/lib/jvm/java-1.6.0/bin 22:11:25 ok scenario succeeded ok output match /pid_file - \S+/ ok output match 'pid file exists' ok output match /pid:\d+/ ok output match /process footprint:/ ok 'process footprint: 29458 /usr/lib/jvm/java-1.6.0/bin 22:11:25' match /java/ STATUS SUCCEED
      
      





素晴らしい。 サービスが実際に実行されていることがわかります。 このアプローチのもう1つの利点は、chefクライアント自体を実行せずに、既にデプロイされているサーバーでこのようなチェックをいつでも実行できることです。







では、先に進みましょう。 httpでサービスの可用性を確認してください。 これを行うには、 curlユーティリティを使用します。sparrowdoスクリプトに追加する必要があるものは次のとおりです。







 task_run %( task => 'install curl', plugin => 'package-generic', parameters => %( list => 'curl', ) ); task_run %( task => 'check nginx http port', plugin => 'bash', parameters => %( command => 'sleep 5; curl --retry 2 --noproxy 127.0.0.1 -f -o /dev/null -D - http://127.0.0.1', ) ); task_run %( task => 'check tomcat http port', plugin => 'bash', parameters => %( command => 'sleep 5; curl --retry 2 --noproxy 127.0.0.1 -f -o /dev/null -D - http://127.0.0.1:8080', ) );
      
      





...







スクリプトを実行します。







$ sparrowdo --http_proxy=$http_proxy --https_proxy=$https_proxy --host=remote.server --ssh_user=root --no_sudo --no_index_update









 #    ... <install-curl> / started package installer /modules/yum/ started trying to install curl ... installer - yum Installed Packages curl.x86_64 7.19.7-37.el6_4 @base/$releasever ok scenario succeeded ok output match 'Installed' STATUS SUCCEED <check-nginx-http-port> / started % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 102 3698 102 3698 0 0 3218k 0 --:--:-- --:--:-- --:--:-- 0 HTTP/1.1 200 OK Server: nginx/1.0.15 Date: Wed, 19 Oct 2016 11:30:51 GMT Content-Type: text/html Content-Length: 3698 Last-Modified: Fri, 26 Apr 2013 20:36:51 GMT Connection: keep-alive Accept-Ranges: bytes bash-command-done ok scenario succeeded ok output match 'bash-command-done' STATUS SUCCEED <check-tomcat-http-port> / started % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 11197 0 11197 0 0 1195k 0 --:--:-- --:--:-- --:--:-- 1366k HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=ISO-8859-1 Transfer-Encoding: chunked Date: Wed, 19 Oct 2016 11:30:56 GMT bash-command-done ok scenario succeeded ok output match 'bash-command-done' STATUS SUCCEED
      
      





ご覧のとおり、当社のサービスはhttpで利用できます。 パッケージをインストールするためにpackage-genericプラグインを使用して、以前にcurlユーティリティをインストールしたことに注意してください。







最後に、 tomcat_redirect



属性をtrueに設定し、nginxにtomcatへのすべてのリクエストをプロキシさせ、これが発生することを確認します。







属性を設定します。







 task_run %( task => "set up chef run list an attributes", plugin => "file", parameters => %( target => "/tmp/chef.json", content => q:to/JSON/, { "run_list" : [ "recipe[nginx-app]", ], "tomcat_redirect" : true } JSON ), );
      
      





expect_stdout



パラメーターをbash



プラグインの起動にexpect_stdout



ます。これにより、指定された正規表現に対して実行されたコマンドのSTDOUTが強制的にチェックされます。







 task_run %( task => 'check nginx http port', plugin => 'bash', parameters => %( command => 'sleep 5; curl --retry 2 --noproxy 127.0.0.1 -f http://127.0.0.1 | head -n 10', expect_stdout => 'Apache Tomcat' ) );
      
      





スクリプトを実行します。







 $ sparrowdo --http_proxy=$http_proxy --https_proxy=$https_proxy --host=remote.server --ssh_user=root --no_sudo --no_index_update #    ... <check-nginx-http-port> / started <!DOCTYPE html> <html lang="en"> <head> <title>Apache Tomcat/7.0.57</title> <link href="favicon.ico" rel="icon" type="image/x-icon" /> <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" /> <link href="tomcat.css" rel="stylesheet" type="text/css" /> % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 curl: (23) Failed writing body (146 != 3151) bash-command-done ok scenario succeeded ok output match 'bash-command-done' ok output match /Apache Tomcat/ STATUS SUCCEED <check-tomcat-http-port> / started % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 11197 0 11197 0 0 3364k 0 --:--:-- --:--:-- --:--:-- 0 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=ISO-8859-1 Transfer-Encoding: chunked Date: Wed, 19 Oct 2016 12:03:02 GMT bash-command-done ok scenario succeeded ok output match 'bash-command-done' STATUS SUCCEED
      
      





おわりに



この簡単な例では、シェフクックブックの開発およびテストプロセスでsparrowdo / sparrowを使用する方法を学びました。









実際、もっとたくさん書くことができます。 sparrowdoとchefを使用するケースは本当にたくさんあります。 既製のプラグインをここで入手するか、独自のプラグインを作成します。これは本当に難しくなく 、開発でsparrowdoを使用し始めるためです。







serverspec / inspecなどの他の同様のツールと好意的に比較するスズメのシステム全体の機能は、機能が「カーネル内」に組み込まれていないことですが、ユーザーは自分の現実に合ったプラグインを簡単かつ迅速に記述し、すぐに使用できますsparrowdoでは、Perl6で記述されたいわゆるsparrowdo モジュールを使用して、sparrowプラグインに基づいて、より複雑なスクリプトを「コンパイル」することもできます(興味があれば、これについて別の記事を書くことができます)。







この記事があなたの興味をそそったなら-書いて、コメントして、質問して... ...建設的に批判してください:))私は感謝します。 通常、ドキュメントとsparrowプラグインのリポジトリの単一のセンターはhttps://sparrowhub.orgです







ありがとう







PS記事の最後で、いつものように、記事のトピックに間接的に関連する簡単な質問。








All Articles