在一个配方中,我有一个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'我似乎无法获得。
是否有人能够提供我需要的帮助才能使其正常工作?
提前致谢。
答案 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>
并根据检索到的值,您可以采取行动