如何在Chef中包含尚不存在的内容

80次阅读
没有评论

问题描述

在使用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中包含尚不存在的内容的解决方案。希望对你有帮助!

正文完