「 使用 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' 這個檔案 :

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':
 }