46

現在、Vagrantfile には次の内容があります。

config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "cookbooks"
    chef.add_recipe "apt"
    chef.add_recipe "build-essential"
    chef.add_recipe "chef-redis::source"
    chef.add_recipe "openssl"
    chef.add_recipe "git"
    chef.add_recipe "postgresql::server"
    chef.add_recipe "postgresql::client"
end

レシピリストに追加したソフトウェアをインストールするには、他のソフトウェアをインストールする前に VM にapt-get アップデートを発行させる必要があります。

私は、これが「apt」レシピの機能の 1 つであるという印象を受けました。最初に更新を実行するということです。

vagrant プロビジョニングを行ったときの出力は次のとおりです。

[Sat, 11 Feb 2012 22:20:03 -0800] INFO: *** Chef 0.10.2 ***
[Sat, 11 Feb 2012 22:20:03 -0800] INFO: Setting the run_list to ["recipe[apt]", "recipe[build-essential]", "recipe[chef-redis::source]", "recipe[openssl]", "recipe[git]", "recipe[postgresql::server]", "recipe[postgresql::client]", "recipe[vagrant-main]"] from JSON
[Sat, 11 Feb 2012 22:20:03 -0800] INFO: Run List is [recipe[apt], recipe[build-essential], recipe[chef-redis::source], recipe[openssl], recipe[git], recipe[postgresql::server], recipe[postgresql::client], recipe[vagrant-main]]
[Sat, 11 Feb 2012 22:20:03 -0800] INFO: Run List expands to [apt, build-essential, chef-redis::source, openssl, git, postgresql::server, postgresql::client, vagrant-main]
[Sat, 11 Feb 2012 22:20:03 -0800] INFO: Starting Chef Run for lucid32
[Sat, 11 Feb 2012 22:20:03 -0800] INFO: Processing package[postgresql-client] action install (postgresql::client line 37)
[Sat, 11 Feb 2012 22:20:04 -0800] ERROR: package[postgresql-client] (postgresql::client line 37) has had an error
[Sat, 11 Feb 2012 22:20:04 -0800] ERROR: Running exception handlers
[Sat, 11 Feb 2012 22:20:04 -0800] ERROR: Exception handlers complete
[Sat, 11 Feb 2012 22:20:04 -0800] FATAL: Stacktrace dumped to /tmp/vagrant-chef-1/chef-stacktrace.out
[Sat, 11 Feb 2012 22:20:04 -0800] FATAL: Chef::Exceptions::Exec: package[postgresql-client] (postgresql::client line 37) had an error: apt-get -q -y install postgresql-client=8.4.8-0ubuntu0.10.04 returned 100, expected 0
4

12 に答える 12

32

最初に apt レシピを含めることができます。

include_recipe 'apt'

これにより、更新コマンドが実行されます。

于 2013-08-13T17:02:29.743 に答える
21

apt-get updateあなたが持っている方法で最初に実行する必要があります。ただし、レシピは 24 時間ごとに 1 回だけ更新されます。

execute "apt-get-update-periodic" do
  command "apt-get update"
  ignore_failure true
  only_if do
    File.exists?('/var/lib/apt/periodic/update-success-stamp') &&
    File.mtime('/var/lib/apt/periodic/update-success-stamp') < Time.now - 86400
  end
end
于 2012-02-12T16:36:25.380 に答える
10

ubuntu システムでこれを適切に行うリソースが 3 つあります。具体的には、私が 12.04 正確な 64 ビットで使用しています。

  1. 他のレシピが必要な場合は、自由に apt-get-update を実行してください

  2. 更新のタイムスタンプを提供する update-notifier-common パッケージをインストールします

  3. タイムスタンプを確認し、定期的に更新してください。この場合、以下は 86400 秒後です。

そしてこちらがその3つのレシピです。

execute "apt-get-update" do
  command "apt-get update"
  ignore_failure true
  action :nothing
end

package "update-notifier-common" do
  notifies :run, resources(:execute => "apt-get-update"), :immediately
end

execute "apt-get-update-periodic" do
  command "apt-get update"
  ignore_failure true
  only_if do
   File.exists?('/var/lib/apt/periodic/update-success-stamp') &&
   File.mtime('/var/lib/apt/periodic/update-success-stamp') < Time.now - 86400
  end
end
于 2013-02-27T23:02:37.487 に答える
8

opscode apt cookbook の最新バージョンでは、コンパイル時に実行できるようです。

config.vm.provision :chef_solo do |chef|
  chef.cookbooks_path = "cookbooks"
  chef.add_recipe "apt"
  chef.json = { "apt" => {"compiletime" => true} }
end

実行リストで apt が他のコンパイル時クックブック (postgres など) の前に実行されている限り、これは機能するはずです。

于 2013-10-02T18:06:32.950 に答える
3

以下のパッチを適用することで問題を解決できたようです。

https://github.com/wil/cookbooks/commit/a470a4f68602ec3bf3374830f4990a7e19e9de81

于 2012-02-12T17:07:00.620 に答える
1

コンパイル時に apt-get update を実行するには、次のようにします。

e = execute "apt-get update" do
  action :nothing
end

e.run_action(:run)

https://wiki.opscode.com/display/chef/Evaluate+and+Run+Resources+at+Compile+Timeを確認してください

于 2014-03-15T12:56:03.670 に答える
1

この問題を解決する最も簡単で直接的な方法は、次のパッチ (h/t @ashchristopher) を適用することです。

https://github.com/wil/cookbooks/commit/a470a4f68602ec3bf3374830f4990a7e19e9de81

問題は、レシピがpostgresql/recipes/client.rb:39および 44のパッケージ リソースに対して、通常の実行時ではなくコンパイル時postgresql::clientにインストール アクションを実行し (h/t Tim Potter)、それらが評価されることです。他のものが実行される前に、Chef によって (したがってインストールされます)。

pg_packages.each do |pg_pack|
  package pg_pack do
    action :nothing
  end.run_action(:install)
end

gem_package "pg" do
  action :nothing
end.run_action(:install)

これは、クックブックに依存し、コンパイル前にインストールされる gem に依存するクックブックのdatabasepostgresプロバイダーのサービスで行われると思います。上記のパッチを適用すると、クックブックが壊れる可能性があります。postgresqlpgdatabase

apt-get update他の代替ソリューションは、コンパイル時にも実行されるレシピを作成し、それをクックブックのrun_list前に配置することpostgresqlです。最も単純な形式では、おそらく次のようになります。

execute "apt-get update" do
  action :nothing
end.run_action(:install)
于 2012-02-29T07:27:30.150 に答える
1

パッチを適用しない場合、これは実行ごとに更新される問題に対する一般的なアプローチです。

bash "update-apt-repository" do
  user "root"
  code <<-EOH
  apt-get update
  EOH
end

このような実行は、実行のたびにかなりの量のシステム リソースを約 30 秒間占有することを考慮する価値があります。cron またはその他のイベントを介して実行した、recipe::update_apt という名前の特別なレシピが必要な場合があります。

chef-client -o "recipe[yourrecipe::update_apt]"
于 2013-09-10T21:22:13.140 に答える