如何更改 Chef 执行顺序?
How to Change Chef Execution Order?
我正在 运行 制作厨师食谱,但它似乎 运行 出了问题。
#
# Cookbook:: monit
# Recipe:: default
#
# Copyright:: 2017, The Authors, All Rights Reserved.
yum_package 'install Requirements' do
package_name ['libtool', 'automake', 'autoconf', 'bison', 'flex', 'zlib-devel', 'git']
action :install
end
script 'install monit' do
interpreter "bash"
code <<-EOH
git clone https://tildeslash@bitbucket.org/tildeslash/monit.git monit
cd monit/
./bootstrap
./configure --without-pam --without-ssl --sysconfdir=/etc --prefix=/usr
make && make install
EOH
end
iptables_rule 'monit_web' do
action :enable
end
template '/etc/monitrc' do
owner 'root'
mode '0700'
source 'monitrc.erb'
end
execute 'monit reload' do
require 'mixlib/shellout'
cmnd = Mixlib::ShellOut.new('monit start all')
cmnd.run_command
if cmnd.error?
cmndd = Mixlib::ShellOut.new('monit reload')
cmndd.run_command
else
puts cmnd.stdout
end
end
script 'start service' do
interpreter "bash"
code <<-EOF
monit
monit start all
EOF
end
根据我的理解,脚本资源 'install monit' 应该 运行 在执行资源 'monit reload.' 之前似乎并非如此;我收到以下错误:
================================================================================
Recipe Compile Error in /var/chef/cache/cookbooks/monit/recipes/default.rb
================================================================================
Errno::ENOENT
-------------
No such file or directory - monit
Cookbook Trace:
---------------
/var/chef/cache/cookbooks/monit/recipes/default.rb:38:in `block in from_file'
/var/chef/cache/cookbooks/monit/recipes/default.rb:35:in `from_file'
Relevant File Content:
----------------------
/var/chef/cache/cookbooks/monit/recipes/default.rb:
31: mode '0700'
32: source 'monitrc.erb'
33: end
34:
35: execute 'monit reload' do
36: require 'mixlib/shellout'
37: cmnd = Mixlib::ShellOut.new('monit start all')
38>> cmnd.run_command
39: if cmnd.error?
40: cmndd = Mixlib::ShellOut.new('monit reload')
41: cmndd.run_command
42: else
43: puts cmnd.stdout
44: end
45: end
46:
47: script 'start service' do
System Info:
------------
chef_version=13.9.1
platform=centos
platform_version=7.5.1804
ruby=ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-linux]
program_name=chef-client worker: ppid=14633;start=14:44:25;
executable=/opt/chef/bin/chef-client
我已确认未安装程序 'monit'。为什么 Chef 跳过脚本并跳转到执行?这在某一时刻工作正常,我不确定为什么它突然停止工作。
阅读 coderanger。net/two-pass 但基本上您只是在执行资源中隐藏了一些编译时 Ruby 代码。那是行不通的。您可以正常使用资源或使用 ruby_block.
您应该熟悉 Chef Client Overview。特别是编译资源收集阶段和收敛节点阶段的顺序。
作为一般规则;收敛期间的资源 运行,但编译期间不在 ruby_block
资源 运行 中的任何 ruby 代码。因此,在这种情况下,monit reload
的 ruby 代码在编译阶段实际上是 运行ning。您需要将该资源修改为 ruby_block
。像这样:
ruby_block 'monit reload' do
block do
require 'mixlib/shellout'
cmnd = Mixlib::ShellOut.new('monit start all')
cmnd.run_command
if cmnd.error?
cmndd = Mixlib::ShellOut.new('monit reload')
cmndd.run_command
else
puts cmnd.stdout
end
end
action :run
end
我正在 运行 制作厨师食谱,但它似乎 运行 出了问题。
#
# Cookbook:: monit
# Recipe:: default
#
# Copyright:: 2017, The Authors, All Rights Reserved.
yum_package 'install Requirements' do
package_name ['libtool', 'automake', 'autoconf', 'bison', 'flex', 'zlib-devel', 'git']
action :install
end
script 'install monit' do
interpreter "bash"
code <<-EOH
git clone https://tildeslash@bitbucket.org/tildeslash/monit.git monit
cd monit/
./bootstrap
./configure --without-pam --without-ssl --sysconfdir=/etc --prefix=/usr
make && make install
EOH
end
iptables_rule 'monit_web' do
action :enable
end
template '/etc/monitrc' do
owner 'root'
mode '0700'
source 'monitrc.erb'
end
execute 'monit reload' do
require 'mixlib/shellout'
cmnd = Mixlib::ShellOut.new('monit start all')
cmnd.run_command
if cmnd.error?
cmndd = Mixlib::ShellOut.new('monit reload')
cmndd.run_command
else
puts cmnd.stdout
end
end
script 'start service' do
interpreter "bash"
code <<-EOF
monit
monit start all
EOF
end
根据我的理解,脚本资源 'install monit' 应该 运行 在执行资源 'monit reload.' 之前似乎并非如此;我收到以下错误:
================================================================================
Recipe Compile Error in /var/chef/cache/cookbooks/monit/recipes/default.rb
================================================================================
Errno::ENOENT
-------------
No such file or directory - monit
Cookbook Trace:
---------------
/var/chef/cache/cookbooks/monit/recipes/default.rb:38:in `block in from_file'
/var/chef/cache/cookbooks/monit/recipes/default.rb:35:in `from_file'
Relevant File Content:
----------------------
/var/chef/cache/cookbooks/monit/recipes/default.rb:
31: mode '0700'
32: source 'monitrc.erb'
33: end
34:
35: execute 'monit reload' do
36: require 'mixlib/shellout'
37: cmnd = Mixlib::ShellOut.new('monit start all')
38>> cmnd.run_command
39: if cmnd.error?
40: cmndd = Mixlib::ShellOut.new('monit reload')
41: cmndd.run_command
42: else
43: puts cmnd.stdout
44: end
45: end
46:
47: script 'start service' do
System Info:
------------
chef_version=13.9.1
platform=centos
platform_version=7.5.1804
ruby=ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-linux]
program_name=chef-client worker: ppid=14633;start=14:44:25;
executable=/opt/chef/bin/chef-client
我已确认未安装程序 'monit'。为什么 Chef 跳过脚本并跳转到执行?这在某一时刻工作正常,我不确定为什么它突然停止工作。
阅读 coderanger。net/two-pass 但基本上您只是在执行资源中隐藏了一些编译时 Ruby 代码。那是行不通的。您可以正常使用资源或使用 ruby_block.
您应该熟悉 Chef Client Overview。特别是编译资源收集阶段和收敛节点阶段的顺序。
作为一般规则;收敛期间的资源 运行,但编译期间不在 ruby_block
资源 运行 中的任何 ruby 代码。因此,在这种情况下,monit reload
的 ruby 代码在编译阶段实际上是 运行ning。您需要将该资源修改为 ruby_block
。像这样:
ruby_block 'monit reload' do
block do
require 'mixlib/shellout'
cmnd = Mixlib::ShellOut.new('monit start all')
cmnd.run_command
if cmnd.error?
cmndd = Mixlib::ShellOut.new('monit reload')
cmndd.run_command
else
puts cmnd.stdout
end
end
action :run
end