こんにちはeureka, inc.の情報システム部エンジニアIkepyonです。
今回は、弊社でのJamf Proの具体的な活用方法について紹介していきたいと思います。
まずはじめに
昨年末に弊社はJamf ProというMDM(Mobile Device Management)を導入しました。
詳細はこちら:ぼっち情シスがJamf Proを導入してみた件 — Eureka Engineering — Medium
Jamf Proにはゼロタッチデプロイメントという素敵な機能があるものの、弊社はまだその機能を、全てのPCに使用できることはできない状態なので、User-Initiated Enrollment(ユーザーが自分でJamf Proへの登録を行わなければならない方法)という機能を活用して行こうという方針にしました
なお、現在は私を含め2名で運用改善などを行なっております。
Goal
キッティングにおける作業工数を可能な限り削減する
今まで手動で行なってきたキッティング作業を出来るだけ自動化し、それ以外の業務に時間を避けるようにすることがGoalです。
Before
まず、Jamf Pro導入前のキッティングの内容を確認しましょう。
- PCの初期設定(ユーザ名やパスワード設定など)
- 入社用マニュアルのwebページを開く
- システム環境設定の設定変更
・セキュリティとプライバシー
・FileVaultの強制化
・デフォルトブラウザを”google Chrome”に変更
・プリンタ設定❶
・プリンタ設定❷
・省エネルギー
・wifi❶
・wifi❷
・wifi❸
・コンピュータ名の変更 - 1passwordのインストールと設定
- Slackのインストールと設定
- Google Chromeのインストールと設定
- Cylanceのインストールと設定
上記内容を入社用のマニュアルを見ながら新入社員が自分で行うスタイルでした。
入社前まではWindowsユーザだった方もいらっしゃることもあり、各種ツールの設定(パスワード決めたりなど)などを含めると1日かかってしまうことが大きな課題であり、設定がうまくいかないこともあるため、サポートとしてチーム内の誰かのリソースも使うことがしばしばありました。
After
さてここから本題になります。実際のJamf Proの運用方法を解説していきたいと思います。
PCの初期設定(ユーザ名やパスワード設定など)
まずはPCの初期設定なのですが、User-Initiated Enrollmentでは今まで通り手動になります。
ちなみにPre-Stage Enrollmentを使用するとこんな感じに初期設定もほぼほぼスキップすることができます。
Jamf Proへのenroll作業
次にJamf Proへの登録を行なっていきます。
https://jss.mycompany.com:8443/enroll
こちらがUser-Initiated Enrollmentを使用してJamf Proに登録する方法になります。ここからJamf ProのProfileをまずはインストールしていきます。
弊社の場合は、enrollしProfileがインストールされJamfの管理下になったら、下記の条件のグループ(New Enrollment Mojaveと名付けました)にのみ、自動的にそれ以降の動作を行う様に設定し、既存のユーザには影響が出ないようにしました。
※既存のユーザーには既にこれから説明する設定は行われているため
ここまでが手動で行う工数になります。
以降は自動的にJamf Proが色々なことをしてくれます。
その後の動作ですが、Jamf Proでは下記のふたつの方法で管理下のMacを制御などすることになります。
・Configuration Profile = 実行すると対象にすぐ反映されるもので、PCの設定などを制御することがメインになります。
・Policy = 反映に時間はかかるもののスクリプトの実行やソフトウェア配布など様々なことが行えます。
enrollが完了した瞬間、Configuration Profileを利用した下記の内容がまず、New Enrollment Mojaveのグループへ反映されることになります。
・セキュリティとプライバシー
・wifi❶
・wifi❷
・wifi❸
・リカバリーキーの収集
例として、wifiの設定画面がこんな感じです。
scopeのところにはNew Enrollment Mojaveのグループを指定しています。
Execute Policy Chain Using Triggers
次に、Policyの実行される順番を決めるためのPolicyを実行する様設定されています(ややこしい)。
スクリプトはこんな感じ。
#!/bin/bashtriggers=($4)while read ID; do
/usr/local/bin/jamf policy -event "$ID"
done < <(printf '%s\n' "${triggers[@]}")
例としてCylanceのPolicyをだしますが、CylanceのPolicyは上のスクリプトに則って、下のParameter Valuesの”cylance”の順番が来た際に走ることになります。
CylanceのPolicy側はこんな感じにTriggerの設定がされています。
こうすることによって、順番よくPolicyを走らせることができエラーが起こることを防いでいます。
この様にして、
- プリンターのドライバーをインストールする
- プリンター設定❶
- プリンター設定❷
- 1Passwordをインストール
- Slackをインストール
- Google Chromeをインストール
- Slack,Google ChromeをDockに挿入
- デフォルトブラウザをGoogle Chromeに設定
- Cylanceをインストール
- FileVaultを強制化するPolicyを配布
- コンピュータ名を変更するスクリプトの実行
- 強制ログアウトさせるスクリプトの実行(FileVaultの強制化を実行するため)
を順番に実行させていきます。
また、先にリカバリーキー収集のConfigurationを設定しているため、FileVaultが設定された時点で、リカバリーキーの収集も行われます。
コンピュータ名変更
また、再ログインの際には、コンピュータ名を変更するスクリプトが走る様に設計しています。
スクリプトは下記になります。
#!/usr/bin/python
‘’’
Rename computer from remote CSV using Jamf binaryPass in the URL to your remote CSV file using script parameter 4The remote CSV could live on a web server you control, OR be a Google Sheet
specified in the following format:https://docs.google.com/spreadsheets/u/0/d/<document ID>/export?format=csv&id=<document ID>&gid=0
‘’’import os
import sys
import urllib2
import subprocessCSV_PATH = ‘/var/tmp/computernames.csv’def download_csv(url):
‘’’Downloads a remote CSV file to CSV_PATH’’’
try:
# open the url
csv = urllib2.urlopen(url)
# ensure the local path exists
directory = os.path.dirname(CSV_PATH)
if not os.path.exists(directory):
os.makedirs(directory)
# write the csv data to the local file
with open(CSV_PATH, ‘w+’) as local_file:
local_file.write(csv.read())
# return path to local csv file to pass along
return CSV_PATH
except (urllib2.HTTPError, urllib2.URLError):
print ‘ERROR: Unable to open URL’, url
return False
except (IOError, OSError):
print ‘ERROR: Unable to write file at’, CSV_PATH
return Falsedef rename_computer(path):
‘’’Renames a computer using the Jamf binary and local CSV at <path>’’’
cmd = [‘/usr/local/bin/jamf’, ‘setComputerName’, ‘-fromFile’, path]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, _ = proc.communicate()
if proc.returncode == 0:
# on success the jamf binary reports ‘Set Computer Name to XXX’
# so we split the phrase and return the last element
return out.split(‘ ‘)[-1]
else:
return Falsedef main():
‘’’Main’’’
try:
csv_url = sys.argv[4]
except ValueError:
print ‘ERROR: You must provide the URL of a remote CSV file.’
sys.exit(1)
computernames = download_csv(csv_url)
if computernames:
rename = rename_computer(computernames)
if rename:
print ‘SUCCESS: Set computer name to’, rename
else:
print (‘ERROR: Unable to set computer name. Is this device in the ‘
‘remote CSV file?’)
sys.exit(1)
else:
print ‘ERROR: Unable to set computer name without local CSV file.’
sys.exit(1)if __name__ == ‘__main__’:
main()
SpreadSheet側はこんな感じになっており、シリアルナンバーをもとにコンピュータ名をキャッチアップして来てくれます。
なお、コンピュータ名は、
「PC資産管理番号-firstname.lastname」
という命名規則になっており、割当時にこのシートに対象の社員名を入力しておくことによってenroll後、自動的にその名前へと変更されることになります。
Welcome to eurekaへのリンク表示
最後に、入社用マニュアル(通称:Welcome to eureka)を大幅に簡略化したもの(通称:新Welcome to eureka)の個人用のリンクへ飛べる様にポップアップを表示させるPolicyを走らせる様に設定してます。
スクリプトはこんな感じです。
#!/bin/shJHELPER="/Library/Application Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper"LOGGED_IN_USER=$(/usr/bin/stat -f%Su /dev/console)
LOGGED_IN_UID=$(id -u "$LOGGED_IN_USER")
ICON="/Library/Application Support/JAMF/bin/icon.png"
TITLE="Welcome to Eureka!"
HEADING="Hello $3!"
DESCRIPTION="Please click the link below to check out your welcome page."
BUTTON="Your Page"WELCOME=$("$JHELPER" -windowType hud -title "$TITLE" -heading "$HEADING" -icon "$ICON" -alignDescription natural -description "$DESCRIPTION" -button1 "$BUTTON")if [ "$WELCOME" == "0" ]; then
/bin/launchctl asuser "$LOGGED_IN_UID" sudo -iu "$LOGGED_IN_USER" open https://wiki.eure.jp/display/soumu/Welcome+to+eureka+-+$3
echo "optout"
exit 0
else
echo "user chose No"
exit 1
fi
そうするとこんな感じになります。
これによって新入社員がわざわざURLを手入力せずにマニュアルを開くことが可能になりました。
まとめ
結果として、Jamf Proを導入したおかげで8割程度の作業工数を削減することができました。
2年〜3年後には、序盤で少し触れたPre-Stage Enrollmentが利用できるので、より自動的なキッティングが実現できるようになる見通しです。
現在の課題点としては、新しいMacを購入した際にはコンピュータ名を変更するためのSpreadsheetにシリアルナンバーを手入力で追加しなければならない点です。
こちらに関しては、少なくともenroll後のPolicyが走る順番を調整することによってJamf Proの管理コンソール上からコピペできる状態にはできるはずなので、これから改善しより工数の少ない状態を実現できそうです。