Slide 1

Slide 1 text

Ansible で Azure の インフラを管理する話 + α Ansiblejpディベロッパー部 2020.02 Takeshi Yaegashi

Slide 2

Slide 2 text

自己紹介 八重樫 剛史 Takeshi Yaegashi ● 株式会社バンダイナムコスタジオ所属 ● Linux・Unix・OSS・低レベルなことが好きなエンジニア ● ブログ https://l0w.dev Qiita https://qiita.com/yaegashi ● 最近の仕事 ○ Raspberry Pi IoT 案件 (Go) スマホゲームアプリのサーバ開発 (Go) ○ Azure による開発者向けインフラ構築 (Python, Ansible, Go, Terraform, etc.) ● 最近の登壇 ○ Microsoft de:code 2019「DT01 ゲームメーカー目線で Azureを(略)」 ○ Go Conference 2019 Autumn「Microsoft Graph API Library for Go」

Slide 3

Slide 3 text

Ansible に対する貢献 blockinfile モジュールの作者です ● Ansible Meetup in Tokyo 2015.09 の LT で 開発時の顛末を話しました ● 当時の Ansible の開発コミュニティについて 興味のある方は資料をご覧ください ● その後 Red Hat による買収などいろいろあり ましたが、コミュニティやベンダ各社のリソー スを結集して今なお進化を続ける Ansible の 開発体制はすごい https://www.slideshare.net/yaegashi/ansible-52767041

Slide 4

Slide 4 text

今日の話題 Ansible で Azure インフラ管理す るときに役に立つかもしれない知 識とツール ● Azure Resource Manager ● Azure Resource Explorer (Web アプリ) ● azure_rids (Jinja2 フィルタ) ● Ansible コレクション https://qiita.com/yaegashi/items/fa8984b724e5e819aa6e

Slide 5

Slide 5 text

Azure Resource Manager (ARM) ● Azure リソース階層のアーキテクチャ ○ 管理グループ ○ サブスクリプション (ビリングの単位) ○ リソースグループ ○ リソース (VM やマネージドサービスなど ) ● リソースは必ずリソースグループを作って 格納する必要がある ● アクセス制御 (IAM) もこの階層構造を対象 とした RBAC を設定する (Azure AD と連 携する)

Slide 6

Slide 6 text

リソースID ● ARM の階層を反映した リソースID という文字列でリソースを識別する ● REST API エンドポイント https://management.azure.com のパスでもある /subscriptions/{サブスクリプションID}/resourceGroups/{リソースグループ名} /providers/{リソースプロバイダ名}/{リソースタイプ名}/{リソース名} /{サブリソースタイプ名1}/{サブリソース名1}/...

Slide 7

Slide 7 text

リソースID の例 ● Azure の VM 1 台を構成する 5 つのリソースの例 ● サブスクリプション X1 のリソースグループ RG1 に格納した リソース名 VM1 の VM・Disk・NIC・Public IP・NSG ○ リソースの種類が異なるならリソース名は同じでもよい ○ 関連リソースを同じリソースグループに入れておけば権限管理や掃除が楽になる /subscriptions/X1/resourceGroups/RG1/providers/Microsoft.Compute/virtualMachines/VM1 /subscriptions/X1/resourceGroups/RG1/providers/Microsoft.Compute/disks/VM1 /subscriptions/X1/resourceGroups/RG1/providers/Microsoft.Network/networkInterfaces/VM1 /subscriptions/X1/resourceGroups/RG1/providers/Microsoft.Network/publicIPAddresses/VM1 /subscriptions/X1/resourceGroups/RG1/providers/Microsoft.Network/networkSecurityGroups/VM1

Slide 8

Slide 8 text

Azure Resource Explorer ● https://resources.azure.com ● ARM のリソース階層を探索で きる便利な Web アプリ ● 各リソースのプロパティ値の確 認やドキュメントの参照、 REST API の発行ができる

Slide 9

Slide 9 text

Azure Resource Explorer ♥ Ansible ● なぜか Ansible プレイブックのテンプ レートを出力する機能がある ● azure_rm 汎用モジュールを使用 ○ GET メソッド azure_rm_resource_facts Ansible 2.9 からは azure_rm_resource_info ○ PUT/POST/DELETE メソッド azure_rm_resource 冪等性はないので要注意

Slide 10

Slide 10 text

