Azure DevOps Pipelinesを使ってAzure Windows VMへReposの資産を配置する(Windows VMSS編)

Azure仮想マシンスケールセットエージェント(Windows)を使って、PowerShellやバッチファイル等の資産をWindows Serverに配置するということをやってみたいと思います。

# 前提
* Azure DevOps OrganizationとProject作成済み
* Azure Repos作成済み

# Windows VMSS作成
* オーケストレーションモードは[均一]にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/73f8b2da-59b6-d866-4352-f70aced8f70d.png)

* イメージは[Windows Server 2019 Datacenter - x64 Gen2]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d5c7824f-88e8-b21f-81ba-0512fad8179f.png)

* VMSS配置先の仮想ネットワークを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/83e194f2-ad24-c61e-61f1-63db4d868ed8.png)

* 配置先サブネットを変更したい場合は、下の図の編集ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/606e00d0-2e2c-1f8e-314c-f85ac0228385.png)

* 初期インスタンス数はここでは2にします。（あとでDevOps側で調整します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/15146b08-4a2e-c905-546f-77789035593e.png)

* スケーリングポリシーは[Manual scaling]にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/6141e9ed-af94-a62a-1c49-810bd063e6dd.png)

* スケールインポリシーはデフォルトにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/13450534-2bc6-0a49-4e41-30aceeb56a6e.png)

* 管理項目、正常性項目、詳細項目はすべてデフォルトにして作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/98f7356f-ba22-2536-b0b3-7935a86e7a7e.png)

# Service Principal Service Connection作成
* 既に存在している場合は作成不要です。Azure DevOpsのProject Settingsから[Service connections]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/28c02bfb-7226-ff3d-1189-8f1700b931b8.png)

* [New service connection]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/699f4954-e33b-111a-70e8-469aab88f12d.png)

* [Azure Resource Manager]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/bae490e4-75c7-3a76-cdce-a84311f1e147.png)

* [Service principal (automatic)]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/93500e54-ddca-6c95-df23-c34e7b6e5c9f.png)

* [Subscription]を選択、[Service connection name]を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/e5ef0cf4-6aed-39b1-2266-54379a0cebc8.png)

# Agent pools作成
* Azure DevOpsのProject Settingsから[Agent pools]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d2365f72-e916-6119-926e-07adbcc70a00.png)

* [Add pool]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/5f486450-01c7-516f-d0c4-aa0b265874c3.png)

* Pool typeに[Azure virtual machine scale set]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/3b093f90-a323-ee2c-da24-accb34fcb333.png)

* 先ほど作成したService Principal Service Connectionを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d37580c9-1575-82e1-b4c2-198f76f9cec2.png)

* 先ほど作成したWindows VMSSを選択し、Pool名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/6a1bb583-5d3e-5c2d-ce98-89a593474d7e.png)

* Pool optionsは要件に合わせて設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/9923e2b6-9c8d-5b78-25da-dd1d22215cc0.png)

# Library作成
* PipelinesのLibraryを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7ec07690-a6e8-3fc2-56b6-be6dba43d442.png)

* [+ Variable group]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/652d2cb1-232e-2019-425a-044b555ac1ef.png)

* [+ Add]を選択します。（Key Vaultからシークレットを取ってくることもできます。Key Vault使った方がより安全ですね）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/275b08f4-2801-d6c9-ab3d-7701df4dbdef.png)

* デプロイ先のWindows OSのログインユーザーとパスワードを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/bedd50a2-ccd2-4597-988d-e9543d5492d3.png)

# Pipelines作成
* azure-pipelines.ymlを以下のように構成します。

```yaml
trigger:
- main
- dev

variables:
  - group: OS_Variables
  - name: targetVM
    ${{ if eq(variables['Build.SourceBranchName'], 'main') }}:
      value: "192.168.0.4"
    ${{ if eq(variables['Build.SourceBranchName'], 'dev') }}:
      value: "192.168.0.5"

pool:
  name: vmss-win

steps:
- task: WindowsMachineFileCopy@2
  inputs:
    SourcePath: $(Build.SourcesDirectory)
    MachineNames: $(targetVM)
    AdminUserName: $(userVariable)
    AdminPassword: $(passwordVariable)
    TargetPath: 'C:\test'
```

* 今回main,devの2つブランチがあり、それぞれ異なる環境のVMにコピーすることを想定しています。
* コピー先のVMのIPアドレスはブランチ名を判断してtargetVM変数に格納しています。
* この状態でパイプラインを実行し、C:¥testフォルダーにReposの資産が配置されていれば完了です。

以上