我正在看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>
(此处的动作仅供举例)