Ruby代码块和Chef

2 ruby chef-infra chef-recipe

我是Ruby和Chef的新人.我一直试图围绕语法进行研究并做一些研究,但我相信大家都知道,除非有人知道术语,否则很难找到你想要的东西.

我已经阅读了Ruby代码块,但是Chef代码块仍然让我困惑.我看到这样的事情:

log "a debug string" do
    level :debug
end
Run Code Online (Sandbox Code Playgroud)

这会在日志中添加"调试字符串".从我所看到的情况来看,在我看来它应该表示为:

log do |message|
    #some logic
end
Run Code Online (Sandbox Code Playgroud)

Chef将这些视为资源.有人可以帮助解释语法差异并给我一些术语,我可以从中开始教育自己吗?

cas*_*eal 6

如果你来自另一种语言(不是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
Run Code Online (Sandbox Code Playgroud)

在某些情况下,代码块可以接收参数,但在Chef中,资源的块永远不会.仅供参考,其语法为:

foo(bar) do |baz, qux|
  baz + qux
end
Run Code Online (Sandbox Code Playgroud)

特别是关于Chef资源,它们的语法通常是:

resource_type(name) do
  attribute1 value1
  attribute2 value2
end
Run Code Online (Sandbox Code Playgroud)

这意味着,当你说:

log "a debug string" do
  level :debug
end
Run Code Online (Sandbox Code Playgroud)

您实际上是在创建属性设置为的log资源.稍后可以参考(在其他资源中)使用.name"a debug string"log[a debug string]

AFAIK,该name属性对于每个Chef资源类型都是必需的,因为它使它独特,并允许您在声明之后调用其上的操作.


附注:对于Chef资源,ruby块通常是可选的.如果您执行以下操作:

directory "/some/path"
Run Code Online (Sandbox Code Playgroud)

Chef将使用其默认属性(其中包括action :create)编译该资源,并尝试使用这些属性创建命名目录.