在 「使用 Puppet 在 Ubuntu 系統上自動安裝 Oracle JDK」 這篇文章, 山姆鍋分享一個使用 Puppet 來安裝 Oracle JDK 的方法。雖然可以達到自動的目的,但是還可以再加以改善。 本文山姆鍋同時利用安裝 Oracle JDK 來說明 puppet-java 這個模組。
puppet-java ⎘ 這個 Puppet 模組的主要目的是在 Ubuntu 系統上安裝 Oracle JDK7, 相關原始碼可以在 https://github.com/EAvatarTech/devops-labs/tree/master/recipes/oracle_jdk ⎘ 取得。 相對于之前的做法,Puppet-java 主要改變有:
- 改使用 apt module 來簡化 Ubuntu APT 套件庫管理。
- 在已經安裝 JDK 的情況下,避免不必要的修改動作以節省時間。
Pupppet-java 是個相對簡單的模組,主要只有一個 manifest 檔案,以及一個設定檔。 首先來看 ‘manifests/init.pp’這個檔案:
class java($version='7u45-0~webupd8~0', $distribution='jdk') {
if( !defined(Class['apt']) ) {
class { 'apt': }
}
# Only exec if package 'python-software-properties' not installed.
# Without this, 'apt::ppa' will fail.
exec { 'enforce_apt_update':
command => 'apt-get update',
path => ['/usr/bin','/usr/sbin', '/bin', '/sbin'],
onlyif => 'apt-cache policy python-software-properties | grep none',
}
apt::ppa { 'ppa:webupd8team/java':
require => Exec['enforce_apt_update'],
notify => [Exec['set-licence-selected'], Exec['set-licence-seen']],
}
exec { 'set-licence-selected':
command => '/bin/echo debconf shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections',
refreshonly => true,
}
exec {'set-licence-seen':
command => '/bin/echo debconf shared/accepted-oracle-license-v1-1 seen true | /usr/bin/debconf-set-selections',
refreshonly => true,
}
package { 'oracle-java7-installer':
ensure => "${version}",
require => Apt::Ppa['ppa:webupd8team/java'],
}
file { '/etc/profile.d/java.sh':
ensure => present,
source => "puppet:///modules/java/java.sh",
owner => "root",
group => "root",
mode => 644,
require => Package['oracle-java7-installer'],
}
}
由於需要使用 apt module,在一開始先確定需要的 Class 是否已經存在,如果沒有則加入:
if( !defined(Class['apt']) ) {
class { 'apt': }
}
Vagrant 提供的 VM image(基於 Ubuntu 12.04 LTS)如果沒有先執行’apt-get update’的話, 會導致後續無法找到’python-software-properties’可以安裝,而這個套件是加入 PPA 套件庫所需, 也就是 ‘apt::ppa { ‘ppa:webupd8team/java’: ‘這個資源所描述。
# Only exec if package 'python-software-properties' not installed.
# Without this, 'apt::ppa' will fail.
exec { 'enforce_apt_update':
command => 'apt-get update',
path => ['/usr/bin','/usr/sbin', '/bin', '/sbin'],
onlyif => 'apt-cache policy python-software-properties | grep none',
}
為了避免每次配置都需要重新執行’apt-get
update’的動作,注意’onlyif’這個屬性(attribute),
它告訴 puppet 只有在對應的測試成功時才執行。 'apt-cache policy python-software-properties \| grep none\'
會在沒有安裝 python-software-properties 回傳 0 代表尚未安裝。
更新過套件庫列表後(apt-get update)後,可以加入 ‘ppa:webupd8team/java’這個 PPA 了, 這樣我們後續才能安裝它提供的’oracle-java7-installer’這個套件,此套件會從 Oracle 官方網站下載 JDK。
apt::ppa { 'ppa:webupd8team/java':
require => Exec['enforce_apt_update'],
notify => [Exec['set-licence-selected'], Exec['set-licence-seen']],
}
安裝 PPA 後,會通知去執行 ‘set-licence-selected’以及’set-licence-seen’ 這兩個動作來自動回答安裝 ‘oracle-java7-installer’ 過程中要回覆的問題。
準備好了套件來源以及安裝過程中的自動回覆動作後,終於可以開始安裝 JDK 套件了。
package { 'oracle-java7-installer':
ensure => "${version}",
require => Apt::Ppa['ppa:webupd8team/java'],
}
其中的’require’屬性表明’oracle-java7-installer’需要’ppa:webupd8team/java’這個 PPA。
最後,提供一個環境設定檔:‘/etc/profile.d/java.sh’來確保 JAVA_HOME 這個環境變數有正確設定。
file { '/etc/profile.d/java.sh':
ensure => present,
source => "puppet:///modules/java/java.sh",
owner => "root",
group => "root",
mode => 644,
require => Package['oracle-java7-installer'],
}
要使用 puppet-java 來安裝 JDK,只要在 manifest 中加入:
class { 'java':
}