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

  • 0
    Like
  • 0
    Comment

    ※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