厨师入门(3) 〜启动 Web 服务器〜

这是我第三次学习入门Chef Solo。
我将尝试启动一个Web服务器(nginx)。

制作食谱

我会新建一个食谱。

vagrant@precise64:~/chef-repo$ knife cookbook create nginx -o cookbooks
** Creating cookbook nginx
** Creating README for cookbook: nginx
** Creating CHANGELOG for cookbook: nginx
** Creating metadata for cookbook: nginx

编辑食谱

编辑cookbooks/nginx/recipes/default.rb文件,以进行安装和运行nginx的描述。预先准备好nginx.conf作为erb模板,并在食谱中编写使用它的方式,这样模板将被放置在指定的路径作为nginx.conf。

#
# Cookbook Name:: nginx
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "nginx" do
        action :install
end

service "nginx" do
        supports:status=>true,:restart=> true,:reload=>true
        action [:enable,:start]
end

template "nginx.conf" do
        path "/etc/nginx/nginx.conf"
        source "nginx.conf.erb"
        owner "root"
        group "root"
        mode 0644
        notifies :reload,'service[nginx]'
end

创建模板文件

创建模板文件 cookbooks/nginx/templates/default/nginx.conf.erb。

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid     /var/run/nginx.pid;

events {
        worker_connections 1024;
}

http {
        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        server {
                listen  <%=node['nginx']['port'] %>;
                server_name localhost;
                location / {
                        root /usr/share/nginx/html;
                        index index.html index.htm;
                }
        }
}

<% 〜 %>是一個變數展開的標籤。這個變數部分可以在執行時指定在JSON文件中(後面會提到)。通過這樣的方式,我們可以在Chef執行時無需修改模板而切換端口。

将JSON文件设置如下:
在”nginx”节点的”port”属性中指定了80端口。
这样,在展开nginx.conf时,之前的变量标签部分将被替换为80。

{
        "nginx":{
                "port":80
        },

        "run_list":[
                "nginx"
        ]
}

执行

使用之前指定的JSON文件进行执行。

vagrant@precise64:~/chef-repo$ sudo chef-solo -c config.rb -j ./nginx.json
Starting Chef Client, version 11.6.2
Compiling Cookbooks...
Converging 3 resources
Recipe: nginx::default
  * package[nginx] action install
================================================================================
Error executing action `install` on resource 'package[nginx]'
================================================================================


Chef::Exceptions::Exec
----------------------
apt-get -q -y install nginx=1.1.19-1ubuntu0.1 returned 100, expected 0


Resource Declaration:
---------------------
# In /home/vagrant/chef-repo/cookbooks/nginx/recipes/default.rb

  9: package "nginx" do
 10:    action :install
 11: end
 12: 



Compiled Resource:
------------------
# Declared in /home/vagrant/chef-repo/cookbooks/nginx/recipes/default.rb:9:in `from_file'

package("nginx") do
  action [:install]
  retries 0
  retry_delay 2
  package_name "nginx"
  version "1.1.19-1ubuntu0.1"
  cookbook_name :nginx
  recipe_name "default"
end



[2013-10-19T18:49:18-07:00] ERROR: Running exception handlers
[2013-10-19T18:49:18-07:00] ERROR: Exception handlers complete
[2013-10-19T18:49:18-07:00] FATAL: Stacktrace dumped to /tmp/chef-solo/chef-stacktrace.out
Chef Client failed. 0 resources updated
[2013-10-19T18:49:18-07:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

出现了错误。
在谷歌上搜索后,找到了类似的问答。
这是因为在apt的列表上找不到指定版本的nginx,所以您只需要先运行”$ sudo apt-get update”来更新列表,就可以解决这个问题了。

执行上述命令后重新尝试。

vagrant@precise64:~/chef-repo$ sudo chef-solo -c config.rb -j ./nginx.json
Starting Chef Client, version 11.6.2
Compiling Cookbooks...
Converging 3 resources
Recipe: nginx::default
  * package[nginx] action install
    - install version 1.1.19-1ubuntu0.2 of package nginx

  * service[nginx] action enable (up to date)
  * service[nginx] action start
    - start service service[nginx]

  * template[nginx.conf] action create
    - update content in file /etc/nginx/nginx.conf from 38154b to 406356
        --- /etc/nginx/nginx.conf   2012-03-28 19:50:24.000000000 -0700
        +++ /tmp/chef-rendered-template20131019-6018-1tfg5gj    2013-10-19 19:22:46.336623985 -0700
        @@ -1,95 +1,23 @@
        -user www-data;
        -worker_processes 4;
        -pid /var/run/nginx.pid;
        +user nginx;
        +worker_processes 1;
        +error_log /var/log/nginx/error.log
        +pid    /var/run/nginx.pid;

        -events {
        -   worker_connections 768;
        -   # multi_accept on;
        +events{
        +   worker_connections 1024;
         }
 (省略)

这次成功了。
可以看出nginx.conf已经按照模板(+JSON属性)指定的内容替换了。
由于存在拼写错误的问题,所以省略了详细日志。

当从主机的浏览器访问该虚拟机的80号端口时,可以确认显示了nginx的启动页面(欢迎来到nginx!)。