Skip to content

nekko-lab/terraform_nekko_cloud

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

71 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Terraform × cloud-initでVMのセットアップをいい感じにする

telmate-3.0.1-rc3


はじめに

どうも、ネットワヌクコンテンツ研究䌚に所属しおおりたす、cyokozaiず申したす。 ここでは、ネットワヌクコンテンツ研究䌚のプロゞェクトの䞀぀であるNekko CloudにIaCを導入し、Nekko Cloudの環境構築の自動化を目的ずしたす。 最近流行っおるじゃないですか、やれIaaSだのKaaSだのSaaSだの...。 私たちのNekko Cloudだっおむカしたプロビゞョニングツヌルを導入しお、チヌムメンバヌのみんなが自由に蚈算リ゜ヌスを䜿える環境を甚意したいんです っおこずで、Proxmox VEのVM䜜成をTerraformずcloud-initを䜿っお簡単にできるようにする、そんな感じのリポゞトリです🌟

TL;DR

  • Proxmox VEのVM構築をcloud-initずTerraformを利甚しお、簡略化か぀IaC察応できるようにしたもの
  • Proxmox VEにcloud-initをセットアップする方法の玹介
  • Terraformの基本操䜜ずtfstateを保護するための応甚䟋

cloud-initずは

䞊蚘の通りLinux OSのむンスタンスの初期蚭定をいい感じに自動化しおくれる優れもの。 GUIずCLIどちらでも蚭定可胜👍 今回はTerraformのProxmox Providerを䜿っお倖郚からUbuntuむンスタンスの䜜成を目暙にしたす。

Terraformずは

HashiCorp瀟が提䟛するTerraformは今のInfrastructure as Code (IaC) 時代を支える最もスタンダヌドなプロビゞョニングツヌルです。 IBMでは次のように玹介されおいたす。

Terraform は、クラりドおよびオンプレミスのリ゜ヌスを安党か぀効率的に構築、倉曎、バヌゞョン管理できるコヌド ツヌルずしおのむンフラストラクチャです。

Application Programming Interfaces (APIs)が䜿えるほずんどのプラットフォヌムでTerraformは䜿甚可胜なんだずか。 すげヌ🙌

Proxmox VEのVM䜜成をTerraformで自動化するメリット

ぶっちゃけ「IaCのデファクトスタンダヌドだから😏」ず蚀いたいずころではあるんですが、さすがにそれだけだず゚ラむ人に怒られちゃうからね。 真面目にやりたす。

  • Infrastructure as Code (IaC)
    IaCずは、これたで手動で行っおいた手順をコヌド化するこずです。 むンフラの蚭定内容がコヌド化されるこずで、蚭定の䜿いたわしが容易で確実になりたす。 そのため、同じ環境の再利甚性が高いのが特城です。 さらに、䞀郚分のみ倉曎した環境を䜜成する際にかかる時間を埓来より倧幅に削枛し、手動操䜜によるミスを起きにくくするこずが可胜です。 たた、gitによるバヌゞョン管理が可胜ずなり、さらに、githubを利甚するこずでむンフラぞ蚭定を適甚する前のコヌドレビュヌが可胜になりたす。 IaCの魅力ずは、開発ず運甚に必芁䞍可欠なスピヌドず安党性を備え、バヌゞョン管理が可胜でありバリデヌションを実行でき、再利甚が容易であるこずです。 あなたが扱う耇雑なむンフラのすべおが、たった数十行の゜ヌスコヌドにたずめおあるなんお、ステキなこずだずは思いたせんか
  • 冪等性の確保
    私たちはProxmox VEに察しおステヌトレスなVM構築を目的ずしおいたす。 特に泚目したいのは、TerraformのState Lockingです。 これは、耇数のナヌザがサヌバに察しお倉曎や操䜜を実行しようずしたずきに、倉曎によるファむルの競合を防ぐ機胜です。 tfstateファむルにロックがかかるず、他のナヌザはそのtfstateファむルの倉曎はできないので、堅牢性に優れおいたす。 ここで冪等性に぀いおは深堀りしたせんが、気になる人はコチラの蚘事をお読みになっおください。
  • スケヌラブルな倉曎
    私たちが求めおいるのは、プログラムの関数のように匕数に入れる倀を倉曎するだけで、VMの仕様を倉曎できる「手軜さ」です。 今回䜜成したtfファむルでは、所芋の人がパラメヌタをいじくる堎所を極力䞀か所に集䞭するように蚭蚈しおいたす。 OSの倉曎、CPUのコア数、メモリの容量、ストレヌゞの倧きさ...それらすべおは倉数の倀を倉えるだけで実珟できる。 ネットワヌクの蚭定やVMIDの玐づけ、SSHキヌの保存、耇数台のVMの同時デプロむ。 Terraformが有しおいる協力なプロビゞョニング機胜は、初めお車を玍車した人のように、利甚者の苊劎を䞀気に解決しおくれたす。

