使用Chef社区Cookbook安装Java 1.8.2报错及相关疑问
Java Cookbook安装问题排查与疑问解答
问题背景
我尝试使用Chef Supermarket的社区Java Cookbook来安装Java 1.8.2,已经完成了这些配置:在metadata.rb中添加了依赖、Berksfile里做了对应配置,也在recipe中加入了include_recipe。但执行chef-client时却报错了,目前发现服务器还没配置yum源,不确定是不是这个原因导致的。另外还有个疑问:如果目标节点已经安装了Java 1.8,这个Cookbook还会执行安装操作吗?
报错详情
* yum_package[java-1.6.0-openjdk] action install [2018-01-19T04:22:52-05:00] INFO: Processing yum_package[java-1.6.0-openjdk] action install (java::openjdk line 93) * No candidate version available for java-1.6.0-openjdk ================================================================================ Error executing action `install` on resource 'yum_package[java-1.6.0-openjdk]' ================================================================================ Chef::Exceptions::Package ------------------------- No candidate version available for java-1.6.0-openjdk Resource Declaration: ---------------------# In /var/chef/cache/cookbooks/java/recipes/openjdk.rb 93: package pkg do 94: action :install 95: notifies :create, "ruby_block[update-java-alternatives]", :immediately if platform?("ubuntu","debian","redhat","centos","fedora","scientific","amazon") 96: end 97: end Compiled Resource: ------------------# Declared in /var/chef/cache/cookbooks/java/recipes/openjdk.rb:93:in `block in from_file' yum_package("java-1.6.0-openjdk") do package_name "java-1.6.0-openjdk" action [:install] retries 0 retry_delay 2 default_guard_interpreter :default declared_type :package cookbook_name "java" recipe_name "openjdk" flush_cache {:before=>false, :after=>false} end System Info: ------------ chef_version=12.21.26 platform=redhat platform_version=7.4 ruby=ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-linux] program_name=chef-client worker: ppid=3118;start=04:22:48; executable=/opt/chef/bin/chef-client
问题解答
1. 报错原因与修复方案
先看报错核心:Chef在尝试安装java-1.6.0-openjdk但找不到可用包,结合你提到的未配置yum源,这俩是直接相关的:
- RedHat系统默认的官方yum源需要订阅授权才能访问,如果没配置可用的替代源(比如内部镜像、阿里云/网易的公共源),系统根本搜不到对应的Java包,自然会报这个错。
- 另外,你要装的是Java 1.8.2,但Cookbook默认去装1.6版本,说明你没在配置里指定目标版本,它走了默认逻辑。
按这两步来修复:
- 先配置可用yum源:给RedHat 7.4添加合法的yum源,比如CentOS的兼容源(RedHat 7和CentOS 7包兼容),或者你们内部的镜像源。配置完后执行
yum clean all && yum makecache刷新缓存,确保源能正常访问。 - 指定Java版本:在你的自定义recipe里明确设置要安装的版本,比如:
这样Cookbook就会去拉取Java 1.8对应的包(node.default['java']['jdk_version'] = '8' include_recipe 'java::openjdk'java-1.8.0-openjdk),而不是默认的1.6了。
2. 已安装Java 1.8时的执行逻辑
Chef的package资源是幂等的,简单说就是“只做需要做的事”:
- 如果节点已经安装了指定版本的Java包,
yum_package的:install动作会先检查当前系统状态,发现包已经存在且版本符合要求,就会直接跳过安装步骤,不会重复执行。 - 不过Cookbook里如果还有其他资源(比如更新java alternatives、设置环境变量这类),这些还是会按配置执行——比如如果当前系统的java alternatives没指向你要的1.8版本,Cookbook会触发更新操作。
内容的提问来源于stack exchange,提问作者codec
相关产品推荐
相关产品推荐

