Más contenido relacionado La actualidad más candente (20) Similar a Power shell の基本操作と処理の自動化 v2_20120514 (20) Power shell の基本操作と処理の自動化 v2_201205141. 1
IT Pro のためのスクリプト講座
Windows PowerShell を使おう!
日本マイクロソフト株式会社
エバンジェリスト
安納 順一 Junichi Anno
http://blogs.technet.com/junichia/
Facebook: junichi anno
~ 基礎からサーバー管理の自動化まで
V2.0
2012.5.12 Fukuoka 版
5. 5
DevOps(=Development and Operations)
開発サイドと運用サイドの協調により、
Development ~ Delivery 全体のアジリティを高めるためのプロセス
Developer Operator
DevOps
(参考)
・Velocity 2009 : “10+ Deploys Per Day: Dev and Ops Cooperation at Flickr” by John Allspaw
・DevOps って何? by 宮下 さん http://www.slideshare.net/mizzy/devops-4156440
協調文化を確立し
”IT”によりビジネスを進化させる
ビジネスに合わせた
アプリケーションの
進化
ビジネスに合わせた
インフラの進化
6. 6
マイクロソフトの DevOps シナリオ
開発担当 運用担当
• Visual Studio 2011
• IntelliTrace Agent
• System Center 2012
• ConfigMgr 構成パック
• OpsMgr 管理パック
• OpsMgr AVICode
• Orchestrator(Opalis)
• SM インシデント管理
• VMM Portal など
• Windows PowerShell
• SQL Server bacpac
・
・
7. 7
DevOps における PowerShell の位置づけ
• 目的ベースのコマンドレット(CmdLet)
• アプリケーションに対する処理の正確性
• ビジネスにとっての高速性
• 自動化
• オペレーション品質
• ビジネスに合わせた拡張性
Exchange Server
メールボックス作成
GALの一覧取得
API
New-Mailbox
目的 コマンドレット
Get-GlobalAddressList
10. 10
マイクロソフト製品と PowerShell の関係
• 製品ごとに専用の”コマンドレット”が用意されている
• 多くの管理 GUI は裏でコマンドレットを呼んでいる
• インフラ担当者に、各製品への”標準化されたアクセス方法”を提供する
Active Directory
Active Directory
PowerShell コマンドレット
Active Directory
管理センター
Hyper-V
VMM
PowerShell コマンドレット
System Center
Virtual Machine Manager
PowerShell
コンソール
11. 11
Windows Management Framework
PowerShell が Management Hub となる
IT Pro
IT
Developer
Solution
Developer
Storage Exchange DevicesDisk YOUR ELEMENTS
Windows PowerShell
CIMOM、SMI-S
標準化されたアクセス
標準化されたプロトコル
標準化されたモデル
WS-Man(Web Service for Management) 他のプラッ
トフォーム
Service
Provider
開
発
NanoWBEM
Pegasus
12. 12
代表的なスクリプト言語
バッチファイル(拡張子 .bat)
VBScript(拡張子 .vbs)
PowerShell(拡張子 .ps1)
Jscript(拡張子 .js)
MS-DOS時代から使われてきたコマンドシェル上のスクリプト。脈々と現代に引き継がれて
おり、利用者が多い。豊富なコマンド群によって支えられており、案外使い出がある。複数
のスクリプトを取りまとめる役割としても便利。
Visual Basic のスクリプト版。「Visual」とあるが、Visual ではない。わかりやすい文法と、
緩い規則によって根強いファンが多い。亜種として VBA もあるが微妙に文法は異なる。
JavaScript のMS 実装版として、VBScript とともに登場。JavaScript を Microsoft の独自
仕様によって拡張することで、汎用性を増している。
いわずと知れた高機能スクリプト言語。.NET Framework が使えると言うメ
リットから、利用者は爆発的に増殖中。多くの製品がPowerShell用のコマンド
レットを提供しはじめており、Windows Script Host の存在を脅かしつつある。
Windows
Script
今後エンハンスの予定は無い
OSに合わせて継続的なエンハンス
今後エンハンスの予定は無い
(余談)HTML5 によって新 JavaScript エンジンに
脚光が!ただしWindows Scriptとは別物
15. 15
VBScript vs PowerShell
Exchange 2003 (VBScript) Exchange 2007(PowerShell)
メール
ボックス
統計
Set listExchange_Mailboxs =
GetObject("winmgmts:{impersonationLevel=impersonate}!COMPUTERNAMEROOTMicrosoftExchangeV2").InstancesOf("Excha
nge_Mailbox")
For Each objExchange_Mailbox in listExchange_Mailboxs
WScript.echo "AssocContentCount =” + objExchange_Mailbox.AssocContentCount
WScript.echo " DateDiscoveredAbsentInDS =” + objExchange_Mailbox.DateDiscoveredAbsentInDS
WScript.echo " DeletedMessageSizeExtended =" + objExchange_Mailbox.DeletedMessageSizeExtended
WScript.echo " LastLoggedOnUserAccount =" + objExchange_Mailbox.LastLoggedOnUserAccount
WScript.echo " LastLogoffTime =" + objExchange_Mailbox.LastLogoffTime
WScript.echo " LastLogonTime =" + objExchange_Mailbox.LastLogonTime
WScript.echo " LegacyDN =" + objExchange_Mailbox.LegacyDN
WScript.echo " MailboxDisplayName =” + objExchange_Mailbox. MailboxDisplayName
WScript.echo " MailboxGUID =" + objExchange_Mailbox.MailboxGUID
WScript.echo " ServerName =" + objExchange_Mailbox.ServerName
WScript.echo " Size =" + objExchange_Mailbox.Size
WScript.echo " StorageGroupName =" + objExchange_Mailbox.StorageGroupName
WScript.echo " StorageLimitInfo =" + objExchange_Mailbox.StorageLimitInfo
WScript.echo " StoreName =" + objExchange_Mailbox.StoreName
WScript.echo " TotalItems =" + objExchange_Mailbox.TotalItems
Next
get-mailboxstatistics
–server $servername
データ
ベース
管理
Dim StorGroup as New CDOEXM.StorageGroup
StorGroup.DataSource.Open "LDAP://" + DCServer + "/ CN=First Storage Group,CN=InformationStore,CN=" +
Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative Groups,CN=First Organization,
CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName
StorGroup.MoveLogFiles("C:newlogPath", 0)
move-storagegrouppath
-identity "First Storage
Group"
–log "C:newlogPath"
受信者
管理
Dim objMailbox As CDOEXM.IMailboxStore
Set objMailbox = GetObject("LDAP://" + DCServer + "CN=FOO,CN=users," + DomainName)
objMailbox.CreateMailbox "LDAP://" + DCServer + "/CN=Private MDB,CN=First Storage
Group,CN=InformationStore,CN=" + Server + ",CN=Servers,CN=First Administrative Group, CN=Administrative
Groups,CN=First Organization, CN=Microsoft Exchange,CN=Services, CN=Configuration," + DomainName
enable-mailbox
-identity domainFOO
–database "First Storage
GroupPrivate MDB"
17. 17
事前準備
• コマンドシェルの環境設定
• 簡易編集を有効に
• フォントを見やすく
• 横幅の設定
• バッファの設定
• エクスプローラーの環境設定
• 「拡張子を表示しない」を無効に
• オンプレミスの”署名無しスクリプト”を実行できるようにする
• Set-ExecutionPolicy RemoteSigned
• 必要に応じて自分専用の初期設定ファイルを作成
• notepad $profile
cmd.exe と powershell.exeは独立している
必要なモジュールを読み込む..など
要は自分で作ったスクリプトのこと
18. 18
実行ポリシーの設定~ Set-ExecutionPolicy
• “管理者として実行” する必要がある
• 実行ポリシー
– Restricted:制限つき (オペレーターモード)(規定値)
• 対話形式のみ
• スクリプトは実行できない
– AllSigned:署名
• スクリプトは、信頼された発行元による署名が必要
– RemoteSigned:リモートの署名
• “インターネットゾーン” のスクリプトは信頼された発行元による署名が必要
– Unrestricted:無制限
• すべてのスクリプトを実行可能
• リモートのスクリプトについては常に警告
– Bypass:バイパス
• 何もブロックされず警告も表示されない
http://technet.microsoft.com/ja-jp/library/dd347628.aspx
“ポリシーの設定”は、規定で
はコンピューター全体に影響
する。適用範囲を制限するに
は、Scope も同時に定義する。
21. 21
覚えておくと便利な機能
メモ帳 編
指定した行番号に飛ぶ Ctrl + G
ステータスバーを表示すると行と列が参照できる
※いずれも「右端で折り返し」を無効にしておくこと
PowerShell コンソール、ISE 編
タブでコマンドレットやパラメタの続きを補完
(例)get-mem[Tab]
↓
Get-Member
※PowerShell 3.0 では Intellisence が実装されている
23. 23
(つづき)
• インストールされているモジュールを表示する
• Get-Module
※”ActiveDirectory” や “GroupPolicy”、”Hyper-V” など、必要なモジュールが読み込
まれていないとコマンドレットを使用することはできない
• コマンドレットのメソッドとプロパティ等を表示
• <コマンドレット> | get-member
• <コマンドレット> | get-member | sort-object Name | format-list
※ COMのメンバーも取得できる
New-Object -com scripting.filesystemobject | Get-Member
• コマンドレットのエイリアス
• Get-Alias
• Get-Alias <エイリアス> (例)Get-Alias dir
27. 27
オブジェクトであるということは...
PS C:>$a = “abc”
#普通ならば $a は”文字列” になるけれど...
#オブジェクトだからメソッドとプロパティが用意されている
PS C:>$a.ToUpper()
PS C:>ABC
PS C:>$a.ToUpper().Split("B")[0]
PS C:>A
28. 28
PS C:>get-service | where-object {$_.Status -eq "Running"}
PowerShell の典型的な使い方①
(例)起動中のサービス一覧
パイプ
サービス一覧
を出力
object
サービス一覧
オ
ブ
ジ
ェ
ク
ト
の
ま
ま
渡
さ
れ
る
object
サービス一覧
36. 36
名前付き引数
param([string] $UserID = “ID", [string] $Password =“PASS")
Write-Output $userid
Write-Output $Password
引数を所定の名前の変数に格納することで、文法チェック等が行いやすくなる
C:> hogehoge.ps1 -userid anno
anno
PASS
出力結果
規定値
37. 37
変数
$FirstName = "Junichi"
$LastName = "Anno"
$FullName = $FirstName + " " + $LastName
Write-Output $FullName
$arrFullName = $FullName.Split(" ")
Write-Output $arrFullname[0]
PS C:> C:hogehoge.ps1
Junichi Anno
Junichi
出力結果
38. 38
True と False の指定
$True と $False が予約されている
C:> $MyNameIsJunichi = $True
C:> If ($MyNameIsJunichi -eq $True) {Echo 1}
1
43. 43
繰り返し処理
#ForEach-Object
Get-ADUser -Filter * | ForEach-Object {$_.name}
Get-ADUser -Filter * | ForEach-Object name
#foreach
$Users = Get-ADUser -Filter *
foreach ($user in $Users) { $user.name }
Active Directory ユーザー一覧から name プロパティをリストする
V3
48. 48
リモーティング
• 3種類のリモーティング
• -ComputerName パラメタ
• 複数のコンピュータを指定可能
• 対話モード(Enter-PSSession コマンドレット)
• SSH のような使い方
• Invokeモード(Invoke-Command コマンドレット)
• -ComputerNameに対応していないコマンドで使用
• 複数のコンピュータに対して一括実行
• コマンド単体(-scriptblock)、
PS1スクリプト(-filepath)の指定が可能
• 送受信双方でリモーティングの準備が必要
49. 49
PowerShell セッション(PSSessions)
PS> Enter-PSSession -ComputerName Server1
[Server1]: PS > $A = 1
[Server1]: PS > $B = 2
[Server1]: PS > $C = $A + $B
PS>Exit-PSSession
PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$A = 1}
PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$B = 1}
Enter-PSSessionを使用
Invoke-Command を使用
PS> Invoke-Command -ComputerName Server1 -ScriptBlock {$C = $A + $B}
1つのセッション
• コマンドの実行空間単位
• セッション内ではデータの共有が可能
• 通常はテンポラリセッションが作成され、コマンド終了後に削除される
50. 50
PSSession の永続化
PS > $S = New-PSSession -ComputerName CL01
PS > Invoke-Command -session $S -ScriptBlock {$A=1}
PS > Invoke-Command -session $S -ScriptBlock {$B=2}
PS > Invoke-Command -session $S -ScriptBlock {$C=$A+$B}
PS > Remove-Session $S
• セッションの作成 :New-PSSession
• セッションの削除 :Remove-PSSession
• セッション一覧 :Get-PSSession
• セッションへの再接続 :Enter-PSSession
PS > $S = New-PSSession -ComputerName CL01
PS > Enter-PSSession $S
[CL01] PS > Get-VM | Where-Object name -EQ "TFWIN7-0"
PS > Exit-PSSession
51. 51
モジュールとコマンドのインポート
• リモートコンピューター上のコマンドレットを一時的に取り込むことができる
• “Invoke-Command -Session” を使用する必要が無くなる
• コマンドの実行中はセッションを生かしておく必要がある
PSSession
Windows 7 Windows Server 2008 R2
w/ Hyper-V
Hyper-V module
• Get-VM
• Start-VM
• Stop-VM
• ・
• ・
PS C:> Get-VM |ft name
Name
----
TFWin7-0
TFWin7-1 FX
TFWin8-0 FX
TFWin8-1
Win7_template
Win8_template
PowerShell
実
行
空
間
PSSession を通じてモジュールをインポート
PS C:> $s = New-PSSession -ComputerName Server1
PS C:> Import-PSSession -Session $s -Module HYPER-V
52. 52
関連コマンドレット
Get-Job
バックグラウンドジョブを取得
Receive-Job
バックグラウンドジョブの出力結果を取得
Remove-Job
バックグラウンドジョブを削除
Start-Job
バックグラウンドジョブを開始
Stop-Job
バックグラウンドジョブを停止
Wait-Job
バックグラウンドジョブが終了するまで待つ
バックグラウンドジョブ
• Windows PowerShell 2.0 よりサポート
• 長時間を要するコマンドレットを非同期に実行し、次の処理に移る
(例)get-eventlog “Windows PowerShell”
• ジョブの有効範囲は現在のセッション
53. 53
バックグラウンドジョブの作成/開始/状態/結果取得
(例)
PS C:> $job = start-job -scriptblock {do {$a = 0; echo (date) ; start-sleep 5} while ($a -eq 0) }
PS C:> $job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
6 Job6 Completed True localhost get-eventlog "Windows ...
PS C:> Receive-Job $job -Keep
PS C:> Stop-Job $job
PS C:> Remove-job $job
書式
start-job -scriptblock { <スクリプトブロック> }
出力結果が存在する
規定では、出力結果は一度取得するとクリアされてしま
うので、-Keep によって残すように指定
5秒に1回日時を表示するジョブ
ジョブを停止
ジョブを削除
54. 54
リモートバックグラウンドジョブ
リモートコンピューターでバックグラウンドジョブを実行する場合には、
リモーティング手法を使用する
PS C:> $session = New-PSSession -Name testjob -ComputerName vlab-server40
PS C:> $job = Invoke-Command -Session $session -ScriptBlock {Get-EventLog "windows powershell"}
-AsJob
PS C:> Get-Job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
21 Job21 Completed True vlab-server40 Get-EventLog "windows ...
PS C:> Receive-Job $job
ジョブとして実行
(注意)ジョブはローカルコンピューターに作成される
結果を取得
Windows PowerShell 3.0 では、ジョブの実行中にセッションを切断することが可能
結果はゆっくり自宅から...とか
55. 55
unix のあのコマンドは?
ls → get-ChildItem
cp → copy-Object
grep → select-String
sort → sort-Object
man → help
clear → clear-Host
cat → get-Content
kill → stop-Process
tee → tee-Object
tail → get-Content
「アレはあるかな?」と思ったら
Get-Alias <unix 上のコマンド>
56. 56
Get-Content で Tail を模してみる
## 新しく追加された行を待ち合わせて表示
gc test.txt -wait
## テキストファイルの5行目から10行目までを表示
(gc test.txt)[4..9]
## テキストファイルの最初の5行を表示
gc test.txt -totalcount 5
## テキストファイルの最後の5行を表示
gc test.txt | Select-Object -Last 5
## 新しく追加された行に特定の文字列が含まれていたら表示
gc test.txt -wait | Select-String -Pattern ^a
58. 58
Windows Management Framework 3.0
• PowerShell 3.0(コマンドレット数 2300!)
– ワークフロー
– セッションへの再接続
– PSScheduledJob モジュールによるジョブスケジューリングへの対応
– Show-Command による GUI を使用したコマンド入力
– パブリックネットワークでの Enable-PSRemoting
( -SkipNetworkProfileCheck オプション)
– WEB/Json系コマンドレット
– 新しい PowerShell ISE
• Windows PowerShell Web Service
• Server Manager CIM プロバイダー
• WinRM、WMI のアップデート
http://blogs.technet.com/b/junichia/archive/2012/03/21/3487696.aspx
59. 59
PSSession の扱いの違い
PowerShell 2.0 の場合
PSSession
セッション情報
PowerShell 3.0 beta の場合
PSSession
セッション情報
セッション情報はローカルに保
存されるため、別のクライアン
トから再接続できない
セッション情報はリモートコン
ピューターに保存されるため、
別のクライアントから再接続で
きる
60. 60
Session への再接続
セッション情報がリモートコンピュータ内に保存されるようになった
Name = Session1
New-PSSession -ComputerName ServerA
$A = 1
Disconnect-PSSessions -Name Session1
Connect-PSSession -ComputerName ServerA
-Name Session1
Enter-PSSession -Name Session1
Connect-PSSession -Name Session1
Enter-PSSession -Name Session1
$A = 1
Server1
Exit-PSSession
セッション
作成
PS C:>$A
1
再接続
自宅社内
61. 61
ワークフロー
ターゲット
• 長時間を要する処理
– 仮想マシンの展開
– ソフトウェアのインストール
– ビッグデータの集計 など
• 複数の処理の組み合わせ
• 複数のコンピューターに対する処理
– ドメイン参加
– 環境設定
– インベントリ収集 など
ニーズ
• タイムアウトやリトライ
• 処理の一時停止、再開
• 処理ステートの永続化
• 複数処理の制御
• 並列
• シーケンシャル
• スクリプト実行権限の委任
• 途中経過の取得
ワークフロー = バックグラウンドジョブ + 実行制御
63. 63
## 作成例
workflow testwf ( [string] $UserID, [string] $Password )
{
Echo -InputObject $PSComputerName, $UserID, $Password }
Start-Sleep -Seconds 5
}
##実行例
PS C:> testwf Yamada Pass -PSComputerName PC1,PC2,PC3
PC1
Yamada
Pass
PC2
Yamada
Pass
PC3
Yamada
Pass
ここで指定した3つのコンピューターに対し
てワークフローが同時に実行される
65. 65
パラメタ名 意味
PSUseSSL リモートコンピューターとSSLを使用して接続する
PSConfigurationName ワークフローの構成情報が格納された構成名を指定する。規定値は
Microsoft.PowerShell
PSConnectionURI 接続に使用するエンドポイントを指定する。規定は http://localhost:5985/WSMAN
PSAllowRedirection ターゲットコンピューターがURIのリダイレクトを要求してきたときに、それを
PowerShell が許可するかどうかを指定する。規定値は $False。
PSSessionOption New-PSSessionOption で作成された拡張オプションを指定する。
PSCertificateThumbprint 権限を持ったX.509証明書のサムプリントを指定する
PSPrivateMetadata ワークフローの実行時に使用される、ユーザーやアプリケーションの情報が格納された
ハッシュテーブルを指定する
AdJob ワークフローをバックグラウンドジョブとして実行する際に指定する。このオプション
を使用すると、ジョブ情報がオブジェクトとして返されるので、これを使用して関連モ
マンドレット(*-job)でジョブの制御を行うことができる。
Jobname AsJobパラメタで実行した場合、規定では Job<n> という名前が付けられるが、このパ
ラメタを使用してわかりやすいジョブ名を指定することができる。
InputObject ワークフローの引数
66. 66
共通パラメタの使用例
##例:pc1,pc2,pc3 をドメイン Contoso に参加させる
Workflow JoinDomain ([string] $Domain)
{
Get-WmiObject –Class Win32_ComputerSystem –PSComputerName $PSComputerName
Add-Computer -PSComputerName $PSComputerName -DomainName $Domain –Credential $PSCredential
Restart-Computer -PSComputerName $PSComputerName -Wait -For PowerShell -Force
Get-WmiObject -Class Win32_ComputerSystem -PSComputerName $PSComputerName
}
##ワークフローの実行
PS C:> JoinDomain Contoso.com -PSComputerName pc01,pc02,pc03 -PSCredential $Cred
71. 71
2.PowerShell を管理者モードで起動
3.以下のコマンドを実行
PS C:> Set-ExecutionPolicy RemoteSigned
PS C:> Import-Module PowerShellWebAccess
PS C:> Install-PswaWebApplication -webSiteName "Default Web Site"
PS C:> Add-PswaAuthorizationRule * * *
4.https://<サーバー名>/pswa にアクセス
ここで指定するサーバーは、
管理したいサーバー