Skip to content

DevOps 實驗室: Ubuntu 系統上安裝 Oracle JDK 7

Published: 8 分鐘

「使用 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':
 }
郭信義 (Sam Kuo)

奔騰網路科技技術長,專長分散式系統、Web 應用與雲端服務架構、設計、開發、部署與維運。工作之餘,喜歡關注自由軟體的發展與應用,偶爾寫一下部落格文章。

你可能會有興趣的文章