「使用 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 主要改變有:

  1. 改使用 apt module 來簡化 Ubuntu APT 套件庫管理。
  2. 在已經安裝 JDK 的情況下,避免不必要的修改動作以節省時間。

Pupppet-java 是個相對簡單的模組,主要只有一個 manifest 檔案,以及一個設定檔。 首先來看'manifests/init.pp’這個檔案:

.ruby}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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 是否已經存在,如果沒有則加入:

.ruby}
1
2
3
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’:'這個資源所描述。

.ruby}
1
2
3
4
5
6
7
# 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。

.ruby}
1
2
3
4
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 套件了。

.ruby}
1
2
3
4
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 這個環境變數有正確設定。

.ruby}
1
2
3
4
5
6
7
8
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 中加入:

.ruby}
1
2
class { 'java':
}