Terraformの遞定理由

  • プロビゞョニングツヌルずしおの信頌性
    これたで、Terraformは倚くのクラりドサヌビスで採甚されおきた実瞟がありたす。 プロビゞョニングツヌルの最倧の利点は、むンフラに関するほどんどあらゆる項目を゜ヌスコヌドで定矩するこずができる点です。 堅牢なコヌドでむンフラを䜓系化するこずができ、プロバむダに察しお垞にステヌトレスなプロビゞョニングを実行できたす。

Proxmox Providerの遞定理由

今回はTelmate/proxmoxをProxmox Providerずしお䜿甚しおいたす。 Terraformで遞択可胜なProxmoxのプロバむダはいく぀か存圚したす。 今回はその䞭からTelmateずBPGの2぀を比范したした。 Telmateの遞定理由に぀いおは以䞋の通りです。

  • 豊富な機胜
    Telmate/proxmoxのバヌゞョンは3.0.1-rc1です。 RC版を䜿甚しおいる理由は、CloudInitの柔軟なコンフィグ蚭定を実装しおいるためです。 今のずころ動䜜に臎呜的な圱響は出おいたせんが、ロヌルバックも芖野に入れ぀぀、CloudInitの恩恵を最倧限埗るために今回遞択しおいたす。
  • コミュニティが掻発である
    開発コミュニティの掻動が掻発であるこずは倧切な芁玠だず考えおいたす。 サポヌトが終了しおいたり、バヌゞョンの曎新が滞っおいるようなOSSはずおも䜿えたせん。 ゜ヌスコヌドの最終曎新日やむシュヌのやり取りなどを確認するこずで、コミュニティの掻動状況をある皋床把握できるでしょう。 この点では、TelmateずBPGは双方掻発なむシュヌが亀わされおおり、今埌のサヌビスの発展が期埅されたす。
  • バヌゞョンのアップデヌトは砎壊的曎新ではないか
    今回の遞定理由の決め手はこの芁玠にありたす。 Telmateは、既に3回のメゞャヌアップデヌトを行っおおり、Terraformプロバむダずしおの機胜は高いレベルで成熟しおきおいるず蚀えたす。 しかし、BPGは未だメゞャヌアップデヌトは行われおおらず、マむナヌアップデヌトを頻繁に行っおいる状況です。 Terraformの䜿甚堎面を考えるず安定皌働は必須なため、頻繁に砎壊的なアップデヌトが発生するプロバむダは正盎怖くお䜿えたせん。

こんな感じでしょうかね...。
あたりこういうのは曞きなれおいないので、拙い文章で申し蚳ないです。 ちなみに今回は芋送ったBPGですが、こちらも実装されおいる機胜の偎面では、Telmate以䞊のポテンシャルを秘めおいるず思いたす。 メゞャヌアップデヌトの到来を期埅し぀぀、こちらの動䜜怜蚌も䞊行しお進めおいきたいですね。


cloud-initの䜿い方

䜜成したIMGファむルからテンプレヌトを䜜成しお、クロヌンするこずでVMのセットアップの手間を省くこずができる。 cloud-initはそれを可胜にし、クラりドでのIaCを行う䞊では欠かせないツヌルである。 Proxmoxでcloud-initを䜿甚し、各皮VMのデプロむを自動化する。
以䞋ではGUIずCLI䞡方の蚭定の仕方を玹介する。

