序章


Chefは、自動化された信頼性の高いスケーラブルな方法で膨大な数のコンピューターを自動化および制御できるように設計された構成管理システムです。

以前のチュートリアルでは、一般的なChefの用語をいくつか見て、Chefサーバー、ワークステーション、およびノード( Chef12またはChef11 を使用)をインストールする方法について説明しました。 )。 このガイドでは、これらのガイドを出発点として使用して、環境を自動化する方法について説明します。

この記事では、Chefクックブックの作成の基本について説明します。 クックブックは、リモートノードのChef内で特定のタスクを構成および実行できるようにする構成ユニットです。 クックブックを作成してから、クックブックで概説されている手順を実行するノードをChefに指示します。

このガイドでは、最後のレッスンで終了した3台のマシンから開始することを前提としています。 サーバー、ワークステーション、および構成変更をプッシュするノードが少なくとも1つ必要です。

クックブックの基本概念


クックブックは、Chefがノードを特定の状態にするために使用する構成とポリシーの詳細の基本単位として機能します。 これは、Chefがクックブックを使用して作業を実行し、ノード上にあるべき状態であることを確認することを意味します。

クックブックは通常、1つの特定のサービス、アプリケーション、または機能を処理するために使用されます。 たとえば、NTPを使用してノードの時刻を設定し、特定のサーバーと同期するクックブックを作成できます。 データベースアプリケーションをインストールおよび構成する場合があります。 クックブックは基本的にインフラストラクチャを選択するためのパッケージです。

クックブックはワークステーションで作成され、Chefサーバーにアップロードされます。 そこから、クックブックに記述されているレシピとポリシーを、ノードの「実行リスト」の一部としてノードに割り当てることができます。 run-listは、ノードを設定したポリシーに準拠させるために、chef-clientによってノード上で実行されるレシピとロールの順次リストです。

このようにして、クックブックに記述した構成の詳細が、クックブックに記述されているシナリオに準拠するノードに適用されます。

クックブックは、完全に自己完結型のディレクトリ構造で編成されています。 さまざまな目的で使用されるさまざまなディレクトリとファイルがあります。 ここで、より重要なもののいくつかを見ていきましょう。

レシピ


レシピは料理本の主な主力製品です。 クックブックには複数のレシピを含めることも、外部のレシピに依存させることもできます。 レシピは、さまざまなリソースの状態を宣言するために使用されます。

Chefリソースは、システムの一部とその望ましい状態を説明します。 たとえば、リソースは「パッケージxをインストールする必要があります」と言うことができます。 別のリソースには、「xサービスが実行されている必要があります」と記載されている場合があります。

レシピは、レシピを実装した場合にシステムがどのように見えるかをChefに伝えるリスト関連のリソースです。 Chefがレシピを実行すると、宣言された状態に準拠しているかどうか各リソースをチェックします。 システムが一致する場合は次のリソースに移動し、一致しない場合はリソースを指定された状態に移動しようとします。

リソースにはさまざまな種類があります。 さまざまなリソースタイプについては、こちらをご覧ください。 一般的なものは次のとおりです。

  • package :ノード上のパッケージを管理するために使用されます
  • service :ノード上のサービスを管理するために使用されます
  • user :ノード上のユーザーを管理します
  • group :グループを管理します
  • template :Rubyテンプレートが埋め込まれたファイルを管理します
  • cockbook_file :クックブックのfilesサブディレクトリからノード上の場所にファイルを転送します
  • file :ノード上のファイルの内容を管理します
  • ディレクトリ:ノード上のディレクトリを管理します
  • execute :ノードでコマンドを実行します
  • cron :ノード上の既存のcronファイルを編集します

属性


Chefの属性は基本的に設定です。 クックブックで使用したいものすべての単純なキーと値のペアと考えてください。

適用できる属性にはいくつかの種類があり、それぞれがノードが動作する最終設定よりも優先度が異なります。 クックブックレベルでは、通常、構成しているサービスまたはシステムのデフォルト属性を定義します。 これらは、特定のノードのより具体的な値によって後でオーバーライドできます。

クックブックを作成するときに、クックブックのattributesサブディレクトリでサービスの属性を設定できます。 その後、クックブックの他の部分でこれらの値を参照できます。

ファイル


クックブック内のfilesサブディレクトリには、クックブックを使用するノードに配置する静的ファイルが含まれています。

