Azure
chef
AzureResourceManager

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

More than 1 year has passed since last update.

※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

  • 名前
    • 任意の名前
  • アプリケーションの種類
    • 既定のまま
  • サインオン URL

2. クライアント ID と シークレットキーの取得

作成したアプリケーションに移動し、[キー]メニューから、新しいキーを作成します。
※作成したキーは、メニューから移動すると消えるためメモしておきます。
image.png

また、アプリケーション ID も併せてメモしておきます。
image.png

3. 権限の割り当て

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

image.png

■ Chef Development Kit のインストール

1. ダウンロード

https://downloads.chef.io/chefdk

Windows の場合は、MSIを実行します。

※最新版は、knife-azureが動かない(listen のバージョンが、3.1.5と3.0.6でconflictする)ため、古いバージョン(1.6.1等)をインストールします。
※Linux版・Windows版ともに同じです。

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

2. knife.rb の編集

ダウンロードした Starter Kit を展開すると、.chef フォルダーに、knife.rb が入っています。
image.png

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

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] = "<シークレットキー>"

ファイルの全体

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

【Windows】

C:ドライブにchefフォルダが作成

image.png

レシピの適用

chef-client.bat を実行するとレシピが適用されます。
image.png

注意

なぜか、client.rb の node_name の末尾に 0 が付与されているため要編集です。
※設定が間違っている可能性もあり

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

: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