kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Packerで独自のAzure DevOpsビルドエージェントを作る

Microsoftが提供するMicrosoft hostedエージェントは便利なのですが、性能(2コア)やディスクが足りない(上限10GB)、などの理由で独自エージェントを立てたいという理由はよくあります。

OSに一からVSなどを入れるのは少々めんどくさいです。そんなときのためにMicrosoftからMicrosoft Hosted agentと同じエージェントを作るための仕組みが提供されています。

github.com

PowerShell DSCではなく、Packerで作ります。LinuxやmacOSもサポートしないといけないからでしょう。

GitHubのリリースのページから作りたいイメージをダウンロードします…といっても、同じバージョン(M150等)であれば、どれを選んでも中身は一緒です。レポジトリをgit cloneして固めてるだけなので。

今回はVS2019 on Windows Server 2019を選びます。

  • 展開したファイルのazure-pipelines-image-generation-vs2019-150.1\images\winフォルダを開きます。
  • vs2019-Server2019-Azure.json というファイルがテンプレートファイルです。このファイルから一か所変更します。
  "install_password": null

となっています。ここもほかの値と同様に外だしの変数として取得するようにします。

  "install_password":  "{{env `ARM_PASSWORD`}}"

次にPackerで使用するclient_id, client_secret, subscription_id, tenant_id, object_idを取得します。とはいっても難しいことはなくて、Azureのドキュメントで解説されているので、ここにあるPowerShellスクリプトを動かすだけです。

docs.microsoft.com

Visual Studio 2017を入れてしまっている人は、アプリと機能から"Microsoft Azure PowerShell - April 2018"を削除して、AZモジュールを使ってください。ドキュメントは今Azモジュール前提で書かれています。

  • Connect-AzAccount
  • リソースグループ作成
  • 資格情報の作成

ここまでは上のドキュメントにも載っています。次、このスクリプトを実行するためにはリソースグループと同じリージョンにストレージアカウントが必要です。PackerそのものはManaged Diskをサポートしているようですが、このAzure DevOpsエージェントを作るjsonはストレージアカウント前提です。

この辺の値が取れたら、必要な値を別のjsonに書いて、packerを実行します。

{
   "client_id": "ないしょ",
   "client_secret": "ないしょ",
   "tenant_id": "ないしょ",
   "subscription_id": "ないしょ",
   "object_id": "ないしょ",
   "location": "Japan East",
   "resource_group": "リソースグループ名",
   "storage_account": "ストレージアカウント名",
   "install_password": "パスワード"
}
packer  build -var-file=作ったjson vs2019-Server2019-Azure.json

これでひたすら待ちます。私はVSのインストールが無応答状態になって、結局諦めたんですが、たぶんこのjsonをそのまま使ったら少なくとも6-7時間はかかると思います。サーバーなどの起動しっぱなしマシンでやるのがいいと思います。

このテンプレートから必要ない古いコンポーネントを削除するとか、逆に必要なDockerイメージをキャッシュしておくとか、カスタマイズはいろいろできると思います。

一度ゴールデンイメージができたら、あとはsysprep済みのVMイメージがストレージアカウントに入っているので、VMとして起動するとか、もしくはダウンロードしてローカルのHyper-Vにマウントしてしまうとか、いろいろ方法はあると思います。

TFSUGのSlack参加ワークフローを支えるFlow

はじめに

tfsug.hatenablog.jp

要望があって、TFSUGのSlackを用意しました。無料版なので、一定期間で読めなくなりますが、よければ参加してください。

参加は無制限ではなく、申請方式にしています。Formsで氏名とメールアドレスをもらったら手動で招待しています。だいたい2営業日程度で招待処理しています。

使ったもの

  • Microsoft Forms
  • OneDrive for Business
  • Microsoft Flow(Office 365)
  • Slack

Excelを用意

f:id:kkamegawa:20190120152412p:plain

まず、格納するためのExcelをSharePoint Onlineに用意します。Logic Appsではなく、Flowを使っているのは頻度が高くないことと、Logic AppsだとOffice 365とAzureが同一Azure ADで提供されていないとアクセスできないためです。

f:id:kkamegawa:20190120152410p:plain

Excelではテーブルを作成しないと Flowで認識できないので、必須です。ヘッダ部分の列を選択して、テーブルとして作成します。

f:id:kkamegawa:20190120152448p:plain

テーブルが作成できました。これで準備完了です。

Forms

f:id:kkamegawa:20190120152416p:plain

こんな感じのFormを用意します。Excelと併用しているのはFormsの回答を閲覧できるのは同一Office 365組織内の人だけだからです。

Flow

こんな感じでFlowを作りました。

f:id:kkamegawa:20190120152419p:plain

アンケートが作成されたとき、アンケートに対して、一行Excelに作成します。

f:id:kkamegawa:20190120152423p:plain

最後に私と@changeworldさんに「作成された」ということをメールで通知します。この時のメールにはExcelのURLのみ書かれており、氏名やメールアドレスは含んでいません。やろうと思えばできますが、めんどくさいのと、メールにかかれると嫌だろうということもあります。

アンケート回答は1人で複数作れるからか、Apply to eachで回答ごとに作ることになるんですね。

最後にSlackの管理者用チャンネルに「リクエストがあった」というメッセージをポストします。これはどちらでもいいのですが、作業完了のチェックもメッセージにつけられるので、便利ですね。一応Excel内にもあるんですが。

終わりに

せっかくあるものなので、Flowでつくってみましたが、試行錯誤するものの、コーディングレスでこういうことができるので、結構便利です。

今はTwitterに流しているAzure DevOps関係の情報も自動的にSlackに流すようにしていますので、よければ参加してみてください。

今どきのAzure Stack on Azureの作り方

諸事情あって、Azure上にAzure Stackを作っています。検索すれば上のほうにでてくる世界のやまさのエントリーがあるのですが、私がこれをやってもDSCを構築するところで失敗しました。検索しても事例がいくつかあるものの、ASDKはサポート外なので、MSDN Forumで知ってる人の答えをもらうしかないようです。

blog.nnasaki.com

書かれていないものの、今までやってた方はAzure ADでやっていたのでしょうか?私はサブスクリプションの都合でADFSで構築しています(Azure ADだと構築時一時的に全体管理者が必要になるため)。

困ったなーと思っていたら、今どきはこんなARMテンプレートを用意してくれている人がいました。プロフィールを見ると、MSトルコのSeniorプレミアフィールドエンジニアの方のようです。

github.com

このテンプレートでデプロイするとManaged DiskをPremium SSDで構築してくれます。評価環境ならforkしてStandard SSDに書き換えたほうがいいでしょう。お金があるなら別ですが。

デプロイすると、デスクトップにPowerShellのアイコンが4つできているはずです。Install Azure ADかInstall ADFSかどちらかクリックするとデプロイが始まります。

1時間ちょっとすると、たぶん再起動がかかります。ここから先はCloudAdminアカウントで接続するのは同じですね。あとはひたすら待ちます。E16インスタンスでは4時間かかっても終わりませんでした。放置しているので、そのうちできるでしょう、たぶん。

github.com

もしくはこちらのスクリプトでASDK環境を構築できるそうです。ただし、ASDK 1811.2限定。こちらはAzure StackのGlobal Black Beltの方ですね。

ASDKを作った後の最大のやっちゃいけないことは、ホストOSでシャットダウン、再起動などを実施してしまうことです。ASDK内では複数のVMが起動していて、お互い依存しています。なので、最悪起動中のVMが不整合に陥り、起動しなくなります(というか、知らない人がやってしまいました)。

シャットダウンは必ず特権エンドポイントにつないでから、Stop-AzureStackコマンドレットを実行しましょう。というか、通常シャットダウンしないもののようですね…。

docs.microsoft.com

Azure PipelinesでAzureのREST APIを呼ぶ

これはAzure DevOpsアドベントカレンダー19日目の記事です。

qiita.com

というちぇんわさんの無茶ぶり読者からのご質問があったので、簡単にやってみました。

Azure Pipeline task to call Azure REST API

難しいことはなくて、Azure PipelinesにPowerShellタスクを追加して、普通にPowerShellでのREST API呼び出しているだけです。もちろんアクセストークンなんかはこんな生書きしてはいけません(笑)。variablesか、Libraryに入れておくのが望ましいです。

一つ悩ましいとすれば「どうやってAzureのトークン取るの?」ということですが、今回の場合、AzureのREST APIのリファレンスには"Try It"というボタンがついているので、そこから持ってきました。

例えばVirtual Machinesの一覧を取るAPI。

docs.microsoft.com

このトークンの権限はちょっと調べてないですが、同様のことはAzure-CLIでもできます。Try Itからサインアウトしてもキーは使えていました。

docs.microsoft.com

qiita.com

ただまぁどうしてもRESTじゃないといけないということはあると思いますが、簡単にやるならAzure PowerShellタスクやAzure-CLIタスク使うとこの辺の面倒全部見てくれる(Login-AzureRmAccountコマンドレット不要)ので、そっちのほうがいいんじゃないかなと思いました。

docs.microsoft.com

docs.microsoft.com