たとえば、変更する可能性が低い単純な構成ファイルはすべて、filesサブディレクトリに配置できます。 次に、レシピは、ファイルをそのディレクトリからノード上の最終的な場所に移動するリソースを宣言できます。

テンプレート


テンプレートはファイルに似ていますが、静的ではありません。 テンプレートファイルはで終わります .erb 拡張機能。これは、Rubyが埋め込まれていることを意味します。

これらは主に、属性値をファイルに置き換えて、ノードに配置される最終的なファイルバージョンを作成するために使用されます。

たとえば、サービスのデフォルトポートを定義する属性がある場合、テンプレートファイルを呼び出して、ポートが宣言されているファイル内のポイントに属性を挿入できます。 この手法を使用すると、他の場所で変更したい実際の変数を保持しながら、構成ファイルを簡単に作成できます。

Metadata.rb


当然のことながら、metadata.rbファイルはパッケージに関するメタデータを管理するために使用されます。 これには、パッケージの名前、説明などが含まれます。

また、依存関係情報なども含まれており、このクックブックが操作する必要のあるクックブックを指定できます。 これにより、Chefサーバーはノードの実行リストを正しく作成し、すべてのピースが正しく転送されるようになります。

簡単なクックブックを作成する


クックブックの操作に関連するワークフローの一部を示すために、独自のクックブックを作成します。 これは、ノードにNginxWebサーバーをインストールして構成する非常にシンプルなクックブックになります。

始めるために、私たちは私たちに行く必要があります ~/chef-repo ワークステーションのディレクトリ:

cd ~/chef-repo

そこに到達したら、ナイフを使用してクックブックを作成できます。 以前のガイドで述べたように、knifeはChefシステムとのほとんどの対話を構成するために使用されるツールです。 これを使用して、ワークステーションで作業を実行したり、Chefサーバーまたは個々のノードに接続したりできます。

クックブックを作成するための一般的な構文は次のとおりです。

ナイフクックブックcreatecookbook_name

クックブックはNginxのインストールと構成を扱うため、クックブックに適切な名前を付けます。

knife cookbook create nginx

** Creating cookbook nginx
** Creating README for cookbook: nginx
** Creating CHANGELOG for cookbook: nginx
** Creating metadata for cookbook: nginx

ここでknifeが行うことは、新しいクックブックのクックブックディレクトリ内に単純な構造を構築することです。 クックブックディレクトリとクックブック名のディレクトリに移動すると、クックブックの構造を確認できます。

cd cookbooks/nginx
ls

attributes  CHANGELOG.md  definitions  files  libraries  metadata.rb  providers  README.md  recipes  resources	templates

ご覧のとおり、これにより、クックブックの作成に使用できるフォルダーとファイル構造が作成されました。 構成の最大のチャンクであるレシピから始めましょう。

簡単なレシピを作成する


私たちが入ると recipes サブディレクトリには、というファイルがすでに存在することがわかります。 default.rb 中身:

cd recipes
ls

default.rb

これは、「nginx」レシピを参照した場合に実行されるレシピです。 ここにコードを追加します。

テキストエディタでファイルを開きます。

nano default.rb

#
# Cookbook Name:: nginx
# Recipe:: default
#
# Copyright 2014, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

現在このファイルにあるのはコメントヘッダーだけです。

Nginx Webサーバーを起動して、希望どおりに実行するために必要なことを計画することから始めることができます。 これを行うには、「リソース」を構成します。 リソースには、どのように何かを行うかについては説明されていません。 それらは、システムが完成したときにシステムの一部がどのように見えるかを説明するだけです。

まず、ソフトウェアがインストールされていることを確認する必要があります。 これを行うには、最初に「パッケージ」リソースを作成します。

package 'nginx' do
  action :install
end

この小さなコードは、Nginxのパッケージリソースを定義します。 最初の行は、リソースのタイプ(パッケージ)とリソースの名前(’nginx’)で始まります。 残りは、リソースで何をしたいのかを宣言するアクションとパラメーターのグループです。

このリソースでは、 action :install. この行は、説明しているリソースをインストールする必要があることをChefに通知します。 このレシピを実行するノードは、Nginxがインストールされていることを確認します。 もしそうなら、それはやるべきことのリストからそれをチェックします。 そうでない場合は、クライアントシステムで使用可能な方法を使用してプログラムをインストールし、チェックオフします。

サービスをインストールした後、ノードの現在の状態を調整する必要があります。 デフォルトでは、Ubuntuはインストール後にNginxを起動しないため、次のように変更する必要があります。

service 'nginx' do
  action [ :enable, :start ]
