cookbook_file如何与bash结合使用?

How to use cookbook_file in conjunction with bash?

我正在使用以下逻辑编写厨师食谱:

if grep -q -i "release 6" /etc/redhat-release  
then       
  upload **file1** using cookbook_file resource  
else if grep -q -i "release 7" /etc/redhat-release  
then    
  upload **file2** using cookbook_file resource  
fi

请让我知道具有上述逻辑的厨师食谱会是什么样子??
我可以利用哪些厨师资源?

因为我们可以在厨师食谱中使用 ruby,所以我们可以利用它并上传文件,如下面的代码所示

确保你的食谱 files 目录中有 file1, file2

file_to_upload = nil
if system("grep -q -i \"release 6\" /etc/redhat-release")
  file_to_upload = <file1_name>
elsif  system("grep -q -i \"release 7\" /etc/redhat-release")
  file_to_upload = <file2_name>
fi

cookbook_file "<directory_where_file_needs_to_be_uploaded>/#{file_to_upload}"
  source file_to_upload
  action :create
end

我推荐你使用Ohai automatic attributes获取底层操作系统的信息。

# On all Fedora and RedHat based platforms
if ['fedora', 'rhel'].include?(node['platform_family'])

  if node['platform_version'].to_i == 6
    cookbook_file '/path/to/file1' do
      source 'file1'
    end
    # ...
  elsif node['platform_version'].to_i == 7
    cookbook_file '/path/to/file2' do
      source 'file2'
    end
  end

end

如果您愿意,也可以使用 Ruby case 语句:

case node['platform_family']
# On all Fedora and RedHat based platforms
when 'fedora', 'rhel'

  case node['platform_version'].to_i
  when 6
    cookbook_file '/path/to/file1' do
      source 'file1'
    end
    # ...
  when 7
    cookbook_file '/path/to/file2' do
      source 'file2'
    end
  end

end

您也可以使用变量来保存要上传的文件:

myfile =
  if ['fedora', 'rhel'].include?(node['platform_family']) && node['platform_version'].to_i == 6
    'file1'
  else
    'file2'
  end

cookbook_file "/path/to/#{myfile}" do
  source myfile
end

有关更多信息和示例,请参阅 recipe DSL documentation

使用 cookbook_file 资源,您不是在上传文件,而是在本地复制它,因为它已随菜谱一起下载到节点上(或者可以下载 'on-demand',取决于您的 client.rb 配置。

cookbook_file 中的 files 目录允许将 file_specificity 用于此确切用例,因此在您的上下文中,您的食谱将仅为:

cookbook_file '/path/to/target' do
   source 'my_source_file'
   action :create
end

您的 cookbook 文件目录将如下所示(当没有其他匹配目录时将使用默认文件,请参阅上面 link 中的完整文档):

cookbook/
├── files
│   └── default
│       └── my_source_file
│   └── redhat_6.4
│       └── my_source_file
│   └── redhat_7.1
│       └── my_source_file

如果你真的只想使用主要版本,那么你可以在目录结构中删除次要版本,并像这样使用源代码中的 Ohai 属性 属性(使用双引号插入变量):

cookbook_file '/path/to/target' do
   source "#{node[platform]}-#{node[platform_version][/(\d).\d/,1]}/my_source_file"
   action :create
end