Azure Resource Explorer の活用例 実際にあった例:名前が RG1 のリソースグループに入っている名前が VM1 の VM に くっついてる最初の NIC にくっついている NSG のルールに OpenVPN ポート (1194) の 受信許可がなければ追加するのを Ansible でやりたい ○ 最初の VM 以外のリソース名・リソースグループ名は 不明なことが多い (Azure CLI などのツールは勝手に名前をつけて作るため ) ○ 関連リソースは各リソース内に リソースID で記録されており、 その記録場所は Azure Resource Explorer を使って容易に調べられる

Slide 11

Slide 11 text

ステップ 1 ● VM のリソース情報を azure_rm_resource_info で取得して r に保存 - name: VM リソース情報取得 azure_rm_resource_info: resource_group: RG1 provider: Compute resource_type: virtualMachines resource_name: VM1 register: r ARM階層構造による リソース指定

Slide 12

Slide 12 text

ステップ 2 ● NIC のリソースIDを調べて azure_rm_resource_info で取得して r に保存 - name: NIC リソース情報取得 azure_rm_resource_info: url: "{{r.response[0].properties.networkProfile.networkInterfaces[0].id}}" register: r リソースID 指定 Azure Resource Explorer で VM にくっついている NIC の リソースID の保存場所を調査

Slide 13

Slide 13 text

ステップ 3 ● NSG のリソースIDを調べて azure_rm_securitygroup でルール追加 - name: NSG ルール追加 azure_rm_securitygroup: resource_group: "{{rid.resource_group}}" name: "{{rid.name}}" rules: - name: AllowOpenVPN priority: 200 destination_port_range: 1194 direction: Inbound access: Allow vars: rid: "{{r.response[0].properties.networkSecurityGroup.id | azure_rids}}" NIC にくっついている NSG の リソースID リソースID を分解して リソース名・リソースグルー プ名を得るフィルタ azure_rm_securitygroup は リソースID による リソース指定ができない

Slide 14

Slide 14 text

azure_rids フィルタの開発 ● リソースID文字列から、リソース名などの要素を含むディクショナリに変換する Jinja2 フィルタ (Azure SDK for Python を利用) TASK [(2) azure_rids テスト] **************************************************************************** ok: [localhost] => (item=/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/RG1/providers /Microsoft.Compute/virtualMachines/VM1) => msg: children: '' name: VM1 namespace: Microsoft.Compute resource_group: RG1 resource_name: VM1 resource_namespace: Microsoft.Compute resource_parent: '' resource_type: virtualMachines subscription: 11111111-1111-1111-1111-111111111111 type: virtualMachines msg: "{{item | azure_rids}}"

Slide 15

Slide 15 text

azure_rids フィルタの配布 Ansible Galaxy による配布 ● yaegashi.azureplugins ロール ○ ansible-galaxy install yaegashi.azureplugins ○ yaegashi.azureplugins ロール実行で azure_rids が利用可能になる ● yaegashi.azurex コレクション (Azure 2.8 以降) ○ ansible-galaxy collection install yaegashi.azurex ○ インストールにより yaegashi.azurex.azure_rids フィルタが利用可能になる

Slide 16

Slide 16 text

Ansible コレクション Ansible 2.8 からの新機能 ● 複数のプレイブック・ロール・モジュール・プラグインを含む配布物が Ansible Galaxy で公開・配布できるようになる ○ これからの Ansible のエコシステムの発展を担うと思われる ○ Ansible Galaxy でロール以外のコードがまともに扱えるようになる意義は大きい ● 情報 ○ 利用者ガイド https://docs.ansible.com/ansible/latest/user_guide/collections_using.html ○ 開発者ガイド https://docs.ansible.com/ansible/latest/dev_guide/developing_collections.htm ○ Azure 公式コレクション: azure.azcollection

Slide 17

Slide 17 text

おわり 今後の活動予定 ● azure_rids フィルタを Ansible の標準機能にする ○ まずは公式コレクション azure.azcollection に入れてもらう? ● 全 azure_rm モジュールが リソースID を受け付けるようにする ○ 現状では azure_rm_resource_info だけが url パラメータでリソース IDを受け付ける ○ Azure CLI でも --ids でリソースID指定できるし、理解してもらいやすいのでは ● Ansible コレクションをやっていく ○ 自作コレクションのドキュメントの整備など、いろいろ