【问题标题】:How to configure software using chef and vagrant after install recipe runs安装配方运行后如何使用 Chef 和 vagrant 配置软件
【发布时间】: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


【解决方案1】:

你可能想要的是一个惰性求值的属性:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2015-11-06
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多