Chef を使って Azure に仮想マシンをデプロイする(ARM) 

※2017/9/12現在の記事です。

#:one:ドキュメント
以下の knife の Azure プラグインの公式ドキュメントは必ず目を通します。
chef/knife-azure: Chef knife plug-in for Microsoft Azure
https://github.com/chef/knife-azure

#:two:手順
## ■ Azure AD のサービスプリンシパルの設定
### 1. アプリの登録
Chef クライアントがユーザーの代わりにアクセスするためのサービスプリンシパルを登録します。
Azure Active Directory のメニューから、[アプリの登録] - [+アプリケーションの登録]でアプリケーションを登録します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132347/f935fcf8-7626-0cc2-f3a9-26a7f99a14e0.png)

- 名前
    - 任意の名前
- アプリケーションの種類
    - 既定のまま
- サインオン URL
    - http://localhost/

### 2. クライアント ID と シークレットキーの取得
作成したアプリケーションに移動し、[キー]メニューから、新しいキーを作成します。
<font color="red">**※作成したキーは、メニューから移動すると消えるためメモしておきます。**</font>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132347/69e4c06b-80aa-6e3c-e3e5-476c215ff5b2.png)

また、アプリケーション ID も併せてメモしておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132347/198f5382-2cb2-6c1c-bf10-f8079edeffbd.png)


### 3. 権限の割り当て
Chef クライアントからサブスクリプションにアクセスできるように、権限を割り当てます。
[サブスクリプション]の画面から登録したアプリケーションを所有者として割り当てます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132347/f384b210-2860-5ecf-e234-6d69ab493631.png)

##■  Chef Development Kit のインストール
### 1. ダウンロード
https://downloads.chef.io/chefdk

Windows の場合は、MSIを実行します。
<font color="red">
**※最新版は、knife-azureが動かない(listen のバージョンが、3.1.5と3.0.6でconflictする)ため、古いバージョン(1.6.1等)をインストールします。
※Linux版・Windows版ともに同じです。**</font>

### 2. knife-azure のインストール
コマンドプロンプト もしくは PowerShell を開き、knife の Azure 用モジュールをインストールします。

```
chef gem install knife-azure
```

##■ Starter Kit のダウンロードと knife.rb の編集
### 1. Chef のポータルからStarter Kitをダウンロード
管理用の設定ファイルや公開鍵をダウンロードします。

ポータル: https://manage.chef.io/organizations/[組織名]/getting_started
※組織名は読み替えます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132347/1cc59a98-21af-69d1-0bd4-f8dffdee0c1b.png)

### 2. knife.rb の編集
ダウンロードした Starter Kit を展開すると、.chef フォルダーに、knife.rb が入っています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132347/772adbd3-6fa2-1437-c93e-585fef565aa2.png)

中身を開いて、以下を追加します。

```Ruby:
knife[:azure_subscription_id] = "33325c7f-089d-493b-9ad9-1400a8da5394"
knife[:azure_tenant_id] = "72f988bf-86f1-41af-91ab-2d7cd011db47"
knife[:azure_client_id] = "<クライアント ID>"
knife[:azure_client_secret] = "<シークレットキー>"
```

ファイルの全体

```Ruby:knife.rb
# See http://docs.chef.io/config_rb_knife.html for more information on knife configuration options

current_dir = File.dirname(__FILE__)
log_level                :info
log_location             STDOUT
node_name                "tsunomur"
client_key               "#{current_dir}/tsunomur.pem"
chef_server_url          "https://api.chef.io/organizations/tsunomurit"
cookbook_path            ["#{current_dir}/../cookbooks"]
knife[:azure_subscription_id] = "33325c7f-089d-493b-9ad9-1400a8da5394"
knife[:azure_tenant_id] = "72f988bf-86f1-41af-91ab-2d7cd011db47"
knife[:azure_client_id] = "<クライアント ID>"
knife[:azure_client_secret] = "<シークレットキー>"
```

## Cookbook の作成
以下ドキュメントの[Cookbook の作成] から [Chef サーバーに Cookbook をアップロードする]を参考にします。
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/chef-automation#creating-a-cookbook

## ■ Azure へデプロイ
Starter Kit を展開したフォルダーでコマンドを実行します。

### サーバーの一覧
```
knife azurerm server list
```

### サーバーの展開
### 【Windows】
```:実行例
knife azurerm server create  --azure-resource-group-name 20170912_chefvm4  --azure-vm-name tsnrvm04 --azure-service-location 'westus'  --azure-image-reference-publisher 'MicrosoftWindowsServer'  --azure-image-reference-offer 'WindowsServer'  --azure-image-reference-sku '2012-R2-Datacenter'  --azure-image-reference-version 'latest'  -x azureuser -P 1qazXSW2!  -r "recipe[webserver]"  -N "tsnrvm04"
```

-N オプションは、Chef に登録される Node です。組織内で重複は許されないため、ユニークなものを設定します(仮想マシン名と合わせると便利です)。
指定しないと、以下のようなエラーが出ます。

```
Node  exists, overwrite it? (Y/N) y
ERROR: 405 "Method Not Allowed"
ERROR: Something went wrong. Please use -VV option for more details.
```