end

ここに、「サービス」タイプのリソースが表示されます。 これは、Nginxサービスコンポーネント(initまたはupstartでサーバーを管理できる部分)の場合、今すぐサービスを開始し、マシンの再起動時に自動的に開始できるようにすることを宣言します。

宣言する最後のリソースは、提供する実際のファイルです。 これは変更しない単純なファイルであるため、ファイルが必要な場所を宣言し、クックブック内のどこにファイルを取得するかを指示するだけです。

cookbook_file "/usr/share/nginx/www/index.html" do
  source "index.html"
  mode "0644"
end

「cookbook_file」リソースタイプを使用して、このファイルがクックブック自体の中で利用可能であり、そのままその場所に転送できることをChefに通知します。 この例では、ファイルをNginxのドキュメントルートに転送しています。

この例では、作成しようとしているファイル名を最初の行で指定します。 「ソース」行では、クックブック内で検索するファイルの名前を指定します。 Chefは、クックブックの「files/default」サブディレクトリ内でこのファイルを探します。

「mode」行は、作成するファイルの権限を設定します。 この場合、rootユーザーに読み取りと書き込みのアクセス許可を許可し、他のすべてのユーザーに読み取りアクセス許可を許可しています。

終了したら、このファイルを保存して閉じます。

インデックスファイルの作成


上で見たように、「index.html」というファイルをノードのドキュメントルートに移動する「cookbook_file」リソースを定義しました。 このファイルを作成する必要があります。

このファイルは、クックブックの「files/default」サブディレクトリに配置する必要があります。 次のように入力して、ここに移動します。

cd ~/chef-repo/cookbooks/nginx/files/default

このディレクトリ内に、参照したファイルを作成します。

nano index.html

このファイルは、リソースが希望どおりに動作していることを示すための非常に単純なHTMLドキュメントになります。

これをファイルに貼り付けます。

<html>
  <head>
    <title>Hello there</title>
  </head>
  <body>
    <h1>This is a test</h1>
    <p>Please work!</p>
  </body>
</html>

終了したら、ファイルを保存して閉じます。

ヘルパークックブックを作成する


先に進む前に、小さな問題を先制的に解決しましょう。 ノードが作成したクックブックをそのまま実行しようとすると、失敗する可能性があります。

これは、UbuntuリポジトリからNginxをインストールしようとし、ノードのパッケージデータベースが古くなっている可能性が高いためです。 通常、パッケージコマンドを実行する前に「sudoapt-getupdate」を実行します。

この問題に対処するために、パッケージデータベースが確実に更新されるようにすることだけを目的とした簡単なクックブックを作成できます。

これは、以前に使用したのと同じナイフ構文を使用して実行できます。 このクックブックを「apt」と呼びましょう。

knife cookbook create apt

これにより、Nginxクックブックを最初に使用したときと同じ種類のディレクトリ構造が作成されます。

追いかけっこをして、新しいクックブックのデフォルトレシピを編集しましょう。

nano ~/chef-repo/cookbooks/apt/recipes/default.rb

このファイルでは、「実行」リソースを宣言します。 これは、ノードで実行するコマンドを定義する方法にすぎません。

リソースは次のようになります。

execute "apt-get update" do
  command "apt-get update"
end

最初の行は、リソースの名前を示しています。 この例では、簡単にするためにリソースをこれと呼んでいます。 「コマンド」属性が定義されている場合(これまでに行ったように)、これが実際に実行されるコマンドです。

これらはまったく同じなので、少しでも問題ありません。

ファイルを保存して閉じます。

新しいクックブックができたので、Nginxクックブックの前にこれを確実に実行する方法がいくつかあります。 Nginxクックブックの前にノードの実行リストに追加することもできますが、Nginxクックブック自体に関連付けることもできます。

Nginx用に構成するすべてのノードで「nginx」クックブックの前に「apt」クックブックを追加することを覚えておく必要がないため、これはおそらくより良いオプションです。

これを実現するには、Nginxクックブックのいくつかの調整が必要です。 まず、Nginxレシピファイルをもう一度開きます。

nano ~/chef-repo/cookbooks/nginx/recipes/default.rb

このクックブックの上部で、定義した他のリソースの前に、次のように入力して「apt」のデフォルトレシピを読み取ることができます。

include_recipe“ apt”

パッケージ'nginx'do action:install end

service'nginx' do action [:enable、:start] end

Cookbook_file“ /usr/share/nginx/www/index.html” do source“ index.html” mode“ 0644” end

ファイルを保存して閉じます。

編集する必要がある他のファイルは metadata.rb ファイル。 このファイルは、Chefサーバーが実行リストをノードに送信するときにチェックされ、他のどのレシピを実行リストに追加する必要があるかを確認します。

今すぐファイルを開きます。

nano ~/chef-repo/cookbooks/nginx/metadata.rb

ファイルの最後に、次の行を追加できます。

名前'nginx'メンテナ'YOUR_COMPANY_NAME'メンテナ_メール'YOUR_EMAIL'ライセンス'無断転載禁止'description'nginxのインストール/設定'long_descriptionIO.read(File.join(File.dirname( ファイル )、 '  README.md  '))バージョン' 0.1.0 '

「apt」に依存

これが完了すると、Nginxクックブックはaptクックブックに依存してパッケージデータベースの更新を処理します。

クックブックをノードに追加します


基本的なクックブックが完成したので、それらをシェフサーバーにアップロードできます。

次のように入力することで、個別に行うことができます。

knife cookbook upload apt
knife cookbook upload nginx

または、次のように入力してすべてをアップロードできます。

knife cookbook upload -a

いずれにせよ、レシピはChefサーバーにアップロードされます。

これで、ノードの実行リストを変更できます。 これは、次のように入力することで簡単に実行できます。

ナイフノード編集name_of_node

使用可能なノードの名前を見つける必要がある場合は、次のように入力できます。

knife node list

client1

私たちの目的のために、これを入力すると、次のようなファイルが得られます。

knife node edit client1

{
  "name": "client1",
  "chef_environment": "_default",
  "normal": {
    "tags": [

    ]
  },
  "run_list": [

  ]
}

これが機能する前に、EDITOR環境変数を設定する必要がある場合があります。 これを行うには、次のように入力します。

export EDITOR = name_of_editor

ご覧のとおり、これはノードのいくつかの側面を説明する単純なJSONドキュメントです。 現在空の「run_list」配列を確認できます。

次の形式を使用して、Nginxクックブックをその配列に追加できます。

「recipe[ name_of_recipe ]」

終了すると、ファイルは次のようになります。

{
  "name": "client1",
  "chef_environment": "_default",
  "normal": {
    "tags": [

    ]
  },
  "run_list": [
    "recipe[nginx]"
  ]
}

ファイルを保存して閉じ、新しい設定を実装します。

これで、ノードにSSHで接続し、Chefクライアントソフトウェアを実行できます。 これにより、クライアントはChefサーバーにチェックインします。 これを実行すると、割り当てられた新しい実行リストが表示されます。

ノードにSSHで接続し、次を実行します。

sudo chef-client

Starting Chef Client, version 11.8.2
resolving cookbooks for run list: ["nginx"]
Synchronizing Cookbooks:
  - apt
  - nginx
Compiling Cookbooks...
Converging 4 resources
Recipe: apt::default
  * execute[apt-get update] action run
    - execute apt-get update

Recipe: nginx::default
  * package[nginx] action install (up to date)
  * service[nginx] action enable
    - enable service service[nginx]

  * service[nginx] action start (up to date)
  * cookbook_file[/usr/share/nginx/www/index.html] action create (up to date)
Chef Client finished, 2 resources updated

ご覧のとおり、作成した実行リストに含まれていなくても、aptクックブックが送信されて実行されました。 これは、Chefが依存関係をインテリジェントに解決し、ノードで実行する前に実際の実行リストを変更したためです。

:あるクックブックまたはレシピが別のクックブックまたはレシピの前に実行されるようにするためのさまざまな方法があります。 依存関係を追加することは1つの選択肢にすぎず、他の方法が推奨される場合があります。

ノードのIPアドレスまたはドメイン名に移動することで、これが機能することを確認できます。

http:// node_domain_or_IP

次のようなものが表示されます。

おめでとうございます。Chefクックブックを使用して最初のノードを構成しました。

結論


これは非常に単純な例であり、サーバーを手動で構成するよりも多くの時間を節約できなかったと思われますが、インフラストラクチャを構築するこの方法の可能性を理解できるようになることを願っています。

さまざまな種類のサーバーの迅速な展開と構成が可能になるだけでなく、すべてのマシンの正確な構成を確実に把握できます。 これにより、インフラストラクチャを検証およびテストでき、気まぐれでインフラストラクチャをすばやく再展開するために必要なフレームワークも提供されます。

ジャスティン・エリングウッド