应该使用厨师从源头安装东西,我应该做一些检查

我使用厨师和脚本资源从源安装东西。 我应该做一个检查生成的可执行文件等作为它的一部分?

例如,我目前拥有的是:

remote_file "/tmp/foo.tar.gz" do source "foo.tar.gz" mode "0644" end script "install_foo" do interpreter "bash" user "root" cwd "/tmp" code <<-EOH tar -zxf foo.tar.gz cd foo make cp foo /usr/local/bin EOH end 

如果foo不存在,该脚本将以1退出,因此不能被复制。 如果chef能够正确处理不成功退出的脚本(退出代码0 ),则不需要再次进行检查,但是如果没有,我强烈build议您创build一个。

我现在无法检查chef的行为,但是testing这个很容易:把一个exit 1作为脚本的最后一行,看看会发生什么。

无论如何,由于检查现有的文件并不困难,为什么不简单地做,只是为了安全呢?

您应该使用not_if或only_if元参数到脚本资源,否则每次在节点上运行时Chef都会执行该脚本。 取决于你正在编译的软件,它可以像存在的文件一样简单,或者它是一个非零的大小,或者像复制/ usr / local / bin中复制的命令一样输出一些特定的string。

例如,如果您想查看该文件是否仅存在并假定最好:

 script "install_foo" do # .. other stuff you wrote! not_if "test -x /usr/local/bin/foo" end 

您应该确保该文件是可执行的,因为您将它放在/ usr / local / bin中。

 file "/usr/local/bin/foo" do mode 0755 end 

如果你想检查命令是否有一些特定的输出,你可以做如下的事情:

 script "install_foo" do # .. other stuff you wrote! not_if "test -x /usr/local/bin/foo && /usr/local/bin/foo | grep -x 'foo is awesome'" end 

(当然,假设运行foo会有这个输出。)

not_if(和only_if)元参数可以带一个string或一个Ruby块。 如果它是一个string,那么这将是在系统上执行的shell命令。 如果它是一个Ruby块(do .. end或{}),那么它将被作为Ruby执行。

元参数在“资源”页面下的Chef wiki中logging。

我宁愿使用Chef :: Mixin :: ShellOut实用程序喜欢在这篇文章中https://stackoverflow.com/questions/16309808/how-can-i-put-the-output-of-a-chef-execute-resource-成-A-可&#x53D8;

我会运行带有正确参数的命令来检查它的版本号(在大多数情况下是[?]),这样你检查两件事情:

  1. 编译不仅工作,而且创build了一个运行的二进制文件
  2. 你有你期望的版本

因为拥有一个文件不足以假定二进制文件运行,并且它是你期望的版本