【问题标题】:How to pass variables in Chef recipe如何在厨师食谱中传递变量
【发布时间】:2021-04-18 13:21:40
【问题描述】:

我想知道如何使用 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

【问题讨论】:

标签: chef-infra


【解决方案1】:

您似乎正在寻找string/variable interpolation。 Chef 属性与 Ruby 等编程语言中的变量相同。

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

所以你的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 以保存文件。

【讨论】:

  • 如果我想把它放在带有 EOH 的 bash 代码上: tar xzvf "/tmp/docker-#{node['common']['docker']}.tgz" 会是这样的?
  • 没错。您可能还想为tar 命令设置cwd-C path/to/extract,例如:tar xzf "/tmp/docker-#{node['common']['docker']}.tgz" -C /tmp。也就是说,看看archive_file resource 以幂等方式进行此提取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多