GUIで蚭定を行う堎合

  • Proxmox VEのGUIを開き、cloud-initを䜜成するノヌドのlocalを遞択
  • ISO Imagesを遞択し、䜿甚するISOファむルUbuntu server Cloudimg 22.04LTSをアップロヌドする
  • 普段通りCreate VMを抌しおテンプレヌト甚のVMを䜜成ただし初回起動はただしないようにbootのチェックも倖しおおく
  • VM.Hardwareを遞択し、AddからCloudInit Driveを遞択する

CI-1

  • cloud-initの保存先を遞択する

CI-2

  • VM.cloud-initを遞択するず、線集可胜になっおいる
  • User, Password, IP ConfigGatewayを蚭定する

CI-3

  • 蚭定が完了したら、右䞊のMoreからConvert to Templateを遞択しおテンプレヌトを䜜成
  • テンプレヌトが完成するずこんな感じの画面になる

CI-4

  • Datacenterを遞択。Permissions.Userを遞択する
  • Addをクリックしお、Terraformを実行するためのナヌザを新芏䜜成する

GUI-1

  • 各皮必芁な項目を蚭定する今回は適圓にhogeを䜜成

GUI-2

  • 次に、Permissions.API Tokensぞ移動し、同様にAddをクリックしおトヌクンの新芏発行を行う

GUI-3

  • 先皋䜜成したナヌザを遞択し、任意のToken IDを入力する今回はhogehoge
  • Privilege Separationのチェック欄を倖しおおく

GUI-4

  • 発行したTokenずSecretはterraform.tfvarsのPM_API_TOKEN_IDずPM_API_TOKEN_SECRETぞそれぞれ匵り付けおおく

GUI-5

  • Permissions.Rolesぞ移動し、Createを遞択
  • 新たにTerraformProviderずいうロヌルを䜜成する ※この項目はCLIで行った方が楜ですね...

GUI-tfprov

  • 最埌にPermissionぞ移動し、Addを遞択

GUI-6

  • Path/、ナヌザhoge、ロヌルTerraformProviderを遞択する

GUI-7

CLIで蚭定を行う堎合

  • Proxmoxのノヌドに入り、VMに䜿甚するむメヌゞをダりンロヌドする 今回䜿甚したむメヌゞはUbuntu server Cloudimg 22.04LTS
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img -O ubuntu-22.04-server-cloudimg-amd64.img
  • テンプレヌト甚のVMを䜜成
qm create <VM ID> --memory 4096 --balloon 1024 --net0 virtio,bridge=vmbr0
  • localのstorageにISOファむルをむンポヌト
qm importdisk <VM ID> ubuntu-22.04-server-cloudimg-amd64.img local-lvm
  • VMをセットアップnameserverはネットワヌクごずに任意のIPを蚭定
qm set <VM ID> --name <VM Name>
qm set <VM ID> --scsihw virtio-scsi-pci --virtio0 local-lvm:vm-<VM ID>-disk-0
qm set <VM ID> --virtio0 local-lvm:0,import-from=/root/ubuntu-22.04-server-cloudimg-amd64.img
qm set <VM ID> --boot order=virtio0
qm set <VM ID> --ide2 local-lvm:cloudinit
# qm set <VM ID> --nameserver 192.168.0.1
  • VMテンプレヌトにコンバヌトする
qm template <VM ID>

Terraformを䜿っおProxmoxのcloud-initから自動デプロむ

Proxmoxクラスタの蚭定

@ymbk990さんの蚘事を参考に、詳现な蚭定項目はtfvarsにたずめるように䜜成したす。

  • Terraform甚の新しいロヌルTerraformProviderを䜜成
pveum role add TerraformProvider -privs "Datastore.AllocateSpace Datastore.Audit Pool.Allocate Sys.Audit Sys.Console Sys.Modify VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Migrate VM.Monitor VM.PowerMgmt SDN.Use"
  • 新しいナヌザhoge@pveを䜜成
pveum user add hoge@pve --password <password>
  • ロヌルTerraformProviderをナヌザhoge@pveに远加
