ある意味前回の続き的な。
注意事項
一応PSRemotingできるのは確認しましたが、まだアルファ版なので動作が超不安定です。
実際に使える様になるのはまだまだ先になりそうな感じです。
OMI ServerとPowerShell on Linux OMI Provider
WindowsのPSRemotingではWinRM
サービスがエンドポイントとなりリモートからの接続を受け付けています。
当然ですがLinuxにはWinRM
サービスはないため代替になる機能が必要です。
それが、OMI ServerとPowerShell on Linux OMI Providerになります。
OMI Server
私自身まだ勉強中なため簡単な説明で済ませます。
間違いがあればご指摘ください。
まず、Open Management Infrastructure (OMI)は、超簡単に言うと、オープンソースのUNIX/Linux向けのWBEM実装になります。
雑なイメージですがUNIX/Linux向けのWMIと考えれば話は早いかと思います。
公式な情報はThe Open Groupにありソースもここで公開されていたのですが、先日GitHubでもソースが公開されニュースになりました。
OMIの概要についてはWindows Server Blogの以下の記事が詳しいので参考にしてください。
この記事にある様に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でのみ動作可能な様です。
私も最初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に載っています。
といっても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に載っています。
必要なパッケージ(libpam0g-dev
、libssl-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できます。
これで今回の目的は果たせましたが、せっかくなのでCIMセッションを張ってOMIの情報も取得してみます。
(といっても現状Providerが全然無いので大した情報は取れませんが...)
New-CimSessionOption
とNew-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の情報が取れました。
続けてGet-CimClass
を使ってCIMクラスの情報を取得してみます。
Windowsであれば以下の様にすれば利用可能なクラスの一覧が取得できるのですが、Ubuntuで試すと内部エラーになってしまいました。
そういう仕様なのかバグなのかはよくわかりません。
Get-CimClass -CimSession $s
仕方ないので以下の様にクラス名まで指定してやる必要があります。
Get-CimClass -CimSession $s -Namespace root/omi -ClassName OMI_Identify
結果は下図の様になり、クラスのプロパティなどの情報を取得できます。
現時点では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をソースからビルドする手順について書きました。