如何配置 Chef Solo 以在新的 Vagrant 机器上安装 Nginx?

Posted

技术标签:

【中文标题】如何配置 Chef Solo 以在新的 Vagrant 机器上安装 Nginx?【英文标题】:How do I configure Chef Solo to install Nginx on a new Vagrant box? 【发布时间】:2013-10-08 03:43:35 【问题描述】:

我是 Chef 的新手,文档(甚至是他们网站的主页)让我头晕目眩。我什至不确定我是否将它用于正确的目的。

我的意图是设置一个Vagrantfile,它告诉 Chef Solo 在我启动一个新盒子时自动安装一些软件。 这是 Chef Solo 的预期用途之一,对吗?

我不确定这是否属于“地球上最艰巨的基础设施挑战”之一,但无论如何。

我的第一个目标是让 Chef Solo 为我安装 nginx。在我的项目中,我克隆了 nginx 的食谱:

$ git clone https://github.com/opscode-cookbooks/nginx.git cookbooks/nginx

我将Vagrantfile 编辑为如下所示:

Vagrant.configure("2") do |config|
  config.vm.box = "opscode-ubuntu-1204"
  config.vm.provision :chef_solo do |chef|
    chef.add_recipe "nginx"
  end
end

当我运行 vagrant up 时,我遇到了一些错误,即找不到一些食谱(build-essentialapt 等),因此我从相应的存储库中克隆了它们。现在,当我vagrant up 时,我得到了这个输出:

[2013-10-01T20:31:03+00:00] INFO: Processing package[nginx] action install (nginx::package line 38)    

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 /tmp/vagrant-chef-1/chef-solo-1/cookbooks/nginx/recipes/package.rb

 38: package node['nginx']['package_name'] do
 39:   notifies :reload, 'ohai[reload_nginx]', :immediately
 40: end
 41: 

Compiled Resource:
------------------
# Declared in /tmp/vagrant-chef-1/chef-solo-1/cookbooks/nginx/recipes/package.rb:38: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 "package"
end

[2013-10-01T20:31:08+00:00] INFO: Running queued delayed notifications before re-raising exception
[2013-10-01T20:31:08+00:00] ERROR: Running exception handlers
[2013-10-01T20:31:08+00:00] ERROR: Exception handlers complete
[2013-10-01T20:31:08+00:00] FATAL: Stacktrace dumped to /tmp/vagrant-chef-1/chef-stacktrace.out
[2013-10-01T20:31:08+00:00] FATAL: Chef::Exceptions::Exec: package[nginx] (nginx::package line 38) had an error: Chef::Exceptions::Exec: apt-get -q -y install nginx=1.1.19-1ubuntu0.1 returned 100, expected 0

厨师从未成功完成!任何错误都应该在上面的输出中可见。请修正您的食谱,使其正确完成。

如何修改我的食谱以使其正确完成?

【问题讨论】:

【参考方案1】:

为了更有效地使用 chef,我建议安装以下 vagrant 插件:

vagrant plugin install vagrant-omnibus
vagrant plugin install vagrant-berkshelf

Berkshelf 是一个管理说明书依赖的工具。 omnibus plugin 有助于确保您使用的是最新版本的 chef。

以下示例演示了安装 nginx 之类的东西变得多么容易。

示例

├── Berksfile
└── Vagrantfile

Berkshelf

列出所需的说明书。 Berkshelf 将从 opscode 社区网站下载它们(和依赖项)。

site :opscode

cookbook "nginx"

流浪文件

以下 vagrant 文件将安装 nginx,使其在主机的 8080 端口上可用:

Vagrant.configure("2") do |config|

  # Box details
  config.vm.box = "Berkshelf-CentOS-6.3-x86_64-minimal"
  config.vm.box_url = "https://dl.dropbox.com/u/31081437/Berkshelf-CentOS-6.3-x86_64-minimal.box"

  # Plugins
  config.berkshelf.enabled = true
  config.omnibus.chef_version = :latest

  # Network
  config.vm.network :forwarded_port, guest: 80, host: 8080

  # Chef solo provisioning
  config.vm.provision :chef_solo do |chef|
    chef.add_recipe "nginx"
  end

end

注意事项:

此示例使用 CentOS。在 Ubuntu 上应该也能正常工作。

【讨论】:

效果很好。出于某种奇怪的原因,第一个条款在检索包 STDERR 时导致 404:无法获取us.archive.ubuntu.com/ubuntu/pool/main/libj/libjpeg-turbo/… 404 未找到 [IP:91.189.91.15 80] 无法获取us.archive.ubuntu.com/ubuntu/pool/main/libx/libxslt/… 404 未找到 [IP:91.189.91.15 80 ] 我必须手动 ssh 进入虚拟机和 sudo apt-get update 然后 vagrant relaod --provision 才能工作。我会寻找一种自动更新的方法。 看来 Berkshelf 现在只是将 apt 作为依赖项安装,但不运行 apt-get update。所以你会得到一个过时的包裹清单。要自动更新,您应该将 apt 包含在您的配置列表中。这将安装它并运行 apt-get update。其余的规定都会顺利进行。 Berkshelf 3 的做法略有不同。请务必click through 了解最新信息。 请注意,Chef Development Kit 现在包括开箱即用的 Berkshelf:downloads.chef.io/chef-dk @hoodslide 确实如此。现在,Test Kitchen 在很大程度上也取代了对 vagrant 的需求。【参考方案2】:

您好,我遇到了同样的问题,在搜索时偶然发现了您的问题。我已经简单地解决了它,包括 APT 配方。之所以需要它,是因为您必须先对新实例进行 apt-get update 才能安装软件包。就这样。

【讨论】:

Berkshelf 自动下载 apt cookbook 作为 nginx 的依赖项。 我不同意这一点。我刚刚下载了最新的 vagrant 的 berkshelf 和综合插件,并在没有添加 apt 配方的情况下运行上面的 Vagrantfile,nginx 没有运行。直到我添加了 apt 配方,它才奏效。 我刚刚尝试过,当 Berkshelf 启动时,它会安装 nginx 的依赖项,包括 apt: [Berkshelf] Using nginx (2.2.0) [Berkshelf] Using apt (2.3.4)跨度>

以上是关于如何配置 Chef Solo 以在新的 Vagrant 机器上安装 Nginx?的主要内容,如果未能解决你的问题,请参考以下文章

在html中如何链接表单提交以在新选项卡中打开并链接相对URL?

在 chef lwrp 中安装、要求和使用 ruby​​ 库

Datagrid 导航链接在新选项卡中打开

如何控制 Vagrant 用于配置 VM 的 Chef 版本?

如何在新的 Apple Developer 网站上将 AdHoc 分发更改为 AppStore?

如何使用 xCode 5 在新的 iOS 8 上安装应用程序?