しばたテックブログ

気分で書いている技術ブログです。

PowerShell on Linuxに普通にPSRemotingしてみる

ある意味前回の続き的な。

注意事項

一応PSRemotingできるのは確認しましたが、まだアルファ版なので動作が超不安定です。
実際に使える様になるのはまだまだ先になりそうな感じです。

OMI ServerとPowerShell on Linux OMI Provider

WindowsのPSRemotingではWinRMサービスがエンドポイントとなりリモートからの接続を受け付けています。
当然ですがLinuxにはWinRMサービスはないため代替になる機能が必要です。

それが、OMI ServerPowerShell on Linux OMI Providerになります。

OMI Server

私自身まだ勉強中なため簡単な説明で済ませます。
間違いがあればご指摘ください。

まず、Open Management Infrastructure (OMI)は、超簡単に言うと、オープンソースのUNIX/Linux向けのWBEM実装になります。
雑なイメージですがUNIX/Linux向けのWMIと考えれば話は早いかと思います。

公式な情報はThe Open Groupにありソースもここで公開されていたのですが、先日GitHubでもソースが公開されニュースになりました。

OMIの概要についてはWindows Server Blogの以下の記事が詳しいので参考にしてください。

blogs.technet.microsoft.com

この記事にある様にOMIはいくつかのコンポーネントから成るのですが、今回インストールするのはその中のomiserverと呼ばれるコア機能になります。

PowerShell on Linux OMI Provider

OMI Serverはコア機能でそれだけあっても正直使いものになりません。
利用したい機能に応じてProviderと呼ばれるコンポーネントを追加してやる必要があります。

WMIの場合はOSに組み込み済みなためあまり意識しませんが、ココにある様に数多くのProviderが存在しています。

PowerShell on Linux向けのOMI ProviderがGitHubで公開されていますので、これを追加してやることでPowerShell Remoting Protocol(PSRP)によるリモート接続ができる様になります。

余談ですが、その他の機能を利用する場合は個別にOMI Providerをインストール、または自作する必要があります。
例えばPowerShell DSCをLinuxで利用する場合、ココにあるDSC Packagesをインストールする必要があり、ソースをよく見るとDSC ResourceごとにOMI Provdierの定義があることがわかります。

動作環境

PowerShell on Linux OMI ProviderのGitHubに以下のIssueが上がっており、現時点ではUbuntu 14.04でのみ動作可能な様です。

github.com

私も最初CentOS 7.2で試してみましたが同じエラーが出て駄目でした。
また、理由は不明ですがUbuntu 14.04でもDocker上では駄目な様です。
これも最初に試して失敗しました。

これをふまえて今回はWindows 10 RS1(1607)の物理マシンからHyper-V上に構築したUbuntu Server 14.04.5の仮想マシンに接続して検証しました。
UbuntuはISOからインストールしてSSHだけ初期インストールした状態です。

PowerShell on LinuxにPSRemotingしてみる

最初にDocker環境で試した都合*1、以降の手順は全てrootで行っています。

1. PowerShellのインストール

最初にPowerShellをインストールします。

https://github.com/PowerShell/PowerShell/blob/master/docs/installation/linux.md#ubuntu-1404github.com

こちらは特に言うことはありません。
GitHubからPowerShellのdebファイルをダウンロードしてdpkgでインストールします。

# apt-get update and install PowerShell
apt-get update && apt-get install -y curl libunwind8 libicu52 libcurl3
curl -LO https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-alpha.9/powershell_6.0.0-alpha.9-1ubuntu1.14.04.1_amd64.deb
dpkg -i powershell_6.0.0-alpha.9-1ubuntu1.14.04.1_amd64.deb

2. OMI Serverのインストール

次にOMI Serverをインストールします。
手順はGitHubに載っています。

github.com

といってもOSに応じたdebファイルをインストールするだけなので楽です。
一応ソースからビルドする手順も載っていますが面倒なのでしません(

# Install OMI
curl -LO https://github.com/Microsoft/omi/releases/download/v1.1.0-0/omi-1.1.0.ssl_100.x64.deb
dpkg -i omi-1.1.0.ssl_100.x64.deb

3. PowerShell on Linux OMI Providerのインストール

最後にOMI Providerをインストールします。
こちらも手順はGitHubに載っています。

github.com

必要なパッケージ(libpam0g-devlibssl-dev)とdebファイルをインストールするだけです。

# Install Powershell OMI Provider
apt-get install -y libpam0g-dev libssl-dev
curl -LO https://github.com/PowerShell/psl-omi-provider/releases/download/v.1.0/psrp-1.0.0-0.universal.x64.deb
dpkg -i psrp-1.0.0-0.universal.x64.deb

インストール後はserviceコマンドでOMI Server(omid)の状態を確認してください。
通常であればrunningになっているはずで、これで準備完了です。

root@ubuntu:/# service omid status
Checking for service Microsoft OMI Server  *  is running

もしomidが起動していない場合は起動しておいてください。

# omidが起動していない場合は以下のコマンドで起動します
service omid start

ちなみにデフォルトではTCP 5986(HTTPS)で待ち受けをします。

oot@ubuntu:/# netstat -lp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:5986                  *:*                     LISTEN      2138/omiserver

・・・ (後略) ・・・

なお、今回はやりませんでしたが、Firewallが有効な場合はTCPの5985,5986番ポートをあけておいてください。

4. PSRemotingしてみる

OMI Providerのインストール手順に記載されている手順で接続します。

OMI Serverインストール時に生成される証明書が自己証明書であることや、接続先の指定にIPアドレスを使っているといった都合、以下の様にNew-PSSessionOptionを使って幾つかのチェックをスキップするオプションを指定してやる必要があります。

# PowerShell 5.1 / Windows 10
# Ubuntuサーバーが 192.168.0.200 の場合
$o = New-PSSessionOption -SkipCACheck -SkipRevocationCheck -SkipCNCheck
Enter-PSSession -ComputerName 192.168.0.200 -Credential root -Authentication basic -UseSSL -SessionOption $o

また、接続ユーザーは必ずrootにしてください。
現状root以外のユーザーで接続するとエラーになってしまいます。

接続できると下図の様になり、普通にPSRemotingできます。

f:id:stknohg:20160909181047p:plain

これで今回の目的は果たせましたが、せっかくなのでCIMセッションを張ってOMIの情報も取得してみます。
(といっても現状Providerが全然無いので大した情報は取れませんが...)

New-CimSessionOptionNew-CimSessionを使ってUbuntuに対してCIMセッションを張ります。
指定するオプションはPSセッションの場合とだいたい同じです。

# PowerShell 5.1 / Windows 10
# Ubuntuサーバーが 192.168.0.200 の場合
$o = New-CimSessionOption -SkipCACheck -SkipRevocationCheck -SkipCNCheck -UseSsl
$s = New-CimSession -ComputerName 192.168.0.200 -Credential root -Authentication Basic -SessionOption $o

セッションを張った後は、Get-CimInstanceを使うとCIMインスタンスの情報を取れます。
(現在取れるのはOMI Server自身のクラスであるOMI_Identifyの情報しかありませんが。)

Get-CimInstance -CimSession $s -Namespace root/omi -ClassName OMI_Identify

実行すると下図の様になりOMI Serverの情報が取れました。

f:id:stknohg:20160909181814p:plain

続けてGet-CimClassを使ってCIMクラスの情報を取得してみます。
Windowsであれば以下の様にすれば利用可能なクラスの一覧が取得できるのですが、Ubuntuで試すと内部エラーになってしまいました。
そういう仕様なのかバグなのかはよくわかりません。

Get-CimClass -CimSession $s

仕方ないので以下の様にクラス名まで指定してやる必要があります。

Get-CimClass -CimSession $s -Namespace root/omi -ClassName OMI_Identify

結果は下図の様になり、クラスのプロパティなどの情報を取得できます。

f:id:stknohg:20160909182137p:plain

現時点ではOMIのクラスが全然ないため何の役にも立ちませんが、いずれ*2クラスが増えることがあればWindowsでWMIを使ったサーバー管理をしてきたのと同じ様にLinux(ひいてはMac)の管理ができる様になるはずです。

期待して待つか気合を入れて自作しましょう(

エラーが出た場合

最初に述べた様にこのOMI ServerとOMI Providerは超不安定です。
何らかのエラーが出てomidが落ちると、以降何をやっても接続不可になるケースが頻発します。

もしそうなった場合はOMI Providerを再インストールすると直ります。

# omid 停止
service omid stop
# アンインストール
dpkg -r omi-psrp-server
# 再セットアップ
dpkg -i psrp-1.0.0-0.universal.x64.deb

これでもダメな場合は気合でなんとかするか、諦めてゼロから再セットアップするしかないと思います。

追記

PowerShell on Linux OMI Providerをソースからビルドする手順について書きました。

stknohg.hatenablog.jp

*1:Dockerfileの内容を単純にコピペしたかったので...

*2:いつになることやら...