```:結果
C:\chef>knife azurerm server create  --azure-resource-group-name 20170912_chefvm  --azure-vm-name tsnrvm01 --azure-service-location 'westus'  --azure-image-reference-publisher 'MicrosoftWindowsServer'  --azure-image-reference-offer 'WindowsServer'  --azure-image-reference-sku '2012-R2-Datacenter'  --azure-image-reference-version 'latest'  -x azureuser -P 1qazXSW2!  -r "recipe[cbk1::rec2]"  -c ./knife.rb  -N tsunomurcf4
WARN: Azurerm subcommands are experimental and of alpha quality. Not suitable for production use. Please use ASM subcommands for production.
WARN: Azurerm subcommands are experimental and of alpha quality. Not suitable for production use. Please use ASM subcommands for production.
Creating new client for tsunomurcf4
Creating new node for tsunomurcf4
INFO:Resource Group 20170912_chefvm already exist. Skipping its creation.
INFO:Adding new VM tsnrvm01 to this resource group.
Creating Virtual Machine....
Virtual Machine creation successfull.
Deployment name is: tsnrvm01_deploy
Deployment ID is: /subscriptions/33325c7f-089d-493b-9ad9-1400a8da5394/resourceGroups/20170912_chefvm/providers/Microsoft.Resources/deployments/tsnrvm01_deploy
VM Details ...
-------------------------------
Virtual Machine name is: tsnrvm01
Virtual Machine ID is: /subscriptions/33325c7f-089d-493b-9ad9-1400a8da5394/resourceGroups/20170912_chefvm/providers/Microsoft.Compute/virtualMachines/tsnrvm01
Server Name                         tsnrvm01
Size                                Standard_A1
Provisioning State                  Succeeded
Location                            westus
Publisher                           MicrosoftWindowsServer
Offer                               WindowsServer
Sku                                 2012-R2-Datacenter
Version                             latest
OS Type                             Windows
Public IP address                   13.88.13.25
FQDN                                tsnrvm01.westus.cloudapp.azure.com
```

## ■展開後の確認
### 仮想マシンの拡張
拡張を確認すると、Chef クライアントがインストールされています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132347/a2ebb9bb-cdb2-dba7-3ac0-3bbfe81776f4.png)

### 【Windows】
#### C:ドライブにchefフォルダが作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132347/3dfa6598-54cb-b8c7-ff93-e5a8487cf1da.png)


#### レシピの適用
chef-client.bat を実行するとレシピが適用されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132347/ed6cb146-4cbe-8366-59ca-63a1f5835fb2.png)
#### 注意
なぜか、client.rb の node_name の末尾に 0 が付与されているため要編集です。
※設定が間違っている可能性もあり

```Ruby:client.rb
chef_server_url 	 "https://api.chef.io/organizations/tsunomurit"
validation_client_name	"chef-validator"
log_level        :info
file_cache_path   'c:/chef/cache'
file_backup_path  'c:/chef/backup'
cache_options     ({:path => 'c:/chef/cache/checksums', :skip_expires => true})
node_name 'tsunomurcf40' <----------------------------- ここ
verify_api_cert 
trusted_certs_dir       "c:/chef/trusted_certs"
log_location       'C:\WindowsAzure\Logs\Plugins\Chef.Bootstrap.WindowsAzure.ChefClient\1210.12.109.1005/chef-client.log'
chef_server_url       'https://api.chef.io/organizations/tsunomurit'
validation_client_name       'chef-validator'
client_key      'c:/chef/client.pem'
validation_key      'c:/chef/validation.pem'
# Add support to use chef Handlers for heartbeat and
# status reporting to Azure
require "chef/azure/chefhandlers/start_handler"
require "chef/azure/chefhandlers/report_handler"
require "chef/azure/chefhandlers/exception_handler"

start_handlers << AzureExtension::StartHandler.new("C:/Packages/Plugins/Chef.Bootstrap.WindowsAzure.ChefClient/1210.12.109.1005")
report_handlers << AzureExtension::ReportHandler.new("C:/Packages/Plugins/Chef.Bootstrap.WindowsAzure.ChefClient/1210.12.109.1005")
exception_handlers << AzureExtension::ExceptionHandler.new("C:/Packages/Plugins/Chef.Bootstrap.WindowsAzure.ChefClient/1210.12.109.1005")
```

#### Hosted Chef のダッシュボードから確認
IPアドレスや Uptime が入っています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132347/53ba011e-1af6-e4da-5733-2951066decf4.png)


# :three: 参考
chef/knife-azure: Chef knife plug-in for Microsoft Azure
https://github.com/chef/knife-azure
https://github.com/chef/knife-azure/blob/master/docs/ARM.md

Chef による Azure 仮想マシンのデプロイ | Microsoft Docs
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/chef-automation

chef-client — Chef Docs
※chef-client の実行からサーバーへの適用までの動作が書かれています。
https://docs.chef.io/chef_client.html#the-chef-client-title-run

chef-partners/azure-chef-extension: The development repository for the Chef Extension available through Azure
※Azure の Chef 拡張のリポジトリです
https://github.com/chef-partners/azure-chef-extension