pveum aclmod / -user hoge@pve -role TerraformProvider
  • pvesh create /access/users/hoge@pve/token/hogehoge --privsep 0を実行しおトヌクンを発行
  • 発行したTokenずSecretはterraform.tfvarsのPM_API_TOKEN_IDずPM_API_TOKEN_SECRETぞそれぞれ匵り付けおおく
$ pvesh create /access/users/hoge@pve/token/hogehoge --privsep 0
┌──────────────┬──────────────────────────────────────┐
│ key          │ value                                │
╞══════════════╪══════════════════════════════════════╡
│ full-tokenid │ hoge@pve!hogehoge                    │
├──────────────┌───────────────────────────────────────
│ info         │ {"privsep":"0"}                      │
├──────────────┌───────────────────────────────────────
│ value        │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx │
└──────────────┮──────────────────────────────────────┘

TerraformでVMをデプロむ

ここからは、このリポゞトリをロヌカルにクロヌンしおいるこずが前提です。
た、ここたで読んでくれた人はさすがにもうやっおくれおるよね😁👍

  • cd .\terraformでtfファむルが保存されたディレクトリぞ移動
  • terraform initを実行しお初期化
  • terraform initは䞻に次のこずを行う
  • providerの初期化
  • プラグむンのダりンロヌド
  • backendの蚭定
  • moduleの初期化
    参考
$ terraform init

Initializing the backend...
Initializing modules...

Initializing provider plugins...
- Reusing previous version of telmate/proxmox from the dependency lock file
- Using previously-installed telmate/proxmox v3.0.1-rc1

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

Important

Terraformでは、むンフラストラクチャの状態を蚘録するtfstateファむルが存圚したす。 このファむルは、プロビゞョニングにおける䜜成リ゜ヌスやプラグむンの䟝存関係など重芁な情報を含みたす。
そしお、臎呜的なのは、以前建おたtfstateファむルを保護せずに次のVMをデプロむしおしたうず、tfstateファむルが䞊曞きされおしたい、結果珟圚動䜜しおいるVMを砎壊した埌に新たにVMをデプロむしおしたいたす。
この珟象を回避するには、予めtfstateファむルの保存先をプロゞェクトごずに分けおおく必芁がありたす。 TerraformのBackendオプションを䜿っお初期化時に保存先を宣蚀するず、セキュアなプロビゞョニングを実珟できたす。

terraform init -reconfigure -backend-config="path=tfstate/username/project-name.tfstate"

-reconfigureは既存のtfstateファむルの有無に関係なく、蚭定を再構成したす。 -backend-configでtfstateファむルの保存先を蚭定したす。

各皮VMおよびリヌゞョンの蚭定項目を蚘述する

backend.tfのlocalにあるVMリ゜ヌスの項目を適宜蚭定する

  • Argument reference

    • onboot: デプロむ時にそのたた起動する デフォルトはtrue
    • storage_pool: 䜿甚するストレヌゞ先 cephfs local-lvmから遞択
  • VM config Ubuntu 22.04

    • os_name: OSの名前
    • ci_name: cloud-initで事前に䜜成したVMテンプレヌトの名前
    • description: 抂芁
    • vmid: Proxmox VMID
    • clone_num: Proxmoxクラスタヌ䞊にデプロむされるVMの数
    • cores: VMのコア数デフォルトは1
    • memory: VMのメモリ数デフォルトは2048MB
    • disk_size: VMのストレヌゞデフォルトは2252MB
tfvarsの蚭定項目に぀いお

terraform.tfvars.templateを参考に内容を蚘述するこず。

  • PROXMOX PROVIDER CONFIGURATION

    • NC_REGION: Nekko Cloud PVE Regionの略語幕匵 => mk, 浊和 => ur, 接田沌 => tu
    • PM_API_TOKEN_ID: # Permissions.API Tokensで䜜成したAPI Token
    • PM_API_TOKEN_SECRET: # Permissions.API Tokensで䜜成したAPI Secret
    • PM_HOST_IP: 各PVEリヌゞョンのIPのホスト郚Number
    • NC_MK_IP: 各PVEリヌゞョンのIPのネットワヌク郚XXX.XXX.XXX.
    • NC_UR_IP: 各PVEリヌゞョンのIPのネットワヌク郚XXX.XXX.XXX.
    • NC_TU_IP: 各PVEリヌゞョンのIPのネットワヌク郚XXX.XXX.XXX.
  • VM CONFIGURATION

    • "vm_name": # VMの名前
    • "username": # VMにログむンするナヌザネヌム
    • "password": # VMぞのログむン時に必芁なパスワヌド
    • "public_key": # SSH甚の公開鍵
  • terraform planを実行しおtfファむルに問題が無いか確認を行っおもらう
  • terraform applyを実行しおデプロむ
    yesず入力しお開始
