7

因为我遇到了已报告给 Mixlib 团队的 MIXLIB-11错误,所以我需要找到一个替代方案,即 Mixlib::Shellout 的替代方案。

简单说一下问题:

是一条语句,上面写着“*毫不奇怪——读取发生在编译时,但 remote_file 资源实际上在执行时创建的。**”

由于此功能,即使该目录是由当前配方中包含的先前配方在执行时创建的,也会Mixlib::Shellout.new("ls", :cwd => '/opt/cubrid/share/webmanager')引发“没有此类文件或目录”错误。

有没有办法在执行时读取文件/目录?

4

4 回答 4

14

找到答案:将代码包装在 中ruby_block,它将在运行时执行。

ruby_block "Check if CURBID Web Manager needs installation" do
  block do
    version = ""

    if File.exists?("#{CWM_HOME_DIR}/appLoader.js")
      # Read the CWM version from file.
      f = File.open("#{CWM_HOME_DIR}/appLoader.js")

      pattern = /Ext\.cwm\.prodVersion = '(\d+\.\d+\.\d+\.\d+)'/

      f.each {|line|
        if match = pattern.match(line)
          version = match[1]
          break
        end
      }

      f.close
    end
  end
end

现在该版本已从上一个配方中创建的文件中正确填充。

于 2013-03-29T02:29:01.103 回答
0

如果使用自定义资源,则可以使用该load_current_value方法。

action :some_action do

  load_current_value do
    if File.exist?('/var/www/html/index.html')
      homepage IO.read('/var/www/html/index.html')
    end
    if File.exist?('/var/www/html/404.html')
      page_not_found IO.read('/var/www/html/404.html')
    end
  end

end

https://docs.chef.io/dsl_custom_resource.html

于 2016-04-02T17:38:24.700 回答
0

就个人而言,我更喜欢type在执行过程中使用命令将文件读入变量。

要简单地将文件读入变量,您可以尝试

ruby_block 'Read IP file into v_ip variable' do
   block do
       if File.exists?("#{v_ip_folder}\\ip.txt")
          v_ip = %x(type "#{v_ip_folder}\\ip.txt")
          Chef::Log.info("#{v_ip}")
       end
   end
end 

%x(type "#{v_ip_folder}\\ip.txt")type在命令提示符下运行命令并将输出返回到v_ip指定的变量。

于 2018-11-01T13:12:25.183 回答
-4

考虑一个remote_file. 它在执行(运行)时执行,它也可以与本地文件一起使用,例如:

remote_file "Copy file" do
  path "file:///opt/destination.txt"
  source "file:///opt/source.txt"
  owner 'root'
  group 'root'
  mode 0755
end

所以使用remote_file是很好的解决方法。编写自定义代码需要时间并且容易出错。另请参阅此答案

于 2014-12-20T06:30:41.637 回答