加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

红宝石 – 如何用厨师懒惰地评估任意变量

发布时间:2020-12-16 19:44:27 所属栏目:百科 来源:网络整理
导读:我正在写一个厨师食谱来安装我们的应用程序代码并执行它.该配方需要特别关于此代码最终的目录(运行模板,设置日志转发等).因此,目录本身在不同配方的很多地方弹出. 我试图获取/定义一个变量,所以我可以重新使用它在我的资源块与字符串插值.这很简单: home =
我正在写一个厨师食谱来安装我们的应用程序代码并执行它.该配方需要特别关于此代码最终的目录(运行模板,设置日志转发等).因此,目录本身在不同配方的很多地方弹出.

我试图获取/定义一个变量,所以我可以重新使用它在我的资源块与字符串插值.这很简单:

home = node['etc']['passwd'][node['nodejs']['user']]['dir']

以示例的用法来运行npm安装,同时告诉它在主目录中下载repo,如下所示:

execute "npm install" do
  command "npm install #{prefix}#{app} --prefix #{home}"
end

除了定义home变量的第一个块将在编译时运行.在一个新的服务器上,我的nodejs用户帐户可能不存在,这是一个问题,给出了一个

NoMethodError undefined method '[]' for nil:NilClass

我有几个解决方法,但我想要一个具体的解决方案,使家庭变量只在食谱执行时,而不是编译时提取.

解决方法1

动态评估一个红宝石块内的home变量,就像这样:

ruby_block "fetch home dir" do
  block do
    home = node['etc']['passwd'][node['nodejs']['user']]['dir']
  end
end

这似乎实际上不起作用,当您尝试执行以下操作时,为Chef :: Resource :: Directory提供一个NoMethodError undefined方法:

directory ".npm" do
  path "#{home}/.npm"
end

我觉得我一定在这里做错事.

解决方法2

对需要它的每个资源进行懒惰评估.所以这样做:

directory ".npm" do
  path lazy "#{node['etc']['passwd'][node['nodejs']['user']]['dir']}/.npm"
end

但是,只需要保持一行代码一次,将其存储在一个变量中并完成它就真的很好.

解决方法3

在编译时创建用户.这当然是使用notify trick linked here,像这样:

u = user node['nodejs']['user'] do
  comment "The #{node['nodejs']['user']} is the user we want all our nodejs apps will run under."
  username node['nodejs']['user']
  home "/home/#{node['nodejs']['user']}"
end

u.run_action(:create)

这完全解决了我的问题,但还有其他一些情况,我可以想象想要延迟对变量进行评估的能力,所以我让我的问题立场.

我想要什么

我真的很想能做到

home lazy = node['etc']['passwd'][node['nodejs']['user']]['dir']

但是这不是合法的语法,给出NameError在ubuntu 13.10版找不到一个资源(这是一个奇怪的语法错误,但是无论如何).有没有法律的方式来实现这一点?

解决方法

我没有测试过这个特定的代码,但是我在烹饪书中做了类似的操作,并使用lambda来延迟评估,如下所示:
home = lambda {node['etc']['passwd'][node['nodejs']['user']]['dir']}

execute "npm install" do
  command "npm install #{prefix}#{app} --prefix #{home.call}"
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读