📜  Chef-带DSL的普通Ruby

📅  最后修改于: 2020-11-02 03:24:45             🧑  作者: Mango


在Chef中,如果需要创建简单的配方,则可以使用Chef中可用的资源,例如模板,remote_file和服务。但是,随着配方的复杂化,人们需要先进的技术,例如条件语句以按条件执行配方的某些部分。这是将纯Ruby与Chef Domain Specific Language(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]] 

使用数组,循环和字符串扩展来安装多个Ruby gem,以构造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变量并为其分配值。