如何在不重复警卫的情况下保护整个食谱?

时间:2014-08-15 12:52:56

标签: chef chef-recipe aws-opsworks

我试图防止重新执行我的食谱资源,当包含在其他食谱中时,使用锁定文件来防止重新下载和提取文件。

例如,考虑这样的食谱:

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

有没有办法保护食谱整体,避免在食谱的每个资源中重复护卫?

1 个答案:

答案 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