在 chef 资源文档中,为什么执行示例中的模板资源中的名称周围有括号?

在 chef 资源文档中,为什么执行示例中的模板资源中的名称周围有括号?

我正在看http://docs.opscode.com/chef/resources.html#execute在“使用模板执行命令”中的“执行”下,它们使用括号将参数括起来来调用模板。就在前面的几个语句中,它们调用了不带括号的执行。对于文档的其余部分,调用模板时没有括号。这种不一致有什么原因吗?

execute "forward_ipv4" do
  command "echo > /proc/.../ipv4/ip_forward"
  action :nothing
end

template( "/etc/file_name.conf" ) do
  source "routing/file_name.conf.erb"
  notifies :run, 'execute[forward_ipv4]', :delayed
end

答案1

在您指出之前,我从未见过这种语法/样式。在这种情况下使用括号完全没有必要,而且容易引起混淆。只需指定模板和文件名就足够了。

答案2

Chef 菜谱是用 Ruby 编写的,DSL 用于#method_missing定义菜谱中的资源。

因此,每个资源都是一个方法,它接受一个参数(字符串,名称)和一个块(参数)。

Ruby 中,参数周围的括号是可选的,关于是否使用括号的文章有很多。在互联网上。虽然是否在 Chef 资源中使用它们并不重要,但大多数情况下它们都会被省略。

但是,如果您希望在一行上写资源,则需要括号:

execute "echo Hello" { action :nothing }

SyntaxError: (irb#1):1: syntax error, unexpected '{', expecting $end
execute "echo Hello" { action :nothing }
                      ^

execute("echo Hello") { action :nothing }

 => <execute[echo Hello] @name: "echo Hello" @noop: nil @before: nil
 @params: {} @provider: nil @allowed_actions: [:nothing, :run]
 @action: [:nothing] @updated: false @updated_by_last_action: false
 @supports: {} @ignore_failure: false @retries: 0 @retry_delay: 2
 @source_line: "(irb#1):2:in `irb_binding'" @elapsed_time: 0
 @resource_name: :execute @command: "echo Hello" @backup: 5 @creates:
 nil @cwd: nil @environment: nil @group: nil @path: nil @returns: 0
 @timeout: nil @user: nil @umask: nil @cookbook_name: nil
 @recipe_name: nil>

(此处的动作仅供举例)

相关内容