在 「使用 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’這個檔案:
.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}