Operations Lab.

Archive for 9月 2016

PowerShell スクリプトのコマンドヘルプの書き方(簡易版)

leave a comment »

PowerShell では Get-Help コマンドレットでコマンドのヘルプを出力できます。自作したスクリプト(モジュール化などはしていない、単純な ps1 スクリプトファイル)であっても、ヘルプ情報を埋め込むことができます。

書き方

ヘルプ トピックの作成方法は、about_Comment_Based_Help に記載されています。

スクリプトファイルの先頭(Requires の直後)に、ブロックコメントで必要な情報を記載します。(ブロックコメントではなく 1 行ずつコメント化しても認識しますが、複数行に渡ることが多いため通常はブロックコメントを使用します。)

記述方法のサンプルは以下の通りです。

<#
    .SYNOPSIS
        Windows Server 2016 RTM の NanoServerImageGenerator を修正し、インターフェース名が ASCII 以外の場合にもアドレスを設定できるようにします。
    
    .DESCRIPTION
        Windows Server 2016 RTM の NanoServerImageGenerator は、インターフェース名が ASCII 文字列以外で表現されることを想定していません。そのため、デフォルトインターフェース名が ASCII 外の環境、例えば "イーサネット" となっている日本語環境では、IP アドレスを正しく設定できません。

        このスクリプトは、NanoServerImageGenerator モジュールを修正し、インターフェース名が ASCII 以外の環境においても、New-NanoServerImage で指定した IP アドレスが正しく設定されるよう、モジュールを修正します。
    
    .PARAMETER Path
        NanoServerImageGenerator モジュールのフォルダーを指定します。指定したフォルダー内のモジュールファイルが直接修正されます。
    
    .INPUTS
        なし。パイプラインからの入力には対応していません。
    
    .OUTPUTS
        System.Int32
        正常終了した場合は 0 を、それ以外の場合は 1 を返します。
    
    .EXAMPLE
        .\Modify-NanoServerImageGenerator.ps1 -Path C:\Temp\NanoServer\NanoServerImageGenerator
        C:\Temp にインストールメディアの NanoServer フォルダーをコピーした場合、NanoServer フォルダー内の NanoServerImageGenerator フォルダーを指定してください。
    
    .NOTES
        This script is only for Windows Server 2016 RTM (10.0.14393).
        This script is tested with Windows Server 2016 Evaluation 10.0.14393.0 JA-JP only.
        Use this at your own risk!
#>

ヘルプ キーワード

ヘルプ キーワードはドット(.)で始まります。

  • .SYNOPSIS
    関数またはスクリプトの簡単な説明。
  • .DESCRIPTION
    関数またはスクリプトの詳細な説明。
  • .PARAMETER <パラメーター名>
    パラメーターの説明。
  • .EXAMPLE
    関数またはスクリプトの使用方法(使用例)。
  • .INPUTS
    入力オブジェクトの .NET Framework 型。
  • .OUTPUTS
    出力オブジェクトの .NET Framework 型。
  • .NOTES
    関数またはスクリプトに関する追加情報。
  • .LINK
    「関連リンク」セクションに表示される内容。

キーワードは他にもありますが、簡単なスクリプトであれば上記以外を使用するシーンは少ないと思います。

スクリプトの説明を、通常のコメントとしてスクリプト内に埋め込むのもよいですが、PowerShell として用意されている方法がありますので、なるべくスクリプトのヘルプ トピックを記述するくせをつけると良さそうです。

広告

Written by kazu

2016/09/29 at 03:24

日本語版 Nano Server イメージ作成時に IPv4 アドレスを設定する

leave a comment »

昨日の記事で日本語版は時期尚早と書きましたが、どうしても日本語版を使用したい方向け。

なぜ IPv4 アドレスを設定できないのか

New-NanoServerImage (Nano Server Image Generator モジュール)が、「イーサネット インタフェースの名前が日本語であること」(日本語環境だとデフォルトインタフェース名は「イーサネット」)を想定していないからです。

もう少し仕組みを詳しく

New-NanoServerImage で指定した IPv4 アドレスは、SetupComplete.cmd というファイルに書き込まれ、初回起動時に設定が試みられます。SetupComplete.cmd の中身は単純に netsh を呼び出しているだけで、その際に InterfaceNameOrIndex パラメータで指定したインタフェース名(またはインデックス番号)が渡されます。

日本語版の場合、デフォルトインタフェース名は「イーサネット」ですので、InterfaceNameOrIndex パラメータにも「イーサネット」(など)を指定すればよいはずですが、RTM メディアに含まれているモジュールでは正しく設定されません。