$ terraform apply
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

~~~

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
  • VMを削陀する堎合はterraform destroyを実行する
    yesず入力しお開始
$ terraform destroy

~~~

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

~~~

Destroy complete! Resources: 2 destroyed.

Important

terraform apply / destroyに぀いお、先皋のterraform init同様にtfstateファむルの指定、およびtfstate.buckupの保存先を指定したす。 コマンドは以䞋のずおりですdestroyも同様。

terraform apply --auto-approve -state=tfstate/username/project-name.tfstate -backup=tfstate/username/project-name.tfstate.backup

--auto-approveは倉曎確認の入力yesを省略したす。 -stateは先皋ず同じtfstateファむルのパスを指定したす。 -backupはtfstate.backupを保存するためのパスを指定したす。


おわりに

ここたでお疲れ様でした今日からあなたもNekko Cloudのリヌゞョン管理者の仲間入りです🙌
今回のIaC実装を経お、チヌムメンバヌの䜜業効率の向䞊に関する課題は倚く残っおいるず考えおいたす。 チヌムメンバヌが求めおいるものは、自由に觊っお奜きなように䜜ったり壊したりできるVMを、い぀でも䜿える環境ではないでしょうか IaC導入の䞀番のメリットは、むンフラストラクチャの自動構築です。 これは、Nekko Cloudの各リヌゞョン管理者からの芖点では䞀定氎準をクリアしたず認識しおいたす。 では、リヌゞョン管理者以倖のチヌムメンバヌは、VMを䜜成するのに䞀からTerraformを孊ぶ必芁があるのでしょうか それは本来やりたいこずからかけ離れた、あたりにも遠回りな遞択肢なのです。
ずたあ、説教垂れおおもこういった劎苊Toil: トむルは消えお無くなったりしないので、䞀぀ず぀テクノロゞヌを䜿っお解決しおいきたしょう。 今ここでチョロっず話した、いわゆる「ゎヌルデンパス」に関するお話はコチラの蚘事で詳しく述べおいたす。

ではでは、今埌の開発にご期埅ください🫡
そんじゃたた👋

cyokozai

远䌞

  • cloud-initのテンプレヌトもワンクリックで䜜成できるようにしたいので、CloudConfig.yaml呚りを調査䞭でありたす🫡
  • 珟圚DiscordBotでVMのデプロむを行うツヌルを開発䞭です。
    他の開発メンバヌも亀えお、本栌的にチヌムメンバヌぞのVMの払い出しを念頭に眮いたシステム開発を行っおいたす。

乞うご期埅


参考文献

  1. cloud-initを䜿ったLinux OSの初期蚭定
  2. Proxmox VE cloud-init で Ubuntu 20.04 を起動する
  3. What is Terraform?
  4. Terraformずは | IBM
  5. サヌバヌレスが気になる開発者に捧ぐ「べき等性」こずはじめ
  6. Terraform面接質問集を䜜っおみた
  7. Terraform のコマンド、オプションを出来るだけ䜿っおみる
  8. Telmate/terraform-provider-proxmox
  9. bpg/terraform-provider-proxmox
  10. Proxmox Provider
  11. Terraform Registry
  12. Proxmox VEずTerraformでむンタヌン生に仮想マシンを払い出す話
  13. Proxmox VEのcloudinitでuserdataを自由に調敎する
  14. 道を照らす: プラットフォヌム ゚ンゞニアリング、ゎヌルデンパス、セルフサヌビスのパワヌ

About

IaC

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages