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