如何在 Chef 食谱中传递变量

How to pass variables in Chef recipe

我想知道如何使用 Chef 和变量来管理它。 我的默认部分包含以下变量

node.default['common']['docker'] = "18.09.1"

所以,我想通过变量来管理版本

 remote_file 'docker'-node['common']['docker'] do
    source 'https://download.docker.com/linux/static/stable/x86_64/docker-'node['common']['docker']'.tgz'
        owner 'root'
        group 'root'
        mode '0755'
        action :create
    end

bash 'install docker' do
    code <<-EOH
            tar xzvf node['common']['docker']
            sudo cp docker/* /usr/bin/
            sudo groupadd docker
            sudo usermod -a -G docker ec2-user
            sudo dockerd &
            EOH
end

但是我遇到了这个错误

Chef Client failed. 0 resources updated in 02 seconds
FATAL: SyntaxError: /tmp/packer-chef-solo/local-mode-cache/cache/cookbooks/recipes/common.rb:90: syntax error, unexpected tIDENTIFIER, expecting keyword_end

您似乎在寻找 string/variable interpolation。 Chef 属性与 Ruby.

等编程语言中的变量相同

Ruby 中的字符串插值是使用 "#{}" 语法执行的。花括号内的任何 variable/attribute 都将被插入。

因此您的 remote_file 资源应该如下所示:

remote_file "/tmp/docker-#{node['common']['docker']}.tgz" do
  source "https://download.docker.com/linux/static/stable/x86_64/docker-#{node['common']['docker']}.tgz"
  owner 'root'
  group 'root'
  mode '0755'
  action :create
end

请注意,我使用了外部双引号 ",因为它是插值所必需的。此外,我已将目标路径包含为 /tmp 以保存文件。