2018年3月30日金曜日

PowerCLI と Hyper-v の PowerShell コマンドの競合回避

PowerCLIとHyper-v用のコマンドレットには同じ名称のものがいくつかあり、競合すると正しくスクリプトが動かないことが多々あります。

※VMTNにも過去いくつか質問が上がっているので、以下も参考になります。
Issue running Powercli script in Powershell ISE
Disable (Hyper-V) PowerShell Modules

最近、作業用のWindows ServerでDNS・AD・DHCPのコンソールを「管理ツール」として機能追加しようとデフォルト設定のまま次へ次へを進めたところ、Hyper-v用のPowerShellモジュールがセットで入ってしまい、PowerCLIと競合して使えなくなってしまったので覚書として記録しておきます。

デフォルト設定のまま機能追加をしようとすると、以下のキャプチャのようにHyper-v用のPowerShellモジュールにチェックが入ってます。



手っ取り早くPowerCLIを正常に利用するためには、再度このHyper-v用のPowerShellモジュールのチェックを外してしまうことです。

Hyper-vモジュールが追加されているとGet-VMもVmware用とHyper-v用が見えます。


PS C:\> Get-Command -Name get-VM*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           Get-VMCheckpoint                                   2.0.0.0    Hyper-V
Cmdlet          Get-VM                                             10.0.0.... VMware.VimAutomation.Core
Cmdlet          Get-VM                                             2.0.0.0    Hyper-V
Cmdlet          Get-VMAssignableDevice                             2.0.0.0    Hyper-V
Cmdlet          Get-VMBios                                         2.0.0.0    Hyper-V
Cmdlet          Get-VMComPort                                      2.0.0.0    Hyper-V
Cmdlet          Get-VMConnectAccess                                2.0.0.0    Hyper-V
Cmdlet          Get-VmcService                                     10.0.0.... VMware.VimAutomation.Vmc


「役割と機能の管理」からHyper-vモジュールを削除すれば正常に戻ります。

PS C:\> Get-Command -Name get-VM*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-VM                                             10.0.0.... VMware.VimAutomation.Core
Cmdlet          Get-VmcService                                     10.0.0.... VMware.VimAutomation.Vmc
Cmdlet          Get-VMGuest                                        10.0.0.... VMware.VimAutomation.Core
Cmdlet          Get-VMHost                                         10.0.0.... VMware.VimAutomation.Core
Cmdlet          Get-VMHostAccount                                  10.0.0.... VMware.VimAutomation.Core

2018年3月7日水曜日

PowerCLIのセキュリティ警告を無視する設定

私の場合はずぼらな正確なので、手元の検証環境でPowerCLIでvCenter接続時などの証明書チェック時の挙動は "Ignore" にしていたので気づかなかったのですが、
PowerCLI 10.0 に更新した人から今までどおりのアクセスだと弾かれてしまい、vCenterに接続できないと問い合わせがあったので変更手順を記しておきます。

以下のように、Get-Credentialの値を変数に入れて、Connect-VIServer などに渡している場合、デフォルトでは今までは黄色い文字で警告が出てましたが、PowerCLI 10から以下のように "Invalid server certificate" で弾かれてしまうようです。

PS E:\> $cre = Get-Credential

コマンド パイプライン位置 1 のコマンドレット Get-Credential
次のパラメーターに値を指定してください:
Credential

PS E:\> Connect-VIServer -Server ex-vcsa.techlab.local -Credential $cre
Connect-VIServer : 2018/03/07 17:52:31  Connect-VIServe
Error: Invalid server certificate. Use Set-PowerCLIConfiguration to set the value for the
InvalidCertificateAction option to Prompt if you'd like to connect once or to add a permane
nt exception for this server.
Additional Information: 機関 'ex-vcsa.techlab.local' との SSL/TLS のセキュリティで
保護されているチャネルに対する信頼関係を確立できませんでした。
発生場所 行:1 文字:1
+ Connect-VIServer -Server ex-vcsa.techlab.local -Credential $cr ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  + CategoryInfo          : セキュリティ エラー: (: ) [Connect-VIServer]、ViSecurityNegotiationException
  + FullyQualifiedErrorId : Client20_ConnectivityServiceImpl_Reconnect_CertificateError,VMware.VimAutomation.ViCore.Cmdlets.Commands.ConnectVIServer


これを回避するためには Connect-VIServer のオプションで -Force を付けて実行するか
以後、-Force オプションを付けずに接続可能なように、Set-PowerCLIConfiguration でPowerCLIの規定値を変えておきます。 規定値は以下のようになっていると思います。Get-PowerCLIConfiguration コマンドで確認します。
ちなみにそれぞれの値の意味は以下のとおりです。
Unset – デフォルト値。基本的にはWarnと同じです(ただ、PowerCLI10から少しセキュリティが強化された?)
Prompt – サーバー証明書が信頼されていない場合、アクションを求めるプロンプトを表示します。
Fail – 証明書が有効でない場合は接続は確立しません。
Ignore – 証明書が無効であるかどうかを考慮せずに接続を確立します。
Warn – 証明書が有効でない場合、その理由と証明書に関する追加情報が表示されます。


PS E:\> Get-PowerCLIConfiguration

Scope    ProxyPolicy     DefaultVIServerMode InvalidCertificateAction  DisplayDeprecationWarnings WebOperationTimeout
                                                                                                  Seconds
-----    -----------     ------------------- ------------------------  -------------------------- -------------------
Session  UseSystemProxy  Multiple            Unset                     True                       300
User
AllUsers

閉じた環境で接続先は信頼しているのであれば、"AllUser" に "Ignore" を入れてしまってもよいですが、今までのようにせめて黄色文字で警告文を出すのであれば "Warn" で設定します。

PS E:\> Set-PowerCLIConfiguration -InvalidCertificateAction Warn -Scope AllUsers

Perform operation?
Performing operation 'Update PowerCLI configuration.'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): A

Scope    ProxyPolicy     DefaultVIServerMode InvalidCertificateAction  DisplayDeprecationWarnings WebOperationTimeout
                                                                                                  Seconds
-----    -----------     ------------------- ------------------------  -------------------------- -------------------
Session  UseSystemProxy  Multiple            Warn                      True                       300
User
AllUsers                                     Warn

Ignoreの場合は以下のように設定します。

PS E:\> Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Scope AllUsers

Perform operation?
Performing operation 'Update PowerCLI configuration.'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): A

Scope    ProxyPolicy     DefaultVIServerMode InvalidCertificateAction  DisplayDeprecationWarnings WebOperationTimeout
                                                                                                  Seconds
-----    -----------     ------------------- ------------------------  -------------------------- -------------------
Session  UseSystemProxy  Multiple            Ignore                    True                       300
User
AllUsers                                     Ignore

2018年3月1日木曜日

PowerShell Gallery からの PowerCLI インストール・アップデート方法

Vmware PowerCLI Blogで案内されましたが、PowerCLIが Ver 6.5.4 から 一気にVer 10.0 としてリリースされました。
https://blogs.vmware.com/PowerCLI/2018/02/powercli-10.html

VMware Code のサイトも一気に飛んでいます。
https://code.vmware.com/web/dp/tool/vmware-powercli/10.0.0

※ 最新版への固定 URL は https://code.vmware.com/tool/vmware-powercli


今回のアップデートで、元々 "vSphere PowerCLI" が正式名だったのが "VMware PowerCLI" に切り替わったことと、Ver 10.0 は初期リリースから10年を機に切り替えたとのこと。
また、大きな機能拡張としてはLinuxやMacなど、PowerShell Core 6.0が動作している環境でのPowerCLI利用が正式サポートになったことです(以前はLabs Flingsでの提供)

インストール方法はPowerCLI 6.5.1以降から実装されたPowerShell Galleryからのダウンロードとなります。

https://www.powershellgallery.com/packages/VMware.PowerCLI/



新規にインストールする場合は、インターネットに疎通できる環境でPowerShellを管理者権限で開き、Install-Moduleを実行するのみ。

Install-Module -Name VMware.PowerCLI

2020年4月に PowerShell Gallery の仕様が変更され、TLS 1.2 での接続が必須となりました。PowerShellGet モジュールなどが Windows Server 2016 の初期バージョンなどの場合はインストールに失敗するため TLS 1.2 を既定値に設定するか、PowerShellGet などモジュールを最新版に更新する必要があります。
以下にいくつかのワークアラウンド手順を纏めましたので参照ください。
既存でPowerCLI 6.5.1以降をPowerShell Galleryからインストールしている場合は、Update-Module を実行するのみ。非常に簡単です。

Update-Module -Name VMware.PowerCLI

※ 公式の Vmware Code ユーザーガイド <https://code.vmware.com/tool/vmware-powercli> によると Update-Module では更新時に古いモジュールが削除されないため、一度インストール済みのモジュールを以下の様なコマンドで確認し、
Get-Module -Name VMware.* -ListAvailable

その後に Uninstall-Module で削除します。
全て削除後に最新版の PowerCLI 再インストールでよければ以下のコマンドで一括削除します。
Get-Module -Name VMware.* -ListAvailable | Uninstall-Module -Force

さっそく試しに手元の踏み台PCのバージョンアップを行ってみました。
まずは Get-PowerCLIVersion で現在のバージョンを確認、

Find-Module でPowerShell Galleryの最新バージョンを確認、
Find-Module -Name VMware.PowerCLI
Get-Module で既存のモジュールを確認、
Get-Module -Name VMware.* -ListAvailable
必要に応じて既存モジュールを削除、
Get-Module -Name VMware.* -ListAvailable | Uninstall-Module -Force

Install-Module か Update-Moduleで再インストールをかけます。
Update-Module -Name VMware.PowerCLI
または
Install-Module -Name VMware.PowerCLI

更新されたModuleは私の場合は "C:\Program Files\WindowsPowerShell\Modules" に落としていますので、以下のようにタイムスタンプが更新されました。


ちなみにPowerCLIのユーザーガイドは以下のURLから参照可能です。
より深く知りたいときはユーザーガイドを参照してください。