[chef]練習するための環境を用意する記事が実はあまりない気がしたので

Chefは仕事でも使ってるのですが、基本的には社内で誰かが書いてくれた
レシピをもらって、適宜少しだけカスタマイズするばかりでした

が、CTFの影響もあって割とニッチな環境が欲しかったり
どの程度までChefだけでカスタマイズできるのか、そういう部分が全然わかってなかったので
最初から一人でもレシピ書けるようになりたいなぁ、と再入門してみようと思いました。

ただ、ぐぐっても意外にも(少なくとも自分が求めるような)いい感じのChefのチュートリアルって
見つからなくて、様々な記事を自分でつぎはぎしないと、上手くいかなかったので
まとめました。

以下のような事を実現できることを目標にします。

  1. 気軽に繰り返し検証できる
  2. ChefとKnifeがごっちゃにならずに理解したい
  3. Chef-clientのローカルモードを使えるようにしたい

1が存外一番大事だと思っていて、そういうプラグインもずっと前からあるんだけど、
それがChefの入門としては軽く取り上げられているだけだったので挙げました
(ChefじゃなくてVagrantでやるんだから当然っちゃ当然ですが)

2は、僕が一番最初にChefやってみようと思って困惑した箇所
Chefの入門記事を読むと大体出てくるのがKnife。KnifeはChefの
なんなのか、をハッキリしたいです。

3は、最近では今まで主流だったChef-soloの運用からの移行が
公式でアナウンスされているので、これからガシガシ使っていくなら
Chef-clientローカルモードで、体系的な手順を抑えておきたいと思って挙げました。

以下からは
[host]と書いてあれば自分が直接ログインしているPC、[node]は用意した仮想環境を
指します。

1. まずは繰り返し練習できる環境を作る

こちらはChefではなく、Vagrantのお話。
ただ、失敗してもすぐに戻して、また試して、を繰り返せる環境は
プログラミングだけでなく、重要だと思います。

Vagrantが何か、Vagrantのインストール方法、は割愛します。
ぐぐって公式ページ読んでダウンロードすれば終わりです。

Vagrantで仮想環境を用意する

box名は、自分でローカルに保持しているものでもよいしVagrantCloud(今はAtlus)から探してきて直接その名前を指定しても大丈夫です。

僕はVagrantCloudにあった以下のものを利用しました。

これでSSHログインできれていれば準備OK。

ちなみに、VagrantCloudで見つけたBoxの名前を指定すると、自動で
Boxをローカルにダウンロードしてきます。便利なんですが、HDD空き容量には注意です。

僕はよく使うBoxはPC内蔵のSSDに、Boxを元に作成した仮想環境イメージは
外付けHDDに保存するように設定しています。

vagrant initしたディレクトリにVagrantfileという設定ファイルが出来上がっています。
各種設定の意味は公式リファレンスを参照してください。

saharaをインストールする

Vagrantのsaharaというプラグインをインストールすることで
Vagrantで作成した仮想環境の状態を、指定したポイントに
戻すことができます。スナップショットの、もっとライトな感じなもの、と思っていただければ
問題ないと思います。

これでインストールは完了。
使い方は以下の通りです

繰り返し、ChefのCookbookの反映状態をチェックしたければ

  1. $ vagrant sandbox on
  2. Chefのもろもろを実行
  3. 対象のノード(PC)の状態を確認
  4. $ vagrant sandbox rollback

これで1を行った状態に仮想環境が戻ります。
下記は手動でrubyをインストールして、その状態をrollbackした時の
出力のサンプルです。

これでVagrantによって、繰り返し使える仮想環境の準備ができました。


2. Chefで利用するcookbookとrecipeを書き始めてみる

2-1.Chef zeroを使う場合

2-1-1. local_modeを常に使うように設定する

クックブックを管理するディレクトリ(リポジトリ)の中に.chef/knife.rbを作成し

と記述します。これによってknife利用時にオプションを指定せずに
local_modeをオンにできます。オプションで都度指定したい場合は
省略しても問題ありません。

2-1-1′. 2015/02/24追記

knifeで収束を行いたい場合は以下のような記述も.chef/knife.rbに追記すると便利です。

2-1-2. 対象ノードにChefをインストールする

ログインユーザがrootでなければ–sudoをつける必要があります。
これで対象ノードにChef Clientがインストールされました。

-Nオプションで、nodeの名前を指定できます。
僕の場合ですと、Vagrantで作成したVMに上記のコマンドを-Nオプションなしで
実行すると必ずnodes/localhost.jsonが作成されていましたが、オプションを付与することで
nodes/chefPractice.jsonという名前で作成してくれるようになります。

2-1-3. Cookbookの開発を行う

これでcookbookのひな形がsite-cookbooksディレクトリ内に作成されます。
自分で定義するcookbookはsite-cookbooks内に作成するのが慣例らしいので、そちらを指定。
(cookbooks/ディレクトリは外部から持ってきたレシピとかを入れるところらしい。)

この中のsite-cookbooks/nmap/recipes/default.rbを以下のように編集します。

nmapというpackageをinstallする、という意味です。(そのままですが)
その後、先ほど登場したnodes/chefPractice.jsonにnmapのcookbookを追加します。

直接編集してもいいし、コマンドもあります。(可変長で、複数指定もできます。)

nmapというcookbookを適用する、という意味です。
これで準備OK

2-1-4a. knife-zeroで対象ノード上でchef-clientを実行する

オプションは適宜。詳細は$ knife zero chef_client –helpで確認できます。
現状ではknife zeroにはssh/configを見て接続する機能はないので、ユーザ名等を指定してあげましょう。

–sudoはPermission deniedが出たらつけてあげましょう(ログインするユーザがsudoできる必要があります。)

ポート番号は$ vagrant ssh-configで確認してください

2-1-4b. knife-zero経由ではなく直接chef-clientを使って収束させる

knife( solo, zero )はあくまでChefを便利に使うユーティリティソフトなので
それらがなくても、収束を行うことは可能です。

-zはローカルモードを有効に、-jはnode指定
これだけです。普段はリポジトリからgit cloneしたり、そんな感じで使えばOKでしょうか。


2-2. Chef soloを使う場合 (古いやり方で、これからはChef zeroを利用するべきらしい)

2-2-1. 対象ノードにChefをインストールする

これが終わると、ホスト側のカレントディレクトリにnodes/chefPractice.jsonというファイルが作成されます。
nodes/ディレクトリの中には対象となるノードごとに1つのjsonファイルが作成され
対象ノードにどんなレシピを適用するか、等を記述します。これは後ほど

2-2-2. Cookbookの開発を行う。

chef-zero利用時の3と同様

2-2-3a. knife-soloでノード上のchef soloを実行する

これで色々なログが表示されて、最終的にはノードにnmapがインストールされます。

これでnmapが入りました。

2-2-3b. knife-solo経由ではなく直接chef-soloを使って収束させる

solo.rbの用意が必要になります。

3.ここまでの登場キャラをまとめると・・・

  1. chef
    infrastructure as codeを体現するソフトウェア。cookbookという単位でノードの
    あるべき状態を定義し、収束させる様々なソフトウェア群の総称
  2. chef-client
    chefに含まれるソフトウェアのひとつで、chef-serverと呼ばれる
    サーバとのやりとりによってcookbookの収束を行ったりする。
    v11.8.0よりローカルモードが搭載され、擬似的に単独で実行できるようにもなった
  3. chef-solo
    chefに含まれるソフトウェアのひとつで、単独でcookbookによる収束を行う
  4. chef-zero
    chef-clientのローカルモードで用いられるオンメモリで動作するchef-sever
    のようなもの。認証は擬似で行われる。
  5. knife
    chefを便利に使うためのユーティリティソフト。ノードやクックブックの
    ひな形を作ったり、ノードにsshログインしたり、あると便利な機能が含まれている
  6. knife-solo
    knifeのプラグインでchef-soloを更に便利に使うための機能を提供する。
    リモートのノードにchef-repoを転送して、chef-soloを実行するために使われる
  7. knife-zero
    knifeのプラグインでchef-clientローカルモードを便利に使うための機能を提供する。
    ポートフォワードでワークステーションのchef-zeroを参照させる

だと思う・・・。

僕が戸惑った点として、chefの入門記事ってだいたいがknife soloを使った
リモートのノードに対する収束で、『Chefってknifeないと使えないのか』と
勘違いしていた事です。

knifeがあると大分便利になりますが、なくても問題なく同じことが可能です。

これに加えて、cookbook間の依存関係を定義できるBerkshelfに関して
理解できれば、少なくとも既存のcookbookが何をやっているか、を
確認することはできるようなるかも、と思いました。

4. おまけ程度だけどBerkshelfも・・・

インストールは

でOK。使い方は

こんな感じで、うん、なるほどと

するとmetadata.rbがない、って怒られるので、touch metadata.rbすれば問題なく動きます。
が直接touch Berksfileしても問題ないので、とりあえず、ならそれでもいい気がするし
$ knife solo init . でもBerfksfile作成されます。

より細かいオプションはberkshelf公式を参照してください。

pathを指定しなければ、この場合opscodeのリポジトリを参照してyum-epelの
cookbookをダウンロードし、nginxはsite-cookbooks/ディレクトリ内のものを
参照することを定義しています。

これによってyum-epelにnginxが依存していることを定義しています。

で、これで何がありがたいか、っていうと、色々なcookbookを書いて
それを再配布するときに、自動的に依存しているcookbookをダウンロードしたり
してくれるようになります。

チームで共通のcookbookを使いまわすくらいナレッジがたまってくると
ありがたいのかも。

というわけで手元で試すだけなら、Berkshelf書かなくても全然provisioningは
できるし、外部からcookbookをダウンロードしてくれる便利なもん、程度でも
よいかもしれません。

5. 参考リンクと蛇足

蛇足1:vagrant-global-statusのインストール

仮想環境で構築の練習してたり、いろんな仮想環境立ててると、どれが
起動してて、どれが止まってるのか、コマンドライン上からだと、
わけがわからなくなるので、一覧で確認できるプラグインを入れておくと
結構便利です。

蛇足2:今更だけど、仮想環境でのユーザ作成

ちゃんと運用するためのサーバを構築しているのであれば、ちゃんと
検討してほしいですが、とりあえず練習のための・・・っていうときに
意外とユーザ作成して、そのユーザでログインする手順とかど忘れするのでメモ
(vagrantの場合で書きますが、物理的に存在するサーバでも同じ手順)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です