如何烹饪尚不存在的事物


9

假设我有一些厨师代码,例如:

require 'mixlib/shellout'
yum_package 'somepackage'
myvar =  Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip

在那里/bin/somecommand,因为它是由安装还不存在somepackage。由于这个原因,这将在配方编译时失败,但是显然会在收敛时起作用,前提是成功安装了软件包(如果没有成功,则显然配方无论如何都失败了)。如果将软件包安装为运行列表中的先前配方,这也将失败,因为它们都是预先编译在一起的。如何在食谱或运行列表自身安装的厨师食谱中包含内容?


这样的事情是不是在Cfengine的一个问题

1
在没有洞察力的情况下myvar,没有真正的答案,通常我会避免在编译时使用来自外部命令的代码评估,除非非常有必要定义其他资源。简而言之,我会做ruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
Tensibai'9

@Tensibai node.run_state正是我想要的-谢谢。做出答案,我会接受的!
Gaius

那将不得不等到明天:)太难在电话上写出正确的答案了
Tensibai

Answers:


4

我会node.run_state在运行中存储一个临时变量,并在一个变量中对其进行定义,ruby_block以便它在收敛时发生,如下所示:

yum_package 'somepackage'

ruby_block 'set myvar' do
  block do
    node.run_state['my_var'] = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
  end
end

据我所知,不需要'mixlib / shellout'是不必要的。


2

具体细节取决于确切的用例。如果该值仅用作另一个资源的属性,则可以使用lazyhelper方法。如果不需要输出,则可以使用execute资源。在某些更复杂的情况下,您可能会使用ruby_block资源或编写自己的自定义资源。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.