Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

AnsibleでAzureの インフラを管理する話 + α

625 views

Published on

Ansiblejpディベロッパー部 2020.02 の LT 資料です。
https://ansible-users.connpass.com/event/162758/

Published in: Software
  • Be the first to comment

  • Be the first to like this

AnsibleでAzureの インフラを管理する話 + α

  1. 1. Ansible で Azure の インフラを管理する話 + α Ansiblejpディベロッパー部 2020.02 Takeshi Yaegashi
  2. 2. 自己紹介 八重樫 剛史 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」
  3. 3. Ansible に対する貢献 blockinfile モジュールの作者です ● Ansible Meetup in Tokyo 2015.09 の LT で 開発時の顛末を話しました ● 当時の Ansible の開発コミュニティについて 興味のある方は資料をご覧ください ● その後 Red Hat による買収などいろいろあり ましたが、コミュニティやベンダ各社のリソー スを結集して今なお進化を続ける Ansible の 開発体制はすごい https://www.slideshare.net/yaegashi/ansible-52767041
  4. 4. 今日の話題 Ansible で Azure インフラ管理す るときに役に立つかもしれない知 識とツール ● Azure Resource Manager ● Azure Resource Explorer (Web アプリ) ● azure_rids (Jinja2 フィルタ) ● Ansible コレクション https://qiita.com/yaegashi/items/fa8984b724e5e819aa6e
  5. 5. Azure Resource Manager (ARM) ● Azure リソース階層のアーキテクチャ ○ 管理グループ ○ サブスクリプション (ビリングの単位) ○ リソースグループ ○ リソース (VM やマネージドサービスなど ) ● リソースは必ずリソースグループを作って 格納する必要がある ● アクセス制御 (IAM) もこの階層構造を対象 とした RBAC を設定する (Azure AD と連 携する)
  6. 6. リソースID ● ARM の階層を反映した リソースID という文字列でリソースを識別する ● REST API エンドポイント https://management.azure.com のパスでもある /subscriptions/{サブスクリプションID}/resourceGroups/{リソースグループ名} /providers/{リソースプロバイダ名}/{リソースタイプ名}/{リソース名} /{サブリソースタイプ名1}/{サブリソース名1}/...
  7. 7. リソース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
  8. 8. Azure Resource Explorer ● https://resources.azure.com ● ARM のリソース階層を探索で きる便利な Web アプリ ● 各リソースのプロパティ値の確 認やドキュメントの参照、 REST API の発行ができる
  9. 9. 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 冪等性はないので要注意
  10. 10. Azure Resource Explorer の活用例 実際にあった例:名前が RG1 のリソースグループに入っている名前が VM1 の VM に くっついてる最初の NIC にくっついている NSG のルールに OpenVPN ポート (1194) の 受信許可がなければ追加するのを Ansible でやりたい ○ 最初の VM 以外のリソース名・リソースグループ名は 不明なことが多い (Azure CLI などのツールは勝手に名前をつけて作るため ) ○ 関連リソースは各リソース内に リソースID で記録されており、 その記録場所は Azure Resource Explorer を使って容易に調べられる
  11. 11. ステップ 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階層構造による リソース指定
  12. 12. ステップ 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 の保存場所を調査
  13. 13. ステップ 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 による リソース指定ができない
  14. 14. 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}}"
  15. 15. 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 フィルタが利用可能になる
  16. 16. 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
  17. 17. おわり 今後の活動予定 ● azure_rids フィルタを Ansible の標準機能にする ○ まずは公式コレクション azure.azcollection に入れてもらう? ● 全 azure_rm モジュールが リソースID を受け付けるようにする ○ 現状では azure_rm_resource_info だけが url パラメータでリソース IDを受け付ける ○ Azure CLI でも --ids でリソースID指定できるし、理解してもらいやすいのでは ● Ansible コレクションをやっていく ○ 自作コレクションのドキュメントの整備など、いろいろ

×