techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

ChefでNginxをインストールし、設定ファイルをChefで管理する

今回は、ChefでNginxをインストールしてみたので覚書きです。

また、NginxをChefでインストールする場合、設定ファイル(nginx.conf)もChefで管理するのがベストです。 ということで、今回はNginxのインストールと設定ファイルの書き換えまでをChefで自動化してみます。

Nginxをインストールする

まずはNginxをインストールします。
Chefリポジトリに移動し、NginxのCookbookを作成しましょう。

knife cookbook create nginx -o site-cookbooks

Cookbookを作成したら、レシピを記述していきます。
[<Chefリポジトリ>/site-cookbooks/nginx/recipes/default.rb]

  package "nginx" do
       action :install
  end
  
  service "nginx" do
        action [:enable, :start]
  end 

このあたりの手順は前々回を参考にしてみてください。

今回はNginxをyumのEPELリポジトリからインストールするので、前回を参考にBerkshelfを利用してEPELリポジトリをゲストOSに適用するようにします。 Berkshelfファイルに以下の1行を書き加えます。

cookbook "yum-epel"

BerkshelfコマンドでCookbookを取得します。

$ berks vendor ./cookbooks

このあたりは前回を参考にしてください。

最後にnodesのJSONファイルを以下のように編集し、EPELリポジトリとNginxを適用するようにします。 [<Chefリポジトリ>/nodes/centos6-chef.json]

{
    "run_list": [
      "recipe[yum-epel]",
      "recipe[nginx]"
    ],
    "automatic": {
      "ipaddress": "centos6-chef"
    }
}

ここまでで一度ゲストOSに設定を適用してみます。

knife solo bootstrap centos6-chef

※ちなみに、ゲストOSは前々回と同じものを使用しています。
コマンドを実行する前にvagrant destroyしておくのが良いでしょう。

ここでブラウザでゲストOSのIPアドレスにアクセスすると、Nginxが起動していると思います。 f:id:uentseit:20160605222934p:plain

※プライベートIPアドレスはVagrantファイルで設定できます。

・・・略・・・
config.vm.network "private_network", ip: "192.168.33.10"
・・・略・・・

Nginxの設定ファイルをChefリポジトリで管理する。

さて、せっかくNginxのインストールを自動化したのに、設定ファイルの編集を手動にするのでは結局環境の作り直しが面倒になりますし、常に同じ環境を作成することが出来ません。というわけで、設定ファイルもChefで管理していきましょう。

ゲストOSにインストールしたNginxの設定ファイルnginx.confをホストOSに持ってきて、それを編集のベースにします。
Vagrantでは、ゲストOSの/vagrantフォルダがホストOSとの共有フォルダになっていますので、そこにコピーします。

$ cp /etc/nginx/nginx.conf /vagrant/

するとホストOS上に、Vagrantファイルと同じディレクトリにコピーされているはずです。

次に、<Chefリポジトリ>/site-cookbooks/nginx/templates/default/ディレクトリに、nginx.confを配置します。

mv nginx.conf <Chefリポジトリ>/site-cookbooks/nginx/templates/default/nginx.conf.erb

この時、拡張子を.erbにしておくのがミソです。

あとはこのnginx.conf.erbを以下のように編集しておきます。

http{
・・・略・・・
server{
       listen 80;
       server_name 198.168.33.10;
     
       location / {
           root /usr/share/nginx/html;
           index sample.html;
       }
   }
      #include /etc/nginx/conf.d/*.conf;
}

※ここではnginx.conファイルの内容については詳しく触れません。

最後に、レシピファイルに以下を書き足します。

  template "nginx.conf" do
    path "/etc/nginx/nginx.conf"
    owner "root"
    group "root"
    mode 644
    notifies :restart, 'service[nginx]'
  end

templateリソースを用いて、書き換え対象のファイルに関する設定を行っています。 pathは、ゲストOS上でのファイルの置き場所を指定しています。 ownergroupmodeは、お察しの通りファイルの権限設定になります。 notifiesで、設定ファイルの置き換え後にnginxのサービスの再起動を行うよう指定しています。

さて、あとはゲストOSにCookbookを適用すれば、nginx.confファイルも自動で置き換わっているはずです。

$ knife solo bootstrap centos6-chef

nginx.confの設定で、便宜的にindexをsample.htmlとしておいたので、ゲストOSのドキュメントルート(ここでは/usr/share/nginx/html)に sample.htmlを配置して、ゲストOSのIPアドレスにアクセスしてみましょう。

f:id:uentseit:20160605231851p:plain

これでnginx.confファイルを置き換えることができていることがわかります。(もちろん直接ゲストOSのnginx.confを確認すると、nginx.conf.erbと同じ内容になっているはずです。

というわけで、今日はこの辺にしておきます。