我试图防止重新执行我的食谱资源,当包含在其他食谱中时,使用锁定文件来防止重新下载和提取文件。
例如,考虑这样的食谱:
execute "step1-download" do
command "step1-command"
not_if do ::File.exists?('/var/recipe-already-executed') end
end
execute "step2-extract" do
command "step2-command"
not_if do ::File.exists?('/var/recipe-already-executed') end
end
有没有办法保护食谱整体,避免在食谱的每个资源中重复护卫?
答案 0 :(得分:3)
此示例中有许多事项需要考虑。首先,请考虑以下事项:
你正在做这样的事情:
execute 'create directory' do
command 'mkdir -p /path/on/disk && touch created-directory'
not_if { File.exist?('created-directory') }
end
如果我删除了目录,而不是" lockfile",那么这个块将不会被执行。这可能有问题,这也是我们不鼓励这种机制的原因。你应该做这样的事情:
execute 'create directory' do
command 'mkdir /path/on/disk'
not_if { File.directory?('/path/on/disk') }
end
然而,这完全没必要,因为Chef有一个内置资源来处理这种情况:
directory '/path/on/disk'
从您的示例中,您似乎正在尝试下载,提取和安装资源。你应该真正利用内置的Chef资源,因为你需要 - 不用担心所说的守卫:
remote_file "#{Chef::Config[:file_cache_path]}/whatever.tar.gz" do
source 'https://something.com/file.tar.gz'
action :create_if_missing
notifies :run, 'execute[extract]', :immediately
end
execute 'extract' do
command "tar -xzf #{Chef::Config[:file_cache_path]}/whatever.tar.gz"
action :nothing
notifies :run, 'execute[compile]', :immediately
end
execute 'compile' do
command "./configure && make && make install"
action :nothing
end
您还应该查看remote_install
社区食谱,它提供了一个方便的资源:
remote_install 'bash' do
source 'http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz'
version '4.3'
checksum 'afc687a28e0e24dc21b988fa159ff9dbcf6b7caa92ade8645cc6d5605cd024d4'
build_command './configure'
compile_command 'make'
install_command 'make install'
en