2017-06-06 42 views
0

在一个配方中,我有一个rubyblock,最终获得我想要重新启动的服务的端口。将变量从一个厨师食谱发送到另一个,以触发资源块

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

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

,其取得上述端口我的默认食谱是:

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

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

我试图触发使用通知发件人名称为“停止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使用“口”,这我似乎无法获得。

任何人都可以帮助我做什么,为了得到这个工作吗?

在此先感谢。

+0

这就是'node.run_state'是。看到这里的文档:https://docs.chef.io/recipes.html#node-run-state – Tensibai

+0

@Tensibai - 谢谢你,我会看看 – null

回答

1

默认情况下,Ruby中的变量是本地的。你将不得不使用全局变量来共享文件之间的状态,或者是一个真正的Ruby全局变量($foo),或者使用我们公开给全部食谱的全局node.run_state散列。

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

+0

我不是一个全能的粉丝, ) 我看不出还有什么要做,虽然厨师知识有限...... 决定端口的食谱是一只野兽;反过来收集,设置和构建对象 - 这是否适合自定义资源? – null

+0

null,你可以绝对把它变成一个自定义资源。基本上可以在配方中完成的任何事情都可以成为自定义资源。语法可能需要更改一些特定的调用,因为您将处于不同的环境中,但我相信您可以弄明白。主要的区别是你必须为每个你希望能够传入的变量提供一个属性,在这个例子中是'port'。您也可以从自定义资源中调用其他资源。 – JackChance

0

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

样品:

node.normal['A']['B']['C']="completed" 
node.save 

,并在第二个配方你可以从该节点的信息。

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

,并根据所取回的价值,你可以采取行动

+0

切勿在Chef代码中使用node.save。请删除此答案或对其进行修改,这是不安全的。 – coderanger