我是
Ruby和Chef的新手.我一直试图绕过语法并做一些研究,但我相信大家都知道,除非你知道术语,否则很难找到你想要的东西.
我已经阅读了Ruby代码块,但是Chef代码块仍然让我困惑.我看到这样的事情:
log "a debug string" do level :debug end
这会在日志中添加“调试字符串”.从我所看到的情况来看,在我看来它应该表示为:
log do |message| #some logic end
Chef将这些视为资源.有人可以帮助解释语法差异并给我一些术语,我可以从中开始教育自己吗?
解决方法
如果你来自另一种语言(不是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
您实际上是在创建一个日志资源,其name属性设置为“调试字符串”.稍后可以使用log [调试字符串]来引用它(例如,在其他资源中).
AFAIK,name属性对于每个Chef资源类型都是必需的,因为它使它独特,并允许您在声明之后调用其上的操作.
附注:对于Chef资源,ruby块通常是可选的.如果您执行以下操作:
directory "/some/path"