Check! Azure CLI 2.0 Preview を Bash on Windows にインストールする（のトラブルシューティング）

こんばんは、 @dz_ こと大平かづみです。

Prologue - はじめに
====
[Azure CLI 2.0 (Preview)](https://github.com/azure/azure-cli "Azure/azure-cli: Command-line tools for Azure.") を導入しようと思います！

前までは Node.js 製でしたが、今回からは python に切り替わったようです。一通りの OS で利用可能で、それぞれのインストール方法は「[Instructions per Platform and Version | Preview Install Guide | Azure CLI 2.0](https://github.com/Azure/azure-cli/blob/master/doc/preview_install_guide.md "Instructions per Platform and Version | Preview Install Guide | Azure CLI 2.0")」で紹介されています。

さて、私は愛機 Surface の Ubuntu on Bash on Windows に導入しますよ、っと始めたところで… 依存パッケージがインストールできない(´･ω･`) 試行錯誤の末、解決できたので共有します。

※ もしかすると、単に自分の環境が壊れていただけかもしれません… が、もしどなたかが類似のエラーでつまづいたときに参考になるよう、書き留めておきます。

Bash On Windows に Azure CLI 2.0 をインストールする
====

Bash on Windows は Ubuntu 14.04 と同様に、いくつか依存パッケージをインストールします。

- [Ubuntu 14.04 LTS and BASH on Windows | Instructions per Platform and Version](https://github.com/Azure/azure-cli/blob/master/doc/preview_install_guide.md#ubuntu-1404-lts-and-bash-on-windows-build-14362 "Ubuntu 14.04 LTS and BASH on Windows (Build 14362+) | Instructions per Platform and Version")

```bash:インストール手順の抜粋
$ sudo apt-get update
$ sudo apt-get install -y libssl-dev libffi-dev
$ sudo apt-get install -y python-dev
$ curl -L https://aka.ms/InstallAzureCli | sudo bash
```

まずは `apt-get update` をして、次へ～

だがしかし、依存モジュール `libssl-dev` がインストールできない
----
### エラー現象

この `libssl-dev` が以下のエラーでインストールできず…

```bash
$ sudo apt-get install libssl-dev

パッケージリストを読み込んでいます... 完了0%
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の問題を解決するために 'apt-get -f install' を実行する必要があるかもしれません:
以下のパッケージには満たせない依存関係があります:
 code : 依存: libnotify4 しかし、インストールされようとしていません
        依存: libnss3 しかし、インストールされようとしていません
 libssl-dev : 依存: libssl1.0.0 (= 1.0.1f-1ubuntu2.21) しかし、1.0.1f-1ubuntu2.18 はインストールされようとしています
              依存: zlib1g-dev しかし、インストールされようとしていません
              推奨: libssl-doc しかし、インストールされようとしていません
E: 未解決の依存関係です。'apt-get -f install' を実行してみてください (または解法を明示してください)。
```

インストール済みのパッケージを確認してみると、どうやら、 `libssl1.0.0` が古いようで？

```bash
$ dpkg -l | grep ssl

ii  libgnutls-openssl27:amd64        2.12.23-12ubuntu2.5              amd64        GNU TLS library - OpenSSL wrapper
ii  libssl1.0.0:amd64                1.0.1f-1ubuntu2.18               amd64        Secure Sockets Layer toolkit - shared libraries
ii  openssl                          1.0.1f-1ubuntu2.18               amd64        Secure Sockets Layer toolkit - cryptographic utility
ii  python-openssl                   0.13-2ubuntu6                    amd64        Python 2 wrapper around the OpenSSL library
```
### 解決！

`libssl1.0.0` を `upgrade` したら解決しました！

もしかすると gdk 周りでインストールが失敗するかもしれませんので、 `-f` を付けました。

```bash
$ sudo apt-get -f upgrade libssl1.0.0

パッケージリストを読み込んでいます... 完了0%
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
依存関係を解決しています ... 完了
アップグレードパッケージを検出しています ... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libice6 libsm6 libxmu6 libxt6 os-prober rlwrap
これを削除するには 'apt-get autoremove' を利用してください。
以下のパッケージが新たにインストールされます:
  acl at-spi2-core colord dconf-gsettings-backend dconf-service fontconfig
  fontconfig-config fonts-dejavu-core hicolor-icon-theme libasound2
  libasound2-data libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data libatspi2.0-0
  libavahi-client3 libavahi-common-data libavahi-common3 libcairo-gobject2
  libcairo2 libcanberra-gtk3-0 libcanberra-gtk3-module libcanberra0 libcolord1
  libcolorhug1 libcups2 libdatrie1 libdconf1 libexif12 libfontconfig1 libgd3
  libgdk-pixbuf2.0-0 libgdk-pixbuf2.0-common libgphoto2-6 libgphoto2-l10n
  libgphoto2-port10 libgraphite2-3 libgtk-3-0 libgtk-3-bin libgtk-3-common
  libgudev-1.0-0 libgusb2 libharfbuzz0b libieee1284-3 libjasper1 libjbig0
  libjpeg-turbo8 libjpeg8 liblcms2-2 libltdl7 libnotify4 libnspr4 libnss3
  libnss3-nssdb libogg0 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0
  libpixman-1-0 libsane libsane-common libtdb1 libthai-data libthai0 libtiff5
  libv4l-0 libv4lconvert0 libvorbis0a libvorbisfile3 libvpx1
  libwayland-client0 libwayland-cursor0 libxcb-render0 libxcb-shm0
  libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxi6 libxinerama1
  libxkbcommon0 libxpm4 libxrandr2 libxrender1 libxtst6 notification-daemon
  sound-theme-freedesktop
以下のパッケージはアップグレードされます:
  apport apt apt-transport-https apt-utils base-files bash-completion
  bind9-host cloud-init curl dbus dnsutils dosfstools dpkg gcc-4.8-base gnupg
  gpgv initramfs-tools initramfs-tools-bin isc-dhcp-client isc-dhcp-common
  klibc-utils libapt-inst1.5 libapt-pkg4.12 libbind9-90 libc-bin libc6
  libcurl3 libcurl3-gnutls libdbus-1-3 libdns100 libdrm2 libexpat1 libgcrypt11
  libidn11 libisc95 libisccc90 libisccfg90 libklibc libldap-2.4-2 liblwres90
  libpam-systemd libpcre3 libpython3.4-minimal libpython3.4-stdlib libssl1.0.0
  libstdc++6 libsystemd-daemon0 libsystemd-login0 libtasn1-6 libudev1 libxml2
  lsb-base lsb-release multiarch-support nodejs ntpdate openssh-client
  openssh-server openssh-sftp-server openssl pollinate python3-apport
  python3-problem-report python3-update-manager python3.4 python3.4-minimal
  sudo systemd-services tzdata udev update-manager-core update-notifier-common
  wget
アップグレード: 73 個、新規インストール: 87 個、削除: 0 個、保留: 0 個。
1 個のパッケージが完全にインストールまたは削除されていません。
47.6 MB のアーカイブを取得する必要があります。
この操作後に追加で 55.6 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://archive.ubuntu.com/ubuntu/ trusty-updates/main libc-bin amd64 2.19-0ubuntu6.9 [1,165 kB]
取得:2 http://archive.ubuntu.com/ubuntu/ trusty-updates/main libc6 amd64 2.19-0ubuntu6.9 [4,717 kB]
7% [2 libc6 2,040 kB/4,717 kB 43%]                         84.9 kB/s 8分 42秒
9% [2 libc6 3,204 kB/4,717 kB 68%]                        70.1 kB/s 10分 16秒

... <略> ...
```

### 備考

なお、私の場合は途中で以下のエラーが出ました。

```bash
... <略> ...

dpkg: アーカイブ /var/cache/apt/archives/openssh-server_1%3a6.6p1-2ubuntu2.8_amd64.deb の処理中にエラーが発生しました (--unpack):
 '/usr/sbin/sshd.dpkg-new' をオープンできません: 許可がありません
dmesg: klogctl failed: 関数は実装されていません
                                   initctl: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: 接続を拒否されました
runlevel:/var/run/utmp: そのようなファイルやディレクトリはありません
invoke-rc.d: policy-rc.d denied execution of restart.
.../openssh-client_1%3a6.6p1-2ubuntu2.8_amd64.deb を展開する準備をしています ...
openssh-client (1:6.6p1-2ubuntu2.8) で (1:6.6p1-2ubuntu2.6 に) 上書き展開しています ...
.../openssl_1.0.1f-1ubuntu2.21_amd64.deb を展開する準備をしています ...
openssl (1.0.1f-1ubuntu2.21) で (1.0.1f-1ubuntu2.18 に) 上書き展開しています ...
.../wget_1.15-1ubuntu1.14.04.2_amd64.deb を展開する準備をしています ...
wget (1.15-1ubuntu1.14.04.2) で (1.15-1ubuntu1.14.04.1 に) 上書き展開しています ...

... <略> ...

処理中にエラーが発生しました:
 /var/cache/apt/archives/openssh-server_1%3a6.6p1-2ubuntu2.8_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

パーミッションエラーっぽいですね、処理が長すぎて途中で sudo のキャッシュ？が切れてしまったのかもしれません。再度同コマンドを流すことで、インストールを完了することができました。

いざ、Azure CLI 2.0 をインストール！
----

上記で `libssl-dev` がインストールできました。残りの依存パッケージをインストールし、いざ！

### 依存パッケージ

- `libssl-dev` (上記でインストール済み)
- `libffi-dev`
- `python-dev`

### Azure CLI 2.0 自体のインストール

```bash
$ curl -L https://aka.ms/InstallAzureCli | sudo bash

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   167  100   167    0     0    157      0  0:00:01  0:00:01 --:--:--   157
100  1048  100  1048    0     0    427      0  0:00:02  0:00:02 --:--:--  1151
Downloading Azure CLI install script from https://azurecliprod.blob.core.windows.net/install.py to /tmp/azure_cli_install_tmp_sFPN.
######################################################################## 100.0%
Running install script.
In what directory would you like to place the install? (leave blank to use /usr/local/az):
We will install at '/usr/local/az'.
In what directory would you like to place the executable? (leave blank to use /usr/local/bin):
The executable will be in '/usr/local/bin'.

... <略> ...

Installation successful.
Enable shell/tab completion? [y/N]: y
Modifying '/home/user/.bashrc' to enable tab completion.
Backed up '/home/user/.bashrc' to '/home/user/.bashrc.backup'
Tab completion set up complete.
** Run `exec -l $SHELL` to restart your shell. **
If tab completion is not activated, verify that '/home/user/.bashrc' is sourced by your shell.
Run the CLI with /usr/local/bin/az --help
```

最後にシェルを再起動してね、とのことで、えいやっ！

```bash
$ exec -l $SHELL
```

おおーー、 `az` コマンドが使えるようになり、タブ補完でサブコマンドが表示されるようになりましたー！ヾ(o´∀｀o)ﾉ

Epilogue - おわりに
====
これでより便利に Azure を使えるぞ！

そして、当初の目的だった Azure Container Service の Kubernetes を起動するぞ～ (\*ﾉωﾉ)