将变量从一个Chef配方发送到另一个Chef配方以触发资源块

时间:2017-06-06 10:47:35

标签: ruby solr chef chef-recipe

在一个配方中,我有一个rubyblock,最终获得了我想重新启动的服务端口。

单独的食谱工作正常,我现在正试图将两者结合在一起。

我似乎无法将变量传递给试图遵循自定义资源示例的其他配方。

获取端口的默认配方是:

 Chef::Log.info("Port: #{port}")

 Chef::Resource::Notification.new("stop-solr_#{port}", :run, self)

我试图触发名称的资源块' stop-solr _' portNumber''使用通知发件人。

我的其他食谱如下所示,并具有启动/停止服务目的

    solrCore = "solr_#{port}"

#define the service - does nothing
service solrCore do
  action :nothing
end

#do something that triggers
execute "start-solr_#{port}" do
  Chef::Log.info('triggers start')
  action :nothing
  notifies :start, run_context.resource_collection.find(:service => "#{solrCore}")
end

execute "stop-solr_#{port}" do
  # some stuff
  # on success...
  Chef::Log.info('triggers restart')
  notifies :stop, run_context.resource_collection.find(:service => "#{solrCore}"), :immediately
  notifies :run, "execute[start-solr_#{port}]"
end

我的主要问题(我认为)是变量solrCore使用' port'我似乎无法获得。

是否有人能够提供我需要的帮助才能使其正常工作?

提前致谢。

2 个答案:

答案 0 :(得分:1)

Ruby中的变量默认是本地的。您必须使用全局变量来共享文件之间的状态,可以是真正的Ruby全局变量($foo),也可以使用我们向所有配方公开的全局node.run_state哈希。

这就是说:有一个原因是可变的全局变量几十年来一直是CS的陈词滥调。像这样的代码非常脆弱,难以调试。我会考虑将这两个配方转换为自定义资源,并使用相同的输入端口从相同的配方中调用它们。

答案 1 :(得分:0)

在第一个配方中,您可以在节点中保存信息。

样品:

status=node.normal['A']['B']['C']

并在第二个Recipe中,您可以从节点检索信息。

<form novalidate autocomplete="off">
  <div class="input-block-container">
    <div class="input-block">
      <input type="text" placeholder="Insert name" name="name[]" />
      <input-effects></input-effects>
    </div>
    <div class="input-block">
      <input type="email" placeholder="Insert email address" name="email[]" />
      <input-effects></input-effects>
    </div>
  </div>
  <div class="input-block-container">
    <div class="input-block">
      <input type="text" placeholder="Insert name" name="name[]" />
      <input-effects></input-effects>
    </div>
    <div class="input-block">
      <input type="email" placeholder="Insert email address" name="email[]" />
      <input-effects></input-effects>
    </div>
  </div>
  <button class="button button--primary" @click.prevent="sendInvites"><span>Send</span></button>
</form>

并根据检索到的值,您可以采取行动