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]]
使用数组、循环和字符串扩展安装多个 Ruby gem 以构建 gem 名称。
chef > %w{ec2 essentials}.each do |gem|
chef > gem_package "knife-#{gem}"
chef ?> end => ["ec2", "essentials"]
工作方法
Chef recipes 是 Ruby 文件,在 Chef run 的上下文中进行评估。它们可以包含简单的 Ruby 代码(例如 if 语句和循环)以及 Chef DSL 元素(例如资源)。
在配方中,您可以简单地声明 Ruby 变量并为其赋值。