厨师入门(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!)。