在 Ubuntu 系統上 , 使用 Deb 套件安裝 Oracle JDK” 這篇文章中 , 山姆鍋分享如何手動安裝 Oracle JDK。 雖然比每次都要從 Oracle 官網下載方便許多 , 但如果能夠加以自動化 , 自然是更加符合敏捷與精實的精神 。 本文山姆鍋就提供 Puppet 的腳本 , 讓未來有需要的話可以加快在不同機器上安裝的動作 。

準備工作

本文假設您的 Ubuntu 系統為 Ubuntu 12.04 LTS x86_64, 且已經安裝 Puppet 以及必要套件 。 您也可以像山姆鍋一樣 , 使用 Vagrant+VirtualBox 來進行實驗 。

建立 Puppet 模組

建立一個 Puppet 模組 , 名稱為 'oracle_jdk', 最終此模組的結構會成為 :

-- oracle_jdk/manifests/init.pp

-- oracle_jdk/files/java.sh

init.pp 檔案內容

class oracle_jdk::oracle_jdk($version='present') {
  exec { 'apt_update':
    command => 'apt-get update',
    path => '/usr/bin'
  }

  package { "python-software-properties": 
    ensure => present,
    require => Exec['apt_update'],
  }

  exec { "add-apt-repository-oracle":
    command => "/usr/bin/add-apt-repository -y ppa:webupd8team/java",
    notify => Exec['apt_update2'],
  }

  exec { 'apt_update2':
    command => 'apt-get update',
    path => '/usr/bin'
  }
  exec {
    'set-licence-selected':
      command => '/bin/echo debconf shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections';

    'set-licence-seen':
      command => '/bin/echo debconf shared/accepted-oracle-license-v1-1 seen true | /usr/bin/debconf-set-selections';
  }

  package { 'oracle-java7-installer':
    ensure => "${version}",
    require => [Exec['add-apt-repository-oracle']],
  }

  file { '/etc/profile.d/java.sh':
    ensure => present,
    source => "puppet:///modules/oracle_jdk/java.sh",
    owner => "root",
    group => "root",
    mode => 644,
    require => Package['oracle-java7-installer'],
  }

}

在 Vargrant 提供的虛擬機中 , 第一次的 'apt_update' 如果沒有執行 ,'python-software-properties' 套件就無法正確安裝 。'apt_update2' 是在安裝 PPA 套件來源後更新列表 , 讓後續的 'oracle-java7-installer' 可以安裝成功 。 其中最讓人不理解的是 'set-licence-selected' 跟 'set-licence-seen' 可以消除 Oracle JDK 安裝過程需要人確認的動作 , 我想這跟 APT/Deb 套件工具的運作有關 , 目前就當作是黑箱作業 。

java.sh 檔案內容

export JAVA_HOME=/usr/lib/jvm/java-7-oracle

這個檔案的目的是要設定系統環境變數 'JAVA_HOME', 由於有些工具會使用這個變數來找到 Java 安裝的路徑 , 保險起見加入這個檔案 。

引用 oracle_jdk 模組

在您的 Puppet 組態檔案中 , 例如 :'/etc/puppet/manifests/site.pp', 加入下列片段 :

class { 'oracle_jdk::oracle_jdk': version => '7u40-0~webupd8~0', }

其中 ,'7u40-0~webupd8~0' 可以換成您指定的版本 。 如果要安裝最新版本 , 則使用 :

class { 'oracle_jdk::oracle_jdk':  }

參考來源

  1. Puppet: Installing Oracle Java

小結

在開發 、 測試或部署的環境 , 套件都會使用特定的版本以確保整個環境組態盡可能相同 。 另位請注意 : 本文提供的腳本還有不少改進的空間 , 請自行斟酌使用 。