Chef - 带有 Chef DSL 的纯 Ruby


在 Chef 中,如果需要创建简单的菜谱,可以使用 Chef 中可用的资源,例如模板、remote_file 和服务。然而,随着配方变得复杂,人们需要先进的技术,例如条件语句来根据条件执行配方的部分内容。这就是将普通 Ruby 与 Chef 领域特定语言 (DSL) 混合在一起的力量。

如何使用它?

在任意节点上以客户端模式启动Chef Shell即可访问Chef服务器。

user@server:~$ sudo chef-shell --client 
loading configuration: /etc/chef/client.rb 
Session type: client 
...TRUNCATED OUTPUT... 
run `help' for help, `exit' or ^D to quit. 
Ohai2u user@server! 
Chef> 

Chef DSL 的基本条件

使用普通 Ruby 按名称对节点进行排序。

chef > nodes.sort! {|a,b| a.name <=> b.name } 
=> [node[alice],node[server]] 

循环遍历节点,打印它们的操作系统。

chef > nodes.each do |n| 
   chef > puts n['os'] 
   chef ?> 
end  
linux 
windows 
=> [node[server], node[alice]] 

使用数组、循环和字符串扩展来构造 gem 名称来安装多个 Ruby gem。

chef > %w{ec2 essentials}.each do |gem| 
   chef > gem_package "knife-#{gem}" 
   chef ?> end   => ["ec2", "essentials"] 

工作方式

Chef 食谱是 Ruby 文件,在 Chef 运行的上下文中进行评估。它们可以包含纯 Ruby 代码(例如 if 语句和循环)以及 Chef DSL 元素(例如资源)。

在配方中,我们可以简单地声明 Ruby 变量并为其赋值。