Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

YAEGASHI Takeshi

February 12, 2020
Tweet

More Decks by YAEGASHI Takeshi

Other Decks in Programming

Transcript

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

    View Slide

  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」

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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
    冪等性はないので要注意

    View Slide

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

    View Slide

  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階層構造による
    リソース指定

    View Slide

  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 の保存場所を調査

    View Slide

  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 による
    リソース指定ができない

    View Slide

  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}}"

    View Slide

  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 フィルタが利用可能になる

    View Slide

  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

    View Slide

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

    View Slide