如何使用Chef和execute更新Java的update-alternatives?

4

我遇到了语法错误,不确定如何解决。在角色文件中,我定义了以下内容:

default_attributes(
  'jdk' => {
    'version' => '1.8.0_31'
  },
  'java' => {
    'home' => '/usr/lib/jvm/jdk1.8.0_31'
  },
)

我尝试使用以下的Java路径,但运行失败了。

execute "update_alt_java" do
  command "update-alternatives --install "/usr/bin/java" "java" "#{node['java']['home']}/bin/java" 1"
  action :creates
end

我收到了以下错误信息。
SyntaxError
-----------
/etc/chef/src/cookbooks/jdk/recipes/default.rb:50: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('
...tives --install "/usr/bin/java" "java" "#{node['java']['home...
...                               ^
/etc/chef/src/cookbooks/jdk/recipes/default.rb:50: syntax error, unexpected tIDENTIFIER, expecting keyword_end
...--install "/usr/bin/java" "java" "#{node['java']['home']}/bi...
2个回答

6

你是否在使用社区java cookbook

它包含了一个LWRP(Lightweight Resource Provider)来实现这个目的:

# set alternatives for java and javac commands
java_alternatives "set java alternatives" do
    java_location '/usr/local/java'
    bin_cmds ["java", "javac"]
    action :set
end

更新:"my_java"包装器菜谱示例

以下是名为“my_java”的示例菜谱,旨在在Ubuntu上安装Oracle JDK:

├── attributes
│   └── java.rb   <-- Used for java cookbook attribute overrides
├── Berksfile
├── Berksfile.lock
├── metadata.rb
├── README.md
└── recipes
    └── default.rb

运行 Chef 后,Oracle JDK 将被安装

$ java -version
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)

注:

  • 此食谱依赖于覆盖属性。这同样可以通过Chef环境或角色来实现。

metadata.rb

name             'my_java'
maintainer       'Mark O''Connor'
maintainer_email 'XXXXXXXXXXXXXXX'
license          'All rights reserved'
description      'Installs/Configures my_java'
long_description 'Installs/Configures my_java'
version          '0.1.0'

depends "apt"
depends "java"

attribute/java.rb

normal['java']['jdk_version'] = '8'
normal['java']['install_flavor'] = 'oracle'
normal['java']['oracle']['accept_oracle_download_terms'] = true

注意事项:

  • 默认情况下,Java会安装openJDK。这些覆盖指定了OracleJDK的v8版本。

recipes/default.rb

include_recipe "apt"
include_recipe "java"

注意:

  • 显然,“apt”食谱仅适用于基于Debian的Linux。该配方需要进行微小调整才能在Redhat上运行。

嗨。我使用来自https://supermarket.chef.io/cookbooks/java的食谱,Linux可以,但在Windows上我无法安装,出现了错误的URI。请帮帮我。 - Luna
@Luna 看起来在 Windows 上,您必须为 Java 包二进制文件提供一个 URL。请参见:https://github.com/agileorbit-cookbooks/java/blob/master/attributes/default.rb#L41 - Mark O'Connor
非常感谢,但它不能运行。出现了新的错误窗口包[tar] T_T。 - Luna
"java_alternatives"是什么意思?在菜谱中它会出现在哪里?运行“chef-client --local-mode --runlist 'recipe[chef]'”后,它给我返回了一个错误:缺少菜谱:windows。 - goCode
@gocode 最好作为一个新问题提出。乍一看,您的问题似乎是在 chef 服务器中缺少 cookbook。 - Mark O'Connor
显示剩余3条评论

2

您需要转义命令字符串中的所有双引号,因为它以双引号开头和结尾。

execute资源没有:creates操作。应该使用:run操作。

execute "update_alt_java" do
  command "update-alternatives --install \"/usr/bin/java\" \"java\" \"#{node['java']['home']}/bin/java\" 1"
  action :run
end

但是你不想在每次运行chef时都运行此资源,因此你应该想出某种条件,只有在符合条件时才能运行它(使用only_if,not_if语句)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接