Munki では、pkginfo ファイルの情報を使用してソフトウェア アイテムを検索し、特定のアイテムをインストールする必要があるかどうかを判断します。機能する pkginfo アイテムを作成するには、ソフトウェア アイテムのリストを検査するために Munki で使用される方法を理解する必要があります。
方法
Munki では、以下の方法を優先順位に従って使用して、特定のアイテムをインストール(または削除)する必要があるかどうかを判断します。
- 検査用スクリプトを使用した macOS アプリケーションのインストール
- インストール アイテムを使用した macOS アプリケーションのインストール
- レシートを使用した macOS アプリケーションのインストール
これらの方法を組み合わせた場合は、優先順位が最も高い方法のみが使用されます。たとえば、特定の pkginfo アイテムに「インストール」リストと「レシート」リストの両方がある場合は、インストール状態を判断するためにレシートは無視されます。ただし、この場合でも、アイテムを削除するときにはレシートが使用される場合があります。レシートは、どのファイルがインストールされたかを Munki が正確に判断するのに役立ちます。
検査用スクリプトを使用した macOS アプリケーションのインストール
pkginfo アイテムには、[installcheck_script] をオプションで含めることができます。インストール検査用スクリプトを使用することで、[インストール/レシート] の指定が不適切であるか現実的でない場合に、ソフトウェア アイテムのインストールが必要かどうかを判断できます。
主要な例としては、ポート (MacPorts) を通じてインストールされることが多いコマンドライン ツールや、easy_install またはパイプを使用してインストールされる Python モジュールがあります。これらには、インストール済みのバージョンを特定する簡単な方法がありません。
installcheck_script は、アイテムが現在インストールされていないためにインストールする必要があることを、終了コード 0 で示すように作成されている必要があります。ゼロ以外のすべての終了コードは、アイテムがインストールされていることを示します。
argparse Python モジュールの現在のバージョンがインストールされているかどうかを検査する installcheck_script の例。
#!/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.plist、単純なディレクトリ、ファイルなどのアイテムをいくつでも含めることができます。アイテムの任意の組み合わせを使用して、アイテムがインストールされているかどうかを 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 は、CFBundleIdentifier が org.mozilla.firefox であるアプリケーションを探し、見つかった場合は、そのバージョン (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 未満である場合、そのアイテムはインストールされていないと見なされます。任意のファイルシステム アイテムのインストール アイテムを生成できますが、Munki がバージョンを特定できるのは、バージョン情報が含まれる Info.plist または version.plist が含まれるバンドルスタイル アイテムのみです。
その他のファイルシステム アイテムについては、Munki は非バンドル ディレクトリが存在するかどうかの判断、またはチェックサムの計算(ファイルの場合)のみを行うことができます。チェックサムのあるファイルの場合、ディスク上のファイルのチェックサムが pkginfo 内のチェックサムと一致しないと、テストは失敗して、そのアイテムはインストールされていないと見なされます。
<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 スタイル パッケージがインストールされるとき、レシートをマシン上に生成できます。メタパッケージは複数のレシートを生成します。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 コーデックのレシートがこのマシンで見つかりませんでした。レシートに関する状況を複雑にしている一般的な要因の 1 つに、多くのメタパッケージにおいて、サブパッケージのサブセットのみがインストール ロジックによってインストールされるということがあります。通常、レシート リストには、メタパッケージ内のすべてのサブパッケージのレシートが含まれています(Munki に対して、パッケージ レシートに基づくソフトウェア アイテムの削除が指示された場合に、この情報が必要になります)。しかし、一部のサブパッケージがインストールされないことが正常な予期される動作であっても、そのアイテムが現在インストールされていないと Munki によってマークされ、インストールする必要があると繰り返し表示されることになります。この問題の解決策の 1 つは、オプションでインストールされるレシートに対して、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>
この状況に対するもう 1 つの解決策は、パッケージによってインストールされたアイテムのリストを持つ installs 配列を指定することです。Munki は、レシートの代わりに installs 配列の情報を使用して、インストール状態を判断できます。