読者です 読者をやめる 読者になる 読者になる

銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

PowerShell on Linux ふりかえり

PowerShell Advent Calendar 2日目のエントリです。

qiita.com

今年は.NET Core on RHELを追っかけた一年だったので、その関連でPowerShell on Linuxの現状というか簡単な振り返りをしてみたいと思います。事の始まりはPowerShell のOSS化とLinuxへの対応が発表されたこのブログでした。

blogs.msdn.microsoft.com

PowerShell v6 のα版というステータスでLinuxを含め各種OS向けのバイナリが1月に1回くらいのペースでリリースされています。

github.com

今のところ、CentOS系はrpmをダウンロードしてyum installを実行する形式になっています。CentOS系だからFedoraでもいけるのでは...?とも思われますが、内部で参照している.NET Coreのランタイムが古いせいか、Preview版のFedora24向け.NET Coreをインストールしていても、powershellは起動に失敗します。

$ powershell 
Failed to initialize CoreCLR, HRESULT: 0x80131500

ということなので、CentOS系ではCentOSもしくはRHELで楽しみましょう。さて、LinuxのShell上でpowershellコマンドを実行するとPowerShellのShellに変わりますが、これがなかなか補完が効いたり、色がついたりして使い勝手がよいです*1

これは最後の$_.の間で補完候補を表示した結果です。 f:id:tanaka733:20161201224736p:plain

シンタックスハイライトの様子。 f:id:tanaka733:20161201224932p:plain f:id:tanaka733:20161201225130p:plain f:id:tanaka733:20161201233328p:plain

さて、現状PowerShell v6のαで使えるコマンドは350個ほどしかなく、モジュールを追加したいところですが、そこにも問題があります。

PS /root> @(Get-Command).Count                                                                                                 
349

既存のモジュールの中にはC#などで書いたコードをコンパイルしたdllを参照しているものもありますが、.NET Framework版でビルドしたdllはWindows版でしか動きません。その一つがAzure PowerShellになります。こちらは、PowerShell on Linuxが公開されてかなり早い段階で.NET Core版のバイナリもPreview扱いでリリースしましたが、まだPreview扱いのままのようです... tech.tanaka733.net

さて、PowerShell on Linuxの今後ですが、まだすぐに普及するというステータスではないように思われます。コマンドなりモジュールがLinuxのコマンドにも対応してくれるとうれしいですね。なんといってもPowerShellのメリットはオブジェクトの集合がパイプで流れてきて、オブジェクトのまま*2処理できることにあると思っているので、Linuxの管理系コマンドの結果がオブジェクトでとれると使い勝手もよくなります。

また、DSCの動向ですが、例えば、Azure上でLinuxを動かす場合、Azure VMやVNETまわりのリソースはARMテンプレートで管理し、起動したLinuxより上のレイヤー(OSインストール後の設定、ミドルウェア製品のインストールやセットアップ)はAnsibleで行うというのが一つの形としてあります。例えばLinux中心の環境で一部Windows Serverを動かしたいとなれば、AnsibleでWindowsを管理しAnsibleの標準コマンドで管理しづらいようなWindowsの機能はPowerShell DSCでセットアップするということが考えられます。一方、Windows中心の環境で一部Linuxを使いたいとなれば、PowerShell DSC中心に置いて、PowerShell DSC for LinuxでLinuxを管理する方法がとれるかもしれません。AnsibleのModuleをPowerShell DSCから呼び出すという試みをしている人もいるので、この辺は何がメジャーになるのかまだわからないなあという感想を持っています。

github.com

なにはともあれ、なかなか面白いものが出て来たので、来年も引き続きさわっていきたいと期待している、というのが個人の感想です。

*1:普通のLinuxのコマンドと比べてどうかといわれると微妙だが、補完のきかないdotnetやいまいちなazure cliにくらべるとかなりよい

*2:単なる文字列ではなくという意味

Azure PowerShell を Linux で使う (Preview版)

PowerShell が Open SourceになってLinuxでも動くようになりました。

blogs.msdn.microsoft.com

Azure をLinux中心の環境で使っている場合、ポータルからではできなかったりスクリプトとして実行したい操作があると xplat Azure CLIを使っていたのですが、Azure PowerShellにはあるのに xplat Azure CLIにはないコマンドがあったり、シェルスクリプトよりはPowerShellをかきたい*1ので、早速Azure PowerShellを使おうと思っていました。ただ、Azure PowerShellは内部で.NET FrameworkでビルドしたC#コードを利用しており、.NET Coreに置き換えないと動かないという問題がありました。

github.com

まだ移行途中の模様ですが、Preview版が公開されたので早速.NET Core on RHEL を入れた環境で動かすことにしました。

*1:個人の感想です

続きを読む

AWS Tools for Windows PowerShell と SDK for .NET を参照するCmdletを組み合わせたらMissingMethodExceptionが出た話

あまりこの現象に遭遇することはないと思いますが、遭遇してそれなりに原因究明に時間がかかったのでまとめておこうと思います。

AWSにはWindows環境でAPIを実行するツールとして、Tools for PowerShell と SDK for .NET があります。

AWS Tools for Windows PowerShell

AWS SDK for .NET | アマゾン ウェブ サービス(AWS 日本語)

さて、SDK for .NET を参照してC#で作成したPowerShell のCmdletバイナリを作った上で、PowerShellスクリプトの中で Tools for PowerShell と作成したCmdletの両方をインポートしてCmdletで定義したコマンドを実行していました。すると、なんということでしょう!MissingMethodExceptionが出るようになってしまったのです。

続きを読む