【发布时间】:2016-06-22 02:09:04
【问题描述】:
感谢您查看此问题。任何帮助表示赞赏。 我正在使用 vagrant 和 chef 配置一个带有 GUI 的虚拟机。
目标:下载 IntelliJ IDE,然后安装它,以便我的用户在登录时可以使用它。
cookbook 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
【问题讨论】:
-
谢谢@coderanger。您的解决方案按预期工作。我编辑了需要延迟到收敛时间和机器按预期配置的两个块。
... content lazy { ::File.open('/opt/idea/bin/idea.png').read }和...to lazy { '/opt/idea/bin/idea.sh' }
标签: ruby vagrant chef-infra