问题描述
在使用Chef时遇到了一个问题,他想在一个Chef recipe中包含一些代码,但这些代码或者所需的资源在recipe编译时还不存在。他尝试使用Mixlib::ShellOut
来运行一个命令获取所需的资源,但由于命令所需的资源尚未安装,所以在recipe编译时失败了。他想知道如何在Chef recipe中包含这些尚不存在的内容。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在Chef中,可以使用node.run_state
来存储一个临时变量,并在ruby_block
中定义它,以便在收敛时执行。具体步骤如下:
1. 在recipe中使用yum_package
来安装所需的包。
2. 使用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
在上面的示例中,我们首先使用yum_package
来安装所需的包。然后,使用ruby_block
来定义一个临时变量my_var
,并在其中运行命令/bin/somecommand
来获取所需的资源。最后,将获取到的资源存储在node.run_state['my_var']
中。
请注意,node.run_state
中存储的变量只在当前Chef run中有效,不能跨多个Chef run共享。
方案2
如果所需的值只是作为另一个资源的属性使用,可以使用lazy
方法来延迟求值。如果不需要输出,可以使用execute
资源。在一些更复杂的情况下,可能需要使用ruby_block
资源或编写自定义资源。
具体使用方法根据具体情况而定,可以根据实际需求选择合适的方法。
以上是关于如何在Chef recipe中包含尚不存在的内容的解决方案。希望对你有帮助!