如何在安装配方运行后使用chef和vagrant配置软件

时间:2016-06-21 15:36:17

标签: ruby vagrant chef

感谢您查看此问题。任何帮助表示赞赏。 我正在使用vagrant和chef配置一个带有GUI的虚拟机。

目标:下载IntelliJ IDE然后安装它,以便我在登录时可供用户使用。

食谱cookbook 'idea', '~> 0.4.0'实现下载,但用户必须手动完成访客的安装。

我无法使用自定义配方来完成厨师的配置。在编写时,如果我在配置机器后将其添加到运行列表但是在初始运行中因为文件尚未安装而失败,则配方完成。

我尝试在相关块和整个配方中使用only_if方法,但无法使其工作。我也搞砸了subscribe方法,但也无法解决这个问题。

我确信这有一个简单的解决方案,但谷歌搜索和反复试验并没有让我更接近。我希望有任何帮助来实现这一目标。谢谢!

当前食谱

# Configure IntelliJ Idea.
file '/opt/idea/idea.desktop' do
  content '[Desktop Entry]
      Name=IntelliJ IDEA
      Type=Application
      Exec=idea
      Terminal=false
      Icon=idea
      Comment=Integrated Development Environment
      NoDisplay=false
      Categories=Development;IDE;
      Name[en]=IntelliJ IDEA'
  mode '644'
  owner 'root'
  group 'root'
end

bash 'install idea desktop' do
  code <<-EOH
  cd /opt/idea
  sudo desktop-file-install idea.desktop
  EOH
end

file '/usr/share/pixmaps/idea.png' do
  owner 'root'
  group 'root'
  mode '0644'
  content ::File.open('/opt/idea/bin/idea.png').read
  action :create
end

link '/usr/local/bin/idea' do
  to '/opt/idea/bin/idea.sh'
  link_type :symbolic
end

失败的工作: 包装整个脚本

 # Configure IntelliJ Idea.
    execute 'configure idea' do
      only_if { ::File.exist?("/opt/idea") }
    continues...
    end

在块中使用only_if

file '/usr/share/pixmaps/idea.png' do
    action :create
    only_if { ::File.exist?('/opt/idea/bin/idea.png') }
    owner 'root'
    group 'root'
    mode '0644'
    content ::File.open('/opt/idea/bin/idea.png').read
  end

  link '/usr/local/bin/idea' do
    to '/opt/idea/bin/idea.sh'
    only_if { ::File.exist?('/opt/idea/bin/idea.sh') }
    link_type :symbolic
  end

1 个答案:

答案 0 :(得分:0)

你可能想要的是一个懒惰的评估属性:

content lazy { ::File.open('/opt/idea/bin/idea.png').read }

这将延迟文件读取,直到收敛时间而不是编译时间。