Mac で PowerShell + Azure 操作する (Preview)


Azure 管理に、Windows で使う powershell コマンドを Mac で開発できる？　という疑問を解決してみたら出来たという手順紹介。いい時代になってきた。

| パッケージ | バージョン |
|:-----------|------------:|
| OS X       |        10.11.6 , El Capitan |
| [PowerShell](https://github.com/PowerShell/PowerShell)       |        v6.0.0-alpha.14 |
| [AzureRM.NetCore.Preview (PowerShell Module)](https://www.powershellgallery.com/packages/AzureRM.NetCore.Preview/0.3.4) |        0.3.4 |


## 前提 ：
[公式](https://github.com/PowerShell/PowerShell/blob/master/docs/installation/linux.md#macos-1011) や [こちらのエントリー](http://dev.classmethod.jp/server-side/powershell-macosx/)などを参考に、PowerShellをMacにインストールしてください。

正常にインストールされると shell から powershell コマンドが使えるようになります。

```bash
$ which powershell
/usr/local/bin/powershell
```



## やりたいこと ：

Azure を スクリプトで操作したいと考えました。先々、Windowsクライアントで管理するため PowerShell でやれたらいいなと。

検索したら、MSさんから公式ライブラリも提供あり。

* PowerShell Gallary > Azure 3.3.0
 * Microsoft Azure PowerShell - Service Management
 * https://www.powershellgallery.com/packages/Azure/3.3.0

が、こちらの Module で Mac はサポートされてないことがインストールして判明。Macがというか .NetCore での動作がサポートされていないというのが正確みたい。確かに Tag 打たれてないわ。

で[探した結果](https://www.powershellgallery.com/items?q=Tags%3A%22Mac%22)、こっちなればいける。Tag にも Mac ってあるし （もちろん Linux も）。
[GitHub にも説明あった](https://github.com/PowerShell/PowerShell/tree/master/demos/Azure)


* PowerShell Gallary > AzureRM.NetCore.Preview 0.3.4
 * [PowerShell Core Edition] Azure Resource Manager Module
 * https://www.powershellgallery.com/packages/AzureRM.NetCore.Preview/0.3.4

それで、ここにあるってことは、PowerShellからも取得できるよね？と、やってみた（のが、本題）。


## やったこと ：

[5.0から、パッケージマネージャー Package Management（旧OneGet）が同梱](http://cartman0.hatenablog.com/entry/2016/03/20/233719#sec-PackageManagement-ready) されたということで、確認。


```powershell
PS > Get-PackageProvider

Name                     Version          DynamicOptions                         
----                     -------          --------------                         
NuGet                    2.8.5.208        Destination, ExcludeVersion, Scope, ...
PowerShellGet            1.1.2.0          PackageManagementProvider, Type, Sco...
```

標準Providerに、PowerShellGet が登録されているので、新たに登録せずにOK (PowerShellGallaryを探しにいってくれる) 。


```powershell
PS > Find-Package AzureRM.NetCore.Preview

Name                           Version          Source           Summary         
----                           -------          ------           -------         
AzureRM.NetCore.Preview        0.3.4            PSGallery        [PowerShell C...
```

ちゃんと発見！じゃあインストール。

まずは root で PowerShell を起動 （あとの Install で怒られないように）

```bash
$ sudo powershell
Password:xxxyyyzzz

PowerShell 
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS > 
```

```powershell
PS > Install-Package AzureRM.NetCore.Preview
```

依存パッケージと共にインストールされた。

```powershell
PS > Get-Package                                                                                  

Name                           Version          Source                          
----                           -------          ------                          
AzureRM.NetCore.Preview        0.3.4            https://www.powershellgallery...
AzureRM.Profile.NetCore.Pre... 0.3.4            https://www.powershellgallery...
AzureRM.Resources.NetCore.P... 0.3.4            https://www.powershellgallery...
PackageManagement              1.1.2.0          https://powershell.myget.org/...
PowerShellGet                  1.1.2.0          https://powershell.myget.org/...
```

## つかってみる :

```powershell
PS > Import-Module AzureRM.NetCore.Preview

PS > Login-AzureRmAccount
```

ブラウザあげて、デバイス認証を通す

```powershell
PS > Get-AzureRmResourceGroup                                                                     


ResourceGroupName : hogehoge
Location          : japanwest
ProvisioningState : Succeeded
Tags              : 
...
```

使えた！


あとは[公式のデモ](https://github.com/PowerShell/PowerShell/blob/master/demos/Azure/Azure-Demo.ps1)を参照するとよさげです。

Cmdlet一覧みてみるとこんな感じ

```powershell
> Get-Command -Module AzureRm*                                                                 

CommandType     Name                                               Version    Sou
                                                                              rce
-----------     ----                                               -------    ---
Alias           Login-AzureRmAccount                               0.3.4      Azu
Alias           Select-AzureRmSubscription                         0.3.4      Azu
Cmdlet          Add-AzureRmAccount                                 0.3.4      Azu
Cmdlet          Add-AzureRmEnvironment                             0.3.4      Azu
Cmdlet          Disable-AzureRmDataCollection                      0.3.4      Azu
Cmdlet          Enable-AzureRmDataCollection                       0.3.4      Azu
Cmdlet          Export-AzureRmResourceGroup                        0.3.4      Azu
Cmdlet          Find-AzureRmResource                               0.3.4      Azu
Cmdlet          Find-AzureRmResourceGroup                          0.3.4      Azu
Cmdlet          Get-AzureRmADApplication                           0.3.4      Azu
Cmdlet          Get-AzureRmADGroup                                 0.3.4      Azu
Cmdlet          Get-AzureRmADGroupMember                           0.3.4      Azu
Cmdlet          Get-AzureRmADServicePrincipal                      0.3.4      Azu
Cmdlet          Get-AzureRmADUser                                  0.3.4      Azu
Cmdlet          Get-AzureRmContext                                 0.3.4      Azu
Cmdlet          Get-AzureRmEnvironment                             0.3.4      Azu
Cmdlet          Get-AzureRmLocation                                0.3.4      Azu
Cmdlet          Get-AzureRmPolicyAssignment                        0.3.4      Azu
Cmdlet          Get-AzureRmPolicyDefinition                        0.3.4      Azu
Cmdlet          Get-AzureRmProviderFeature                         0.3.4      Azu
Cmdlet          Get-AzureRmProviderOperation                       0.3.4      Azu
Cmdlet          Get-AzureRmResource                                0.3.4      Azu
Cmdlet          Get-AzureRmResourceGroup                           0.3.4      Azu
Cmdlet          Get-AzureRmResourceGroupDeployment                 0.3.4      Azu
Cmdlet          Get-AzureRmResourceGroupDeploymentOperation        0.3.4      Azu
Cmdlet          Get-AzureRmResourceLock                            0.3.4      Azu
Cmdlet          Get-AzureRmResourceProvider                        0.3.4      Azu
Cmdlet          Get-AzureRmRoleAssignment                          0.3.4      Azu
Cmdlet          Get-AzureRmRoleDefinition                          0.3.4      Azu
Cmdlet          Get-AzureRmSubscription                            0.3.4      Azu
Cmdlet          Get-AzureRmTenant                                  0.3.4      Azu
Cmdlet          Invoke-AzureRmResourceAction                       0.3.4      Azu
Cmdlet          Move-AzureRmResource                               0.3.4      Azu
Cmdlet          New-AzureRmADApplication                           0.3.4      Azu
Cmdlet          New-AzureRmADServicePrincipal                      0.3.4      Azu
Cmdlet          New-AzureRmPolicyAssignment                        0.3.4      Azu
Cmdlet          New-AzureRmPolicyDefinition                        0.3.4      Azu
Cmdlet          New-AzureRmResource                                0.3.4      Azu
Cmdlet          New-AzureRmResourceGroup                           0.3.4      Azu
Cmdlet          New-AzureRmResourceGroupDeployment                 0.3.4      Azu
Cmdlet          New-AzureRmResourceLock                            0.3.4      Azu
Cmdlet          New-AzureRmRoleAssignment                          0.3.4      Azu
Cmdlet          New-AzureRmRoleDefinition                          0.3.4      Azu
Cmdlet          Register-AzureRmProviderFeature                    0.3.4      Azu
Cmdlet          Register-AzureRmResourceProvider                   0.3.4      Azu
Cmdlet          Remove-AzureRmADApplication                        0.3.4      Azu
Cmdlet          Remove-AzureRmADServicePrincipal                   0.3.4      Azu
Cmdlet          Remove-AzureRmEnvironment                          0.3.4      Azu
Cmdlet          Remove-AzureRmPolicyAssignment                     0.3.4      Azu
Cmdlet          Remove-AzureRmPolicyDefinition                     0.3.4      Azu
Cmdlet          Remove-AzureRmResource                             0.3.4      Azu
Cmdlet          Remove-AzureRmResourceGroup                        0.3.4      Azu
Cmdlet          Remove-AzureRmResourceGroupDeployment              0.3.4      Azu
Cmdlet          Remove-AzureRmResourceLock                         0.3.4      Azu
Cmdlet          Remove-AzureRmRoleAssignment                       0.3.4      Azu
Cmdlet          Remove-AzureRmRoleDefinition                       0.3.4      Azu
Cmdlet          Save-AzureRmProfile                                0.3.4      Azu
Cmdlet          Save-AzureRmResourceGroupDeploymentTemplate        0.3.4      Azu
Cmdlet          Select-AzureRmProfile                              0.3.4      Azu
Cmdlet          Set-AzureRmContext                                 0.3.4      Azu
Cmdlet          Set-AzureRmEnvironment                             0.3.4      Azu
Cmdlet          Set-AzureRmPolicyAssignment                        0.3.4      Azu
Cmdlet          Set-AzureRmPolicyDefinition                        0.3.4      Azu
Cmdlet          Set-AzureRmResource                                0.3.4      Azu
Cmdlet          Set-AzureRmResourceGroup                           0.3.4      Azu
Cmdlet          Set-AzureRmResourceLock                            0.3.4      Azu
Cmdlet          Set-AzureRmRoleDefinition                          0.3.4      Azu
Cmdlet          Stop-AzureRmResourceGroupDeployment                0.3.4      Azu
Cmdlet          Test-AzureRmResourceGroupDeployment                0.3.4      Azu
Cmdlet          Unregister-AzureRmResourceProvider                 0.3.4      Azu
```


## ちなみに :

Azure Module をいれても、Import-Moduleのところで落ちます

```powershell
Import-Module : The given assembly name or codebase was invalid. (Exception from 
HRESULT: 0x80131047)
At line:1 char:1
+ Import-Module Azure
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Import-Module], FileLoadExcepti 
   on
    + FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.C 
   ommands.ImportModuleCommand
```

[こちら](https://github.com/PowerShell/PowerShell/issues/2526) の情報をもとに、.NetCore.Preview に行き着きました。

プラットフォーム自身の依存関係、PackageManagerで解決してくれるようになったら最強だなぁ。


## 感想 :

これまで VM 上のWin であれこれやってたけど、Windows本体を管理するケース以外は、このような使い方が広まるのかも。.NetCore と .Net本体との差分がどれだけあるかは知らないので、.NetCore側のモジュールが追いつくには、しばらく先の話かも。

PowerShell のコマンドは、慣れてくるとCmdletの命名規則も一環してたりと結構好きです。


## その他 :

Mac特有の情報は、公式がまとまっていていいと思いました。
* [Package installation instructions > MacOS 10.11](https://github.com/PowerShell/PowerShell/blob/master/docs/installation/linux.md#macos-1011)

6.0-alpha-14.0 では Get-Snapin が使えない事が、別の操作でわかりました。なんでもかんでもサポートってわけには、まだ行きませんね（プラットフォーム違うのだから当たり前）

* [Windowsプラットフォーム以外での Known Issue](https://github.com/PowerShell/PowerShell/blob/master/docs/KNOWNISSUES.md)