Я смотрю на http://docs.opscode.com/chef/resources.html#execute а в разделе «Выполнить» в «Выполнить команду с использованием шаблона» они вызывают шаблон с круглыми скобками вокруг аргумента. Всего лишь несколько утверждений, сделанных ранее, они вызывают 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
Я никогда раньше не видел такого синтаксиса / стиля, пока вы не указали на это. Использование скобок в такой ситуации совершенно необязательно и сбивает с толку. Достаточно просто указать шаблон и имя файла.
Рецепты от шеф-повара написаны на 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>
(здесь ничего нет, просто чтобы показать пример)