【Jamf】DEPNotifyを使ってゼロタッチデプロイメントっぽいことしてみる。


# はじめに
~~初カキコ…ども…~~ 
Jamf Proを使うとゼロタッチキッティングができるよ！みたいな話を真に受けると沼にハマることも多いかと思います。
べつにDEPNotifyを使うと実現できるようになるわけではないですが、使うと**なんとなくかっこいい**ので実装してみました。
個人的にはJamf Connectと一緒に使うと**めちゃくちゃかっこいい。**
Jamf Connectもとても面白いのですが、長くなりそうなのでまた別の機会にします。

**あ、Jamf Proユーザー向けの記事になりますのであしからず。**


**※2019/10/21 追記**
と思ったら、Jamf Connectに関する良記事を見つけました。
リンクを貼っておくので参考にしてください。
[Jamf Connect を使って Mac に AzureAD アカウントでログインしてみた](https://blog.cloudnative.co.jp/1395/)
(株式会社クラウドネイティブさんのブログです。)

**※2020/03/23 追記**
Jamf Connectに関する記事書きましたので興味がある方はご参照ください！
[【Jamf】Jamf Connectを使ってMicrosoftアカウントでMacにログインしてみる【Azure】](https://qiita.com/soh19/items/02d492ba6a7e2f63dabc)

#動画
先んじてJamf ConnectとDEPNotifyを組み合わせた場合のデプロイ動画を貼っておきます。
個人情報とか会社情報とかをiMovieで無理やりごまかしているのであまり美しくはないです・・・
ちなみにJamf ConnectはOneLoginと連携させました。
キッティングの流れとしては、
初期設定画面
→Jamf Connectログイン画面(OneLogin認証画面)
→DEPNotifyの画面
→デスクトップ画面
となっています。
![test3-compressor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268331/ce2f7f3c-2da9-48a6-4a02-45c6e87e4aca.gif)

# DEPNotifyとは
>DEPNotifyはネイティブのmacOSウィンドウとして実行され、テキストファイルを介して簡単に制御できます。求められた場合、Jamfによって行われたすべてのポリシーとインストールが自動的に表示されます。
DEPNotifyでウィンドウの画像、テキスト、進行状況バーを変更するのも非常に簡単です。 DEPNotifyでユーザー通知を表示し、ウィンドウを前面に表示することもできます。
DEPNotifyは、テキストファイルに「コマンド」を1行ずつ書き込むことで完全に制御されます。これにより、DEPNotifyが何時に表示するかを正確に管理できます。

↑Jamf Marketplaceより引用したものをGoogle翻訳しただけです。
[https://marketplace.jamf.com/details/depnotify/](https://marketplace.jamf.com/details/depnotify/)

要するに、**デプロイ中にインストールしているものの進捗状況を表示してくれるツール**です。
フルウィンドウ表示を強制して他の操作をできないようにできるので、ユーザーさんに「デプロイ終わるまでちょっと待っててね」ができます。

# 必要なもの
- Jamf Pro環境
- DEPで購入したMac
- インストールさせたいアプリなどのインストーラーパッケージ

とか

実はDEPじゃなくても使えます。が、今回はDEP前提で記載します。

# 利用環境
- Jamf Pro v10.15
- macOS 10.14.6

過去にmacOS10.13.6でも試してます。一応。

# 準備
さて、ここから準備にはいります。
配布アプリケーションの準備から記述しているので、[DEPNotifyの準備](#depnotifyの準備)まで飛ばしてしまっても構いません。

## インストールさせたいものの準備
とりあえず今回は、

- Slack(チャットアプリ)
- Google Chrome(Webブラウザ)
- Zoom(Web会議アプリ)

あたりでも入れておきます。

###Slackの準備
SlackはApp Storeでも公開されているためVPP(Volume Purchace Program)[^1]を利用して配布してしまってもOKだと思いますが、VPPを利用したアプリの配布はDEPNotifyを使って制御できないので今回はWebからダウンロードしたインストーラーを使います。

Jamf Proのパッケージ配信はpkg形式かComposer[^2]を利用したdmg形式にのみに対応しています。
そのためSlackやGoogle Chromeなどドラック&ドロップでアプリケーションフォルダにつっこむタイプのアプリケーションはComposerなどを利用してpkgにしてあげる必要があります。

[^1]: Appleが提供している企業などでアプリケーションを一括購入できるプログラム。これを利用するとApple IDを使わずにアプリケーションの配布などが行える。

[^2]: Jamfが提供しているパッケージファイルを作成するツール

1. Slack.appを取ってくる
[ここ](https://slack.com/intl/ja-jp/downloads/mac)からSlackなんちゃら.dmgを取ってきます。

2. Composer.appを起動してつっこむ
ComposerはJamf Proユーザーであれば[Jamf Nation](https://www.jamf.com/jamf-nation/)のユーザー画面のMy Assetsよりダウンロードできます。
Composerを起動するとどのSnapshotでパッケージを作るか聞かれますが、クリーンなアプリケーションのインストールごときでSnapshotを使うと時間が勿体無いので"Cancel"します。
<img width="1040" alt="スクリーンショット 2019-10-16 12.07.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268331/09f29993-7408-a30c-3f9b-ee1794e8d42a.png">
実はこのComposer、Snapshotを利用しなくてもドラック&ドロップでもパッケージが作れます。
配置先のディレクトリ情報も拾ってくれるため、一度、Slack.appをアプリケーションフォルダに入れてからそのSlack.appをドラック&ドロップでComposerの"SOURCES"につっこみます。
アクセス権が作成したユーザーになってしまっているかと思うので、右下のところで 

|  |R  |W  |X  |
|---|---|---|---|
|root|V  |V  |V  |
|admin(80)|V  |  |V  |
|everyone|V  |  |V  |
　 と修正します。
<img width="1040" alt="スクリーンショット 2019-10-16 18.56.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268331/895a93a0-ef97-aeed-d177-55d0c8bcb6a3.png">
3. pkgのビルド
"Build as PKG"を選択してインストーラーパッケージをビルドします。
今後の運用を考え、パッケージ名にSlackのバージョンを追記しておくといいと思います。


### Google Chromeの準備
さて、次にGoogle Chromeの準備です。
Slackの準備で行なっている方法だとアップデート毎にいちいちパッケージを作り直さなければいけないので~~めんどくs(ry~~手間がかかります。
常に最新版で問題なければスクリプトでWebから直接インストールさせちゃってもいいかもしれません。

```shell:GoogleChrome_download.sh
#!/bin/sh

#Google Chromeを/tmpにダウンロード
curl https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg -o /tmp/googlechrome.dmg

#dmgをマウントする
hdiutil attach -nobrowse /tmp/googlechrome.dmg 

#GoogleChrome.appをアプリケーションフォルダにコピー
cp -r /Volumes/Google\ Chrome/*.app /Applications/

#dmgをアンマウント
hdiutil detach /Volumes/Google\ Chrome/

#インストーラーの削除
rm -r /tmp/googlechrome.dmg
```

### Zoomの準備
[ここ](https://zoom.us/download)からダウンロードします。
Zoomはpkg形式で提供されているので特にすることはありません。

##DEPNotifyの準備
配布したいものの準備ができたらDEPNotifyの設定にはいります。
DEPNotifyに関するリソースは
[GitHub：DEPNotify-Starter](https://github.com/jamf/DEPNotify-Starter)
[GitLab：DEPNotify](https://gitlab.com/Mactroll/DEPNotify)
にあります。

主に利用するものは、

- DEPNotifyのインストーラー
- DEPNotifyの設定をカスタマイズするシェルスクリプトファイル

となります。

### DEPNotifyのインストーラーを入手
[ここ](https://gitlab.com/Mactroll/DEPNotify/-/tags)から最新版のDEPNotifyインストーラをダウンロードします。[ここをクリック](https://files.nomad.menu/DEPNotify.pkg)でpkgが直接ダウンロードできます。

### DEPNotifyのカスタマイズ
GitHubからリソースをダウンロードし、**"depNotify.sh"**をカスタマイズしていきます。
ダウンロードしたDEPNotify-Starter-masterの中に"depNotify.sh"があるのでJamf上にアップロードしてから編集してもエディタで編集してからアップしても構いません。お好みで。
全部の設定を解説していると~~しんどい~~長くなってしまうのでかいつまんで記載します。

### テストモードのON/OFF
デフォルトだと42行目のところでテストモードが有効になっています。
テストモードだと、途中でDEPNotifyを終了できたりします。
変更する場合は、```TESTING_MODE=true```の```TESTING_MODE=false```に変更します。
今回は"false"にしました。

### フルスクリーンにするかどうか
デフォルトだと48行目のところでフルスクリーンが有効になっています。
フルスクリーンを有効にしていると、デプロイ中にユーザーが何もできない状態となります。
変更する場合は```FULLSCREEN=true```を```FULLSCREEN=false```に変更します。
今回は"true"のままにしました。

### 各種表示項目の設定
53行目あたりからデプロイ中に表示する項目の設定になります。
英語表記が気になったので一応日本語に変更しています。
下記でデプロイ中に表示する画像のパスを指定しますが、こちらはDEPNotifyのインストールと同タイミングで存在している必要があるため、別途Composerで```/tmp```などに配置したものをpkgにしておきます。(やり方は[Slackの準備](https://qiita.com/drafts/b28537a71e46038934a8#slackの準備)と下記スクリーンショットを参照してください。)
<img width="1040" alt="スクリーンショット 2019-10-16 18.54.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268331/a4e523c0-b331-c0eb-72bf-1c67e810d3c5.png">

**BANNER_IMAGE_PATH**：デプロイ中に表示する画像のパスを指定します
**BANNER_TITLE**：画像の下にそこそこ大きめで表示されるタイトルです
**MAIN_TEXT**：メインで表示される文章です。
**INITAL_START_STATUS**:デプロイ進捗バーの最初に表示されるコメントです。
**INSTALL_COMPLETE_TEXT**:デプロイ完了時に進捗バーに表示されるコメントです。
**FV_COMPLETE_MAIN_TEXT**:FileVault2ディスク暗号化を構成プロファイル等で設定している場合、暗号化のためにログアウトを促すメッセージを設定できます。
**FV_COMPLETE_BUTTON_TEXT**:ログアウトするボタンに表示するコメントです。
**COMPLETE_MAIN_TEXT**:デプロイ終了後に表示するコメントです。
**COMPLETE_BUTTON_TEXT**:終了ボタンに表示するコメントです。

```shell:表示項目設定例

###53行目らへん

# Banner image can be 600px wide by 100px high. Images will be scaled to fit
# If this variable is left blank, the generic image will appear. If using custom Self
# Service branding, please see the Customized Self Service Branding area below
  BANNER_IMAGE_PATH="/private/tmp/Unknown.png"

# Main heading that will be displayed under the image
# If this variable is left blank, the generic banner will appear
  BANNER_TITLE="ようこそ〇〇へ！"

# Paragraph text that will display under the main heading. For a new line, use \n
# If this variable is left blank, the generic message will appear. Leave single
# quotes below as double quotes will break the new lines.
  MAIN_TEXT='新しいMacを使い始める前に、いくつかのアプリケーションのインストールと設定を行います。 \n \n このプロセスが完了するまでに5~10分かかることがあります。'

# Initial Start Status text that shows as things are firing up
  INITAL_START_STATUS="初期設定を開始しています..."

# Text that will display in the progress bar
  INSTALL_COMPLETE_TEXT="設定が完了しました！"

###75行目らへん

  # Options if not using dropdown alert box
    FV_COMPLETE_MAIN_TEXT='ディスクの暗号化プロセスを開始するために、Macをログアウトする必要があります。 \n \n ログアウト時にパスワードの入力を求められるので、入力して[OK]または[Continue]を数回クリックします。 \n \n 暗号化が行われている間、Macは使用可能です。'
    FV_COMPLETE_BUTTON_TEXT="ログアウト"

  # Options if not using dropdown alert box
    COMPLETE_MAIN_TEXT='Macの初期設定と構成が完了しました。'
    COMPLETE_BUTTON_TEXT="さぁはじめよう！"
```

###インストールするポリシーのトリガーを指定する
138行目のところでJamf Pro側に設定しているカスタムトリガーを記述します。
**ここに設定するカスタムトリガーをJamf Proから配布するポリシーのカスタムトリガーと紐づけることがキモになりますのでお間違いなく！**
```"インストール中に表示するテキスト,カスタムトリガー名"```という形で記述します。

```shell:POLICY_ARRAY

POLICY_ARRAY=(
    "Slackをインストールしています...,slack"
    "Google Chromeをインストールしています...,chrome"
    "Zoomをインストールしています...,zoom"
  )
```

# Jamf Proへの実装作業
それではここまでに各種素材をJamf Proにアップロードしていきます。
パッケージやスクリプトのアップロード方法はJump Startトレーニング内でやっているかと思うので割愛します。

## アップロードするもの
- DEPNotify.pkg ([DEPNotifyの準備](#depnotifyの準備)でWebからダウンロードしたもの)
- depNotify.sh ([DEPNotifyの準備](#depnotifyの準備)で作成したもの)
- DEPNotifyIcon.pkg ([DEPNotifyの準備](#depnotifyの準備)で作成したもの)
- Slack_4.1.pkg ([Slackの準備](#slackの準備)で作成したもの)
- GoogleChrome_download.sh ([GoogleChromeの準備](#google-chromeの準備)で作成したもの)
- Zoom.pkg ([Zoomの準備](#zoomの準備)でWebからダウンロードしたもの)

## Jamf Pro側の設定
### DEPNotify用 ポリシー設定
DEPNotifyそのもののポリシーを設定します。
私は下記のような感じで設定しました。

**`General`**
ポリシー表示名：000 DEPNotify
トリガー：登録完了
実行頻度：Ongoing
**`パッケージ`**
DEPNotify1.1.5.pkg
アクション：Install
DEPNotifyIcon.pkg
アクション：Install
**`スクリプト`**
depNotify.sh
**`Scope`**
PreStage EnrollmentsをCriteriaにしたSmart Computer Group
**※)Enrollment Method: PreStage enrollment is 〇〇みたいな感じでCriteriaを設定したグループを事前に作っておいてください。**

以上が、DEPNotifyの仕込みとなります。

### 各種インストール用 ポリシー設定
DEPNotifyのインストールとは別に、各種インストーラーのポリシーを設定していきます。
トリガーに[DEPNotifyのカスタマイズ](#depnotifyのカスタマイズ)で設定したカスタムトリガーを使用します。

1. Slack
**`General`**
ポリシー表示名：001 Slack Install
トリガー：カスタム `slack`
実行頻度：Ongoing
**`パッケージ`**
Slack_4.1.pkg
**`Scope`**
PreStage EnrollmentsをCriteriaにしたSmart Computer Group

2. GoogleChrome
**`General`**
ポリシー表示名：002 GoogleChrome Install
トリガー：カスタム `chrome`
実行頻度：Ongoing
**`スクリプト`**
GoogleChrome_download.sh
**`Scope`**
PreStage EnrollmentsをCriteriaにしたSmart Computer Group

3. Zoom
**`General`**
ポリシー表示名：003 Zoom Install
トリガー：カスタム `zoom`
実行頻度：Ongoing
**`パッケージ`**
Zoom.pkg
**`Scope`**
PreStage EnrollmentsをCriteriaにしたSmart Computer Group

以上でインストーラー周りの設定は終了です。

###おまけ：FileVault2ディスク暗号化をONにする場合
構成プロファイルで暗号化をONにする設定を仕込ませておくことで、デプロイ中に暗号化に必要なログアウトプロセスを促すことができます。
利用する場合は一緒に設定しておくと良いでしょう。
当然、ちゃんとJamf Pro側にリカバリーキーを収集しておくことも可能です。
(キャンセルで回避できちゃいますが、次回ログアウト時に再度表示されます。)


# いざMacをデプロイ！！！
![test7-compressor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268331/9ab58d46-cfc3-fbf9-d946-de07310a7cb8.gif)
画面のの流れとしては、
初期設定画面
→ログイン画面
(Jamf ProのPrestageEnrollmentsの設定で"admin"というアカウントを自動作成しています)
→デスクトップ画面
→DEPNotifyの画面
→FileVault2ディスク暗号化画面
→ログイン画面
→デスクトップ画面
となっています。

[動画のところ](#動画)で紹介したものとは違い、**一瞬デスクトップが表示されてしまう**のが懸念点ですね・・・
プロセスのラグなのか即時表示はなかなかうまくいかず・・・
あ、デプロイ中に表示している画像はみんな大好き[いらすとや](https://www.irasutoya.com)様から拝借いたしました。

#おわりに
DEPでのキッティングにDEPNotifyは必ずしも必要なわけではありませんが、インストールなどバックグラウンドで行われているプロセスを可視化するというのは、俗にいうユーザー体験に繋がるのではないでしょうか。

確かに入社してMacを渡された時に、ようこそ！みたいなのが表示されたらちょっと嬉しいかもなぁとか思ったり思わなかったり。

ちょっとしたことですが、少しでも楽しく仕事できたらいいなぁと思うので是非試してみてください！！！

おわり。