残念なことに、New-NanoServerImage は、SetupComplete.cmd を生成する際、ファイルのエンコードを強制的に ASCII に設定します。ですので、ASCII で表現できない「イーサネット」という文字列は正しく保持されず、起動時に netsh が実行されるものの不明なインタフェース名としてコマンドがエラーになります。結果として IPv4 アドレスは正しく設定されません。

つまり

以下の何れかでアドレスを正しく設定できます。

  1. インタフェース名ではなくインタフェース インデックス番号で対象を指定する
  2. Nano Server のイメージ作成後、イメージをマウントして SetupComplete.cmd を修正し、正しいエンコードで保存する
  3. New-NanoServerImage が SetupComplete.cmd を書き込む際のエンコードを変更する

Nano Server はインタフェースインデックス番号があまり変動しない(インストールの都度変わることがほぼない?経験上であり、仕様上どうなのかは不明)ようなので、一度番号が分かれば 1 の方法でもよいかもしれません。ただし、一度インストールしてみるなど、何らかの方法でインデックス番号を知る必要があります。

2 の方法は、、、面倒ですね。

ということで、3 の方法を実現するためのスクリプトを作成しました。(GitHub 上で公開しています。)

#Requires -Version 5
#Requires -RunAsAdministrator

[Cmdletbinding()]
param
(
    [Parameter(Mandatory)]
    [string]$Path
)

## Initialize
$ErrorActionPreference = "Stop"
# Target Module File
$target = $Path + "\NanoServerImageGenerator.psm1"
# Original FileHash (SHA256)
$hash = "5DDA7841FEDC064F2696D1155717E9094621722C0F2645D1062453D4047C997B"
# Target line
$line2508 = @'
    Set-Content -Value $SetupCompleteCommand -Path "$Script:TargetSetupCompleteFilePath" -Encoding UTF8
'@

## Check target
if(!(Test-Path $target)) {
    Write-Output "モジュールが存在しません。"
    Write-Verbose -Message ("Path: {0}" -f $Path)
    Write-Verbose -Message ("Target: {0}" -f $target)
    exit 1
}

$h = Get-FileHash -Algorithm SHA256 $target
if($hash -ine $h.Hash) {
    Write-Output "モジュールがオリジナルの状態ではありません。"
    Write-Verbose -Message "モジュールのハッシュ値が想定と異なります。"
    Write-Verbose -Message ("Expected Hash (SHA256): {0}" -f $hash)
    Write-Verbose -Message ("Actual Hash (SHA256): {0}" -f $h.Hash)
    exit 1
}

## Copy & Modify
Copy-Item -Path $target -Destination ($target + ".original") -Force
$c = Get-Content -Path $target -Encoding UTF8
$c[2508] = $line2508
Set-Content -Path $target -Value $c -Encoding UTF8

Write-Output "FailoverClusters モジュールを修正しました。"
return 0

このスクリプトは、NanoServerImageGenerator モジュールを書き換え、SetupComplete.cmd を UTF-8 で生成するように動作を変更します。

実行する際は、Path パラメータに書き換え対象の NanoServerImageGenerator モジュールを含んでいるフォルダーを指定してください。例えば、

PS> .\Modify-NanoServerImageGenerator.ps1 -Path C:\Temp\NanoServer\NanoServerImageGenerator

詳しくは、Get-Help .\Modify-NanoServerImageGenerator.ps1 でヘルプを参照してください。

※ご利用は自己責任でお願いします。

Written by kazu

2016/09/28 at 00:15

カテゴリー: PowerShell, Windows Server

Tagged with ,

Windows Server 2016 Nano Server と日本語環境

leave a comment »

Windows Server 2016 が RTM となり、評価版がダウンロードできるようになりました。

結論

日本語版 Nano Server を使用するのは時期尚早です。やめましょう。

どうしても利用したい方は、以下を理解したうえで自己責任でどうぞ。

日本語版で困ること

Nano Server のイメージを作成する際に、静的 IP アドレスを正しく設定できない

New-NanoServerImage で IPv4Address などを指定しても、IP アドレスが設定されません。DHCP を使用する場合は問題ありませんが、静的アドレスを使用したい場合は、Recovery Console 側で設定操作が必要です。

Recovery Console が文字化けする

Recovery Console は日本語対応していないため、日本語で出力される部分はもれなく文字化けします。例えば、時刻表示やネットワーク インタフェース名、Windows Firewall のルール名などが文字化けします。

img002618img002625

RTM の Nano Server では Recovery Console でできることが増えているため、相対的に不便さ倍増です。

新規に作成した Gen 2 仮想マシンが存在すると、仮想マシン管理サービスがクラッシュする

Hyper-V の役割をインストールして Hyper-V ホストとして使用することを考えている方も多いと思いますが、日本語版 Nano Server 上で新規に Gen 2 仮想マシンを作成し、PowerShell 上で Get-VMFirmware を実行すると、Hyper-V 仮想マシン管理サービス(Hyper-V Virtual Machine Management Services / vmms)がもれなくクラッシュします。

Gen 2 仮想マシンの状態や、セキュアブートの設定には依存しません。VM が停止状態であっても、セキュアブートが無効に設定されていてもクラッシュします。(これはおそらく、セキュアブート テンプレートに不整合が発生しているためと思われます。(次項参照))

vmms がクラッシュしても仮想マシンは停止しませんが、Hyper-V マネージャや PowerShell などから管理ができなくなります。

Gen 2 仮想マシンのセキュアブート テンプレートを変更できない

日本語 Nano Server 上で新規に Gen 2 仮想マシンを作成すると、セキュアブート テンプレートを選択するリストが表示されないため、テンプレートを選択できません。また、この状態で仮想マシンの電源をオンにすると、セキュアブートテンプレートの互換性に問題がある旨、警告が表示されます。

英語版 Nano Server

img002639

日本語版 Nano Server

img002640

img002641

なんとなく、セキュアブート テンプレートが壊れているか、内部的に不整合な状態になっている気がします。

デフォルト タイムゾーンが US に設定される

日本語版イメージを作成すると、言語環境や時刻、通貨表記などは日本語(日本環境)になりますが、タイムゾーンは米国およびカナダ(UTC-8)が設定されます。(いっその事すべて US 環境がデフォルトなら問題は少なかったかもしれないのに…。)

img002629

なお、タイムゾーンは起動後にコマンドで変更できますので、大きな問題ではありません。

最後に

Nano Server は、他の Windows Server 2016 (Core / Desktop)と異なり CBB (Current Branch for Business)で提供されます。(Windows Server は LTSB ; Long Term Service Branch)で提供されるため、不具合の改修やアップデート(に伴う仕様変更)も早いと思われます。

もう少ししたら、日本語版でも問題なく利用できるようになるかもしれません。

Written by kazu

2016/09/27 at 04:41

Docker はコンテナそのものではない(はず…)

leave a comment »

最近、あまりにも Docker という言葉が曖昧なコンテキストで使われているので、少しまとめてみます。

おことわり

  • 旧来の Docker について記載します。(Docker ファミリーはどんどん進化(領域拡大)しているので、将来的にはこのポストの内容が誤りになるかもしれません。)
  • 2016 年 9 月時点の情報をベースにしています。
  • 分かりやすさを優先するため、厳密には正しくない記載(割り切った記載)が含まれます。
  • 誤りがあれば、ぜひご指摘ください。(特に有識者の方)

初めに

Docker コンテナそのものを実現する(実行する)仕組み(機能)

乱暴に言うと、Docker はコンテナそのものではありません。仮想マシンに例えて言うなら、Windows Hyper-V における Hyper-V (ハイパーバイザ)そのものではありません。

Docker (または Docker コンテナとは)

ざっくり言うと、以下の 3 つ(のどれか)です。

  1. コンテナイメージのフォーマット(の一種)
  2. コンテナを管理・制御するためのサービスおよびツール群(dockerd および docker cli)
  3. コンテナイメージを管理、再利用するためのレポジトリ (Docker Hub, Docker Registry)

これらを含めて Docker エコシステムが形成されています。

結局 Docker は何をしてくれているのか

コンテナそのものは、(Linux であれば)Linux Containers (各種ネームスペースや cgroups などの、Linux kernel の機能)により実現されています。Windows Server 2016 の場合は、「Containers」の機能(Windows Containers / Hyper-V Containers)によって実現されています。

Docker はコンテナを実現する仕組みをうまくコントロールし、管理を行うためのサービスやユーザーインタフェースを提供してくれています。

乱暴な言い方をすると、Hyper-V の世界でいうところの、System Center Virtual Machine Manager (SCVMM) や、Hyper-V Manager、Virtual Machine Management Services (vmms)のようなものを提供してくれています。

参考資料

Written by kazu

2016/09/17 at 15:43

カテゴリー: Containers, Linux, Windows Server

Tagged with ,

System Center User Group Japan 第15回勉強会で登壇しました

leave a comment »

System Center User Group Japan (SCUGJ)第15回勉強会で登壇させていただきました。今回は、クラウドと OSS (Open Source Software)がテーマということで、PowerShell DSC for Linux と Azure Automation DSC のお話をさせていただきました。

資料は SlideShare に掲載しています。また、デモで使用したサンプルコードは GitHub 上で公開しています。

PowerShell DSC for Linux と Azure Automation DSC については、別途記事にまとめる予定です。