ruby – chef-solo:在postgresql之前安装build-essential配方
我正在尝试使用chef-solo在我的服务器上安装
postgresql.我通过自己做引导程序并在脚本中手动包含build-esential包来完成这项工作.现在我想使用knife-solo来处理引导,我在定义执行配方的顺序时遇到了问题.
我想在postgresql之前安装build-essential软件包.这是我正在建立的服务器的json文件 { "dbuser": "myuser","dbpass": "mypassword","postgresql":{"password":{"postgres":"mypassword"}},"passenger":{"version":"3.0.14","max_pool_size":"2"},"default_attributes":{"build_essential":{"compiletime": "true"}},"run_list": [ "recipe[build-essential]","role[web_server]","recipe[sqlite]","recipe[postgresql::server]","recipe[pope::default]" ] } 当我发出命令 knife cook <user>@<my server's ip> 我收到这个错误 WARNING: No knife configuration file found Checking cookbook syntax... Checking Chef version Enter the password for test@<my server's ip>: [2012-10-29T16:14:44+11:00] INFO: *** Chef 10.16.2 *** [2012-10-29T16:14:45+11:00] INFO: Setting the run_list to ["recipe[build-essential]","recipe[mysettings::default]"] from JSON [2012-10-29T16:14:45+11:00] INFO: Run List is [recipe[build-essential],role[web_server],recipe[sqlite],recipe[postgresql::server],recipe[pope::default]] [2012-10-29T16:14:45+11:00] INFO: Run List expands to [build-essential,apache2,passenger_apache2,sqlite,postgresql::server,mysettings::default] [2012-10-29T16:14:45+11:00] INFO: Starting Chef Run for test-VirtualBox [2012-10-29T16:14:45+11:00] INFO: Running start handlers [2012-10-29T16:14:45+11:00] INFO: Start handlers complete. [2012-10-29T16:14:46+11:00] INFO: Processing package[postgresql-client] action install (postgresql::client line 37) [2012-10-29T16:14:47+11:00] INFO: Processing package[libpq-dev] action install (postgresql::client line 37) [2012-10-29T16:14:47+11:00] INFO: Processing package[make] action install (postgresql::client line 37) [2012-10-29T16:14:47+11:00] INFO: Processing gem_package[pg] action install (postgresql::client line 42) ================================================================================ Error executing action `install` on resource 'gem_package[pg]' ================================================================================ Mixlib::ShellOut::ShellCommandFailed ------------------------------------ Expected process to exit with [0],but received '1' ---- Begin output of /opt/chef/embedded/bin/gem install pg -q --no-rdoc --no-ri -v "0.14.1" ---- STDOUT: Building native extensions. This could take a while... STDERR: ERROR: Error installing pg: ERROR: Failed to build gem native extension. /opt/chef/embedded/bin/ruby extconf.rb checking for pg_config... yes Using config values from /usr/bin/pg_config checking for libpq-fe.h... yes checking for libpq/libpq-fs.h... yes checking for pg_config_manual.h... yes checking for PQconnectdb() in -lpq... no checking for PQconnectdb() in -llibpq... no checking for PQconnectdb() in -lms/libpq... no Can't find the PostgreSQL client library (libpq) *** extconf.rb failed *** Could not create Makefile due to some reason,probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/opt/chef/embedded/bin/ruby --with-pg --without-pg --with-pg-dir --without-pg-dir --with-pg-include --without-pg-include=${pg-dir}/include --with-pg-lib --without-pg-lib=${pg-dir}/lib --with-pg-config --without-pg-config --with-pg_config --without-pg_config --with-pqlib --without-pqlib --with-libpqlib --without-libpqlib --with-ms/libpqlib --without-ms/libpqlib Gem files will remain installed in /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/pg-0.14.1 for inspection. Results logged to /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/pg-0.14.1/ext/gem_make.out ---- End output of /opt/chef/embedded/bin/gem install pg -q --no-rdoc --no-ri -v "0.14.1" ---- Ran /opt/chef/embedded/bin/gem install pg -q --no-rdoc --no-ri -v "0.14.1" returned 1 Cookbook Trace: --------------- /tmp/chef-solo/cookbooks/postgresql/recipes/client.rb:44:in `from_file' /tmp/chef-solo/cookbooks/postgresql/recipes/server.rb:24:in `from_file' Resource Declaration: --------------------- # In /tmp/chef-solo/cookbooks/postgresql/recipes/client.rb 42: gem_package "pg" do 43: action :nothing 44: end.run_action(:install) Compiled Resource: ------------------ # Declared in /tmp/chef-solo/cookbooks/postgresql/recipes/client.rb:42:in `from_file' gem_package("pg") do provider Chef::Provider::Package::Rubygems action [:nothing] retries 0 retry_delay 2 package_name "pg" version "0.14.1" cookbook_name :postgresql recipe_name "client" gem_binary "/opt/chef/embedded/bin/gem" end ================================================================================ Recipe Compile Error in /tmp/chef-solo/cookbooks/postgresql/recipes/server.rb ================================================================================ Mixlib::ShellOut::ShellCommandFailed ------------------------------------ gem_package[pg] (postgresql::client line 42) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0],probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/opt/chef/embedded/bin/ruby --with-pg --without-pg --with-pg-dir --without-pg-dir --with-pg-include --without-pg-include=${pg-dir}/include --with-pg-lib --without-pg-lib=${pg-dir}/lib --with-pg-config --without-pg-config --with-pg_config --without-pg_config --with-pqlib --without-pqlib --with-libpqlib --without-libpqlib --with-ms/libpqlib --without-ms/libpqlib Gem files will remain installed in /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/pg-0.14.1 for inspection. Results logged to /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/pg-0.14.1/ext/gem_make.out ---- End output of /opt/chef/embedded/bin/gem install pg -q --no-rdoc --no-ri -v "0.14.1" ---- Ran /opt/chef/embedded/bin/gem install pg -q --no-rdoc --no-ri -v "0.14.1" returned 1 Cookbook Trace: --------------- /tmp/chef-solo/cookbooks/postgresql/recipes/client.rb:44:in `from_file' /tmp/chef-solo/cookbooks/postgresql/recipes/server.rb:24:in `from_file' Relevant File Content: ---------------------- /tmp/chef-solo/cookbooks/postgresql/recipes/client.rb: 37: package pg_pack do 38: action :nothing 39: end.run_action(:install) 40: end 41: 42: gem_package "pg" do 43: action :nothing 44>> end.run_action(:install) 45: [2012-10-29T16:15:03+11:00] ERROR: Running exception handlers [2012-10-29T16:15:03+11:00] ERROR: Exception handlers complete [2012-10-29T16:15:03+11:00] FATAL: Stacktrace dumped to /tmp/chef-solo/chef-stacktrace.out [2012-10-29T16:15:03+11:00] FATAL: Mixlib::ShellOut::ShellCommandFailed: gem_package[pg] (postgresql::client line 42) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0],probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/opt/chef/embedded/bin/ruby --with-pg --without-pg --with-pg-dir --without-pg-dir --with-pg-include --without-pg-include=${pg-dir}/include --with-pg-lib --without-pg-lib=${pg-dir}/lib --with-pg-config --without-pg-config --with-pg_config --without-pg_config --with-pqlib --without-pqlib --with-libpqlib --without-libpqlib --with-ms/libpqlib --without-ms/libpqlib Gem files will remain installed in /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/pg-0.14.1 for inspection. Results logged to /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/pg-0.14.1/ext/gem_make.out ---- End output of /opt/chef/embedded/bin/gem install pg -q --no-rdoc --no-ri -v "0.14.1" ---- Ran /opt/chef/embedded/bin/gem install pg -q --no-rdoc --no-ri -v "0.14.1" returned 1 解决方法
最简单的解决方案是更新本地postgresql cookbook.您观察到的问题已在最近版本的cookbook中修复(所有版本> = 1.0.0).
现在他们是如何解决的?首先,您会注意到客户端配方已拆分为client.rb和ruby.rb.前者只是安装操作系统包,后者是Ruby gem,用于后续的Chef运行.正如您所观察到的那样,安装该gem需要先安装build-essentials.这是由build-essential食谱使用的一个名为node [‘build-essential’] [‘compile_time’]的新属性控制的.这确保在编译期间安装所需的包,即,在包含构建必需配方时直接安装. 要理解为什么这很重要,你必须要了解一下Anatomy of a Chef Run,即执行配方的源代码的编译时间和后续转换的资源集合是否构建之间的差异,以及资源的后续收敛执行以将系统移向预期状态. 通常,大多数实际变化是在收敛阶段完成的.然而,有时需要在编译阶段之前构建一些东西,以便能够使用它来确定哪些资源与此处的情况完全一致.当我们早期安装到pg gem时,我们可以使用它来尽早与数据库通信,例如决定是否创建数据库. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |