Munki 使用 pkginfo 檔案的資訊並尋找軟體項目,以決定指定項目是否必須安裝。若要建立可運作的 pkginfo 項目,請瞭解 Munki 用來檢查軟體項目清單的方法。

重要: 本節以下的大部分內容是來自 Munki 網站。

方法

根據優先順序,Munki 會使用下列方法來判定是否需要安裝 (或移除) 指定項目:

  1. 使用檢查指令碼來安裝 macOS 應用程式
  2. 使用安裝項目來安裝 macOS 應用程式
  3. 使用回條來安裝 macOS 應用程式

在組合使用這些方法時,只會使用最高優先順序的方法。例如,如果指定的 pkginfo 項目同時有「安裝」清單以及「回條」清單,判定安裝狀態時會忽略回條。即使在此情況下,回條功能可在移除項目時使用,因為這些資訊可協助 Munki 判斷已安裝的檔案。

使用檢查指令碼來安裝 macOS 應用程式

Pkginfo 項目可選擇性地包含 installcheck_script。安裝檢查指令碼可在所提供的安裝/回條不足或不實際時,判斷軟體項目是否需要安裝。

主要範例是通常透過連接埠 (MacPorts) 所安裝的指令列工具,或使用 easy_install 或 pip 安裝的 Python 模組,因為它們並未提供簡易方法來判斷其已安裝的版本。

安裝 check_script 應寫入結束代碼 0,表示該項目目前尚未安裝,所以須進行安裝。所有非零結束代碼均代表該項目已安裝。

在 Installcheck_script 的範例中,可見到一項檢查會判斷是否已安裝最新版的 argparse Python 模組。

#!/bin/sh# Grab current version of installed python moduleversion="$(python -c 'import argparse;print argparse.__version__' 2>/dev/null)"# Compare with the version we want to installif [ ${version:-0} < 1.2.1 ]; thenexit 0elseexit 1fi

也可選擇提供明確的uninstallcheck_script,以判定是否應移除軟體項目。在此情況下,結束代碼 0 的指令碼則代表該項目目前已安裝且應該移除。所有非零結束碼均代表該項目尚未安裝。

使用安裝項目來安裝 macOS 應用程式

安裝項目清單是由 VMware AirWatch Admin Assistant 生成,用於某些類型的安裝項目 (.dmg),但不適用於 Apple 套件 (.pkg 或 .mpkg)。您可以產生 (或修改) 此清單,這也是用來判定安裝狀態的最具彈性機制。

安裝清單可包含任何數量的項目,例如應用程式、偏好窗格、架構,或其他服務包式項目、info.plists、簡單目錄或檔案。您可以使用任意組合的項目,以協助 Munki 判定某個項目是否已安裝。

Firefox 6.0 自動產生「安裝」清單的範例

<key>installs</key><array><dict><key>CFBundleIdentifier</key><string>org.mozilla.firefox</string><key>CFBundleName</key><string>Firefox</string><key>CFBundleShortVersionString</key><string>6.0</string><key>minosversion</key><string>10.5</string><key>path</key><string>Applications/Firefox.app</string><key>type</key><string>application</string></dict></array>

若要判定 Firefox 6 是否已安裝,Munki 會檢查具有 org.mozilla.firefox 的 CFBundleIdentifier 的應用程式,如果有找到,會確認其版本 (CFBundleShortVersionString) 至少為 6.0。如果 Munki 找不到該應用程式,或其版本舊於 6.0,它會認為 Firefox 6.0 尚未安裝。安裝清單可包含多個項目。如果任何項目遺失,或具有較早版本,項目視為尚未安裝。您可以使用下列 pkginfo,手動產生要新增至安裝的清單項目:

        /Library/Application\ Support/AirWatch/Data/Munki/bin/makepkginfo -f /Library/Interne
        t\ Plug-Ins/Flash\ Player.plugin
      
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/Prope
        rtyList-1.0.dtd">
        <plist version="1.0">
        <dict>
        
          <key>installs</key>
          <array>
           <dict>  <key>CFBundleShortVersionString</key> <string>10.3.183.5</string> <key>path</key> <string>/Library/Internet Plug-Ins/Flash Player.plugin</string> <key>type</key> <string>bundle</string>  </dict> 
          </array>
        
        </dict>
        </plist>
      

複製並貼上整個安裝的索引鍵和值,或複製 dict 值並新增至 pkginfo 檔案內的現有安裝清單。Munki 會檢查 /Library/Internet Plug-Ins/Flash Player.plugin 是否存在,若有找到,則會檢查其版本。如果版本舊於 10.3.183.5,項目將會視為尚未安裝。您可以產生任何 filesystem 項目的安裝項目,但 Munki 只能對含有 Info.plist 或 version.plist 版本資訊的服務包式項目判斷版本。

對於其他 filesystem 項目,Munki 只能判斷非服務包目錄是否存在,或計算 checksum (適用於檔案)。對於具有 checksum 的檔案,如果磁碟上的檔案總和檢查碼不符合 pkginfo 中的 checksum,則測試會失敗 (因此項目將會被視為未安裝)。

        <key>installs</key>
        <array>
        
          <dict>
           <key>md5checksum</key> <string>087fe4805b63412ec3ed559b0cd9be71</string> <key>path</key> <string>/private/var/db/dslocal/nodes/MCX/computergroups/loginwindow.plist</s tring> <key>type</key> <string>file</string> 
          </dict>
        
        </array>
      

如果您希望 Munki 僅檢查檔案是否存在,並且忽略其內容,請從安裝項目資訊中移除所產生的 md5checksum 資訊。請確保所提供的路徑不變。

        <key>installs</key>
        <array>
        
          <dict>
          <key>path</key>
          <string>/private/var/db/dslocal/nodes/MCX/computergroups/loginwindow.plist
          </string>
          <key>type</key>
           <string>file</string> 
          </dict>
        
        </array>
      

使用回條來安裝 macOS 應用程式

在安裝 Apple 樣式套件時,您可以在機器上產生回條。Metapackage 會產生多個回條。VMware AirWatch Admin Assistant 會在套件 pkginfo 中的回條陣列中新增這些回條的名稱與版本。

以下是 Avid LE QuickTime 轉碼器版本 2.3.4 的回條陣列。

        <key>receipts</key>
        <array>
        
          <dict>
           <key>filename</key> <string>AvidCodecsLE.pkg</string> <key>installed_size</key> <integer>1188</integer> <key>name</key> <string>AvidCodecsLE</string> <key>packageid</key> <string>com.avid.avidcodecsle</string> <key>version</key> <string>2.3.4</string> 
          </dict>
        
        </array>
      

如果 Munki 使用回條陣列來決定安裝狀態,它會確認陣列中每個回條是否存在以及其版本。如果任何回條遺失,或版本編號舊於回條陣列所指定的版本,該項目會被視為未安裝。只有在每個回條存在,且所有版本都與 pkginfo 中的版本相同 (或更新) 的情況下,該項目才會被視為已安裝。若要疑難排解問題,使用 pkgutil 工具來檢查已安裝的回條。

        # pkgutil --pkg-info com.avid.avidcodecsle
        No receipt for 'com.avid.avidcodecsle' found at '/'.
      

在此情況下,Avid LE QuickTime 轉碼器的回條在此機器上找不到。回條常見的複雜狀況是,使用許多 metapackage 時,安裝邏輯會造成僅安裝了子套件的子集。一般而言,回條清單會包含 metapackage 中每個子套件的回條 (如果 Munki 被要求根據套件回條移除軟體項目,則會需要此資訊)。但如果未安裝每個子套件是正常且預期中的狀況,Munki 則會將項目標記為目前未安裝,並重複提議安裝。此問題的其中一個解決方案是,將具有 True 值的選用金鑰新增至選擇性安裝的回條。Munki 在判斷安裝狀態時不會考量這些回條。

        <key>receipts</key>
        <array>
        
          <dict>
           <key>filename</key> <string>mandatory.pkg</string> <key>installed_size</key> <integer>1188</integer> <key>name</key> <string>Mandatory</string> <key>packageid</key> <string>com.foo.mandatory</string> <key>version</key> <string>1.0</string> 
          </dict>
          <dict>
           <key>filename</key> <string>optional.pkg</string> <key>installed_size</key> <integer>1188</integer> <key>name</key> <string>Optional</string> <key>optional</key> <true/> <key>packageid</key> <string>com.foo.optional</string> <key>version</key> <string>1.0</string> 
          </dict>
        
        </array>
      

這種情況的另一個解決方案,就是提供列有套件安裝項目的安裝陣列。如此 Munki 在判定安裝狀態時,就可以使用安裝陣列資訊而不需回條。