如果您来自其他语言(不是 Ruby),这种语法可能看起来很奇怪。让我们分解一下。
当调用带参数的方法时,大多数情况下括号是可选的:
-
foo(bar) 等价于 foo bar
-
foo(bar, baz) 等价于 foo bar, baz
Ruby 代码块可以用大括号 ({}) 或 do..end 块包裹,并且可以作为最后一个参数传递给方法(但请注意,如果您使用的是括号在他们之后。一些例子:
foo(bar) { # code here }
foo(bar) do
# code here
end
foo bar do
# code here
end
foo do
# code here
end
在某些情况下,代码块可以接收参数,但在 Chef 中,资源块永远不会这样做。仅供参考,其语法为:
foo(bar) do |baz, qux|
baz + qux
end
特别是关于 Chef 资源,它们的语法通常是:
resource_type(name) do
attribute1 value1
attribute2 value2
end
这意味着,当你说:
log "a debug string" do
level :debug
end
您实际上是在创建一个log 资源,其name 属性设置为"a debug string"。稍后可以使用log[a debug string] 引用它(例如在其他资源中)。
AFAIK,name 属性对于每个 Chef 资源类型都是必需的,因为它使它独一无二,并且允许您在声明它之后对其调用操作。
旁注: ruby 块对于 Chef 资源通常是可选的。如果您执行以下操作:
directory "/some/path"
Chef 将使用其默认属性(其中是 action :create)编译该资源,并尝试使用这些属性创建命名目录。