TerraformでProxmox上にVMを作成してみた

インフラエンジニア志望なのにIaCツール触ったことないのはどうなのよ?ってことで、Terraformをさわさわしてみました。
AWSインスタンスをプロビジョニングしても良かったんですが、インスタンスを止め忘れてえげつない請求が飛んでくるのが怖かったので、とりあえず手元のProxmox環境にVMを立てることから始めてみました。

大まかな手順

  • Terraformから接続するためのユーザ・権限を作成する
  • VMのテンプレートを作成する
  • HCLを記述する
  • Terraform plan/applyでVMを作成する

Terraform用ユーザの作成

https://registry.terraform.io/providers/Telmate/proxmox/latest/docs
公式ドキュメントに沿ってユーザと権限を設定していきます。

pveum role add TerraformProv -privs "VM.Allocate VM.Clone VM.Config.CDROM VM.Config.CPU VM.Config.Cloudinit VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Monitor VM.Audit VM.PowerMgmt Datastore.AllocateSpace Datastore.Audit"
pveum user add terraform-prov@pve --password <password>
pveum aclmod / -user terraform-prov@pve -role TerraformProv

VMのテンプレート作成

テンプレート作成の手順に関しては、こちらの記事を参考にさせていただきました。
blog.nishi.network
ここで作成したテンプレートをもとにVMを作成していきます。

HCLの記述

先ほど作成したテンプレートをクローンして新たにVMを立てていくため、各種構成を記述したtfファイルを作成します。
はじめに、Proxmoxサーバに接続するための情報をmain.tfに定義していきます。

provider "proxmox"{
    pm_api_url = var.api_url
    pm_user = var.user
    pm_tls_insecure =true
}

さらに、公開したくない情報を別のファイルに定義しておくこともできるため、var.tfにいくつかの値を定義しておきました。

variable "api_url"{
    default = "ProxmoxサーバのURL"
}
variable "user"{
    default = "Proxmoxサーバにログインするユーザ"
}

また、今回はProxmoxプロバイダを使用するため、プラグイン関連の設定をversion.tfに記述しました。

terraform {
    required_providers {
        proxmox = {
            source = "Telmate/proxmox"
            version = "2.9.0"
        }
    }
}

最後に、作成するVMの構成をVMs.tfにまとめていきます。今回は3台のVMKubernetesクラスタを作成することを見込んだ設定としました。

resource "proxmox_vm_qemu" "UbuntuCP"{
    name = "ubuntucp"
    target_node = "atras"
    clone = "UbuntuServerTemplate"
    memory = 2048
    os_type = "cloud-init"

    disk{
        type = "scsi"
        storage = "VMStore"
        size = "20G"
    }
}

resource "proxmox_vm_qemu" "UbuntuWN1"{
    name = "ubuntuwn1"
    target_node = "atras"
    clone = "UbuntuServerTemplate"
    memory = 2048
    os_type = "cloud-init"

    disk{
        type = "scsi"
        storage = "VMStore"
        size = "20G"
    }
}

resource "proxmox_vm_qemu" "UbuntuWN2"{
    name = "ubuntuwn2"
    target_node = "atras"
    clone = "UbuntuServerTemplate"
    memory = 2048
    os_type = "cloud-init"

    disk{
        type = "scsi"
        storage = "VMStore"
        size = "20G"
    }
}

VMの作成

さて、必要なファイルをあらかた定義し終えたので、さっそくProxmoxサーバにVMを作成していきます。
$export PM_PASS="PASSWORD"でProxmoxユーザのパスワードを環境変数に登録し、 $terraform planで、エラーチェックと作成されるVMの構成の確認を行います。
ここで表示された構成で問題がなければ、$terraform applyで実際にVMを作成します。 Apply complete!と表示されれば無事作成が終了していますので、実際にProxmox上で確認してみると、
f:id:KLag:20211111145908p:plain
こんな風に作成できていることがわかります。

ProxmoxへのLVMパーティションの追加

サーバにHDDを増設したことに伴って、Proxmox環境に新しくLVMストレージを追加しようとしたんですが、Webコンソール上のストレージ設定から作成しようとしたところ、ディスク単位でしか新規作成できなさそうだったのでここにメモっておく。

ざっくりとした手順

パーティション作成

300GBの物理ディスク /dev/sdb内に、ISOイメージ保管用のパーティションを100GB、余った部分をVMの仮想ストレージ保管用のパーティションとして作成します。

# fdisk /dev/sdb 
Welcome to fdisk (util-linux 2.36.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n
Partition Number: (デフォルトで確定)
First Sector: (デフォルトで確定)
Last sector, +/-sectors or +/-size{K,M,G,T,P}: +100G

Created a new partition 1 of type 'Linux filesystem' and of size 100 GiB.

Command (m for help): n
Partition Number: (デフォルトで確定)
First Sector: (デフォルトで確定)
Last sector, +/-sectors or +/-size{K,M,G,T,P}: (空欄)

Created a new partition 2 of type 'Linux filesystem' and of size xxx GiB.

これでパーティションを作成できたので、mkfsでフォーマットを行っていきます。続行しますか?的なことが聞かれるのでyで続行。

# mkfs -t ext4 /dev/sdb1
# mkfs -t ext4 /dev/sdb2

ここでディスクの下準備は完了したので、VGの作成に移っていきます。

VGの作成

今回はVMのストレージ領域のみをLVMとしてProxmoxに追加していきます。そのため、/dev/sdb2のみを含むVGを作成します。

# vgcreate VMStore /dev/sdb2
# vgscan

vgdisplayvgsで作成したVMStoreが表示されていればOK。

Proxmoxのストレージ設定変更

Proxmoxのストレージ設定ファイルである/etc/pve/storage.cfgを編集していきます。
さっき作成したLVMのVG名を次のように指定して追記。

lvm: VMStore(ここは任意の名前でOK)
        vgname VMStore(作成したVGの名前)

ここまで設定が終われば、以下のように反映されます。
f:id:KLag:20211107235706p:plain
本筋からは逸れますが、使用しなくなったストレージを削除する場合も同じファイルのエントリを削除することによって行います。

自宅のIPアドレスが変わったら自動的に通知してくれるDiscord Botを作った話

お久しぶりです。
前回紹介した通り、IX2105で自宅にVPN接続を可能にしているのですが、DDNSの登録などをしていないので、ルータの電源が落ちるなどしてIPアドレスが変わったときに外部から接続できなくなってしまう弱点がありまして、これはあまりにも不便だということで、

一時的なしのぎの措置として、こんな感じに通知してくれるようなBotを作成しました。(アイコンに関するツッコミは受け付けておりません。)

つくったもの

以下のリンクからコードを見ることができます。(可読性はゴミカス以下)

github.com

簡単な説明

動かすために必要なファイルは以下の通り。

  • IPNotify.py (メイン処理)
  • DiscordConfig.py (トークン・チャンネルIDの記入用)

2ファイルで作ってますが、これはGithubに公開するにあたってトークンの類を非公開にしたかったためです。そのため、.gitignoreにDiscordConfig.pyを登録しています。

IPNotify.pyでやってること

簡単に言ってしまえば、指定した時間ごとに自分のIPアドレスを確認し、前回確認時から変更があればDiscordのAPIを叩いてメッセージを送信しているだけです。
リクエスト間隔はtime.sleep内の値を変更することで調節できますが、あまりにも短いとただのDoS攻撃になってしまうので注意。

結論

早いとこDDNS登録しよ...
以上、海月でした。

IX2105の初期化からWeb GUI表示まで

 クーラーなしでPCを動かすのが厳しい時期に入りつつあります今日この頃、皆様どのようにお過ごしでしょうか?  僕は先日某所でIX2105ルータを購入し、ようやく自宅にVPNが通せると喜んでおります。あ、申し遅れました。どうも、海月です。

 ちょっと前からIX2105の存在は知っていたのですが、そこそこ安価で手に入るとは思ってもいなかったので正直驚いています。
 早速使ってみようってなわけで、電源ケーブルを突っ込んだ後にやったことをある程度ここに書き残しておきたいと思います。

最低限必要なもの

やったこと

コンソールの接続

 はじめに、 Web-GUIからの設定を可能にするための設定を行いました。ここの操作を行う際、シリアルコンソールケーブルが必要になってきます。
 ルータのConsoleポートにRJ-45コネクタを接続し、もう一方のUSB端子をPCに接続したら、ls /devで接続されたシリアルケーブルのデバイスファイルがあるかを確認します。Macなら/dev/usbserial.<文字列> って感じの名前になってるはず。

 デバイスファイルの確認が終わったら、screen <デバイスファイルのパス>でコンソールにつなぐことができます。
 あ、Windows(Tera Term)から設定する場合は、接続先を「シリアル」にしてポートを選んで接続すればOKです。ポート番号(COM 1みたいなの)はデバイスマネージャで確認しましょう。

設定の初期化

 コンソール接続ができたら、ルータの電源を投入します。POSTの実行結果がダーッと流れた後に、ブートシーケンスの進捗を示す「#」で描かれたゲージが表示されたら、Ctrl+Cを叩きます。これでブートモニタモードに入れます。そこから先は以下の通り。

boot[0] > cc 
(消してもいいですか?的なことを聞かれるので) y
boot[0] > b

  ccおそらく"clear config"の略で、設定の初期化を行うコマンドです。bで再起動するのでこれは"boot"の略だと思われます。

ユーザとIPアドレスの設定

 ルータの再起動が終わると、「管理者ユーザを設定してね!」って感じのメッセージとともにプロンプトが表示されます。ルータの言うことに従って管理者ユーザを作成します。
 デフォルトのルータのIPアドレスは 192.168.1.254 ですが、今回は変更しました。ルータのIPアドレスが変わると固定IPを振ってる機器の設定を更新する必要があり、いろいろめんどくさいからです。

Router# en        //コンフィグモードへの移行 
Router(config)# username <ユーザ名> password plain <パスワード> administrator    //管理者ユーザの作成
% User <ユーザ名> has been added.
Router(config)# interface GigaEthernet1.0    //LAN側インタフェースの選択
Router(config-GigaEthernet1.0)# ip address <IPアドレス>/<ネットワークアドレス長>    //LAN側IPアドレスの変更
Router(config-GigaEthernet1.0)# exit    //インタフェース設定の終了
Router(config)# write memory    //設定の保存

Web GUISSHの有効化

 Univergeシリーズのルータには、便利なWeb GUIが搭載されているので、そいつを有効化してやります。また、設定画面に入るためのユーザもここで指定します。

Router(config)# http-server ip enable
Router(config)# http-server username <ユーザ名>
Router(config)# write memory

 これでWeb GUI自体は使えるようになっているのですが、このままだとACLの設定でアクセスが弾かれてしまうので、ルールを追加します。

Router(config)# ip access-list permit src any dest <ルータのIPアドレス>/32

 また、コンソール接続しないでどこからでも設定したかったので、sshも有効化しました。

Router(config)# ssh-server ip enable

おわりに

 とりあえず、ここまで設定すればWeb GUIからPPPoEやらVPNやらの設定ができるようになります。

MS-DOSからDOS/V起動ディスクを作った話

 お久しぶりです。MS-DOS実行形式を生成可能なCコンパイラ(ia16-elf-gcc)を見つけてテンションが上がってる海月です(C言語が書けるとは言ってない)。
 macOSのVBoxにWindows Meを導入しようと思って、Windows機から98の起動ディスクを引っ張ってきたのはいいんですけど、見事にファイルがぶっ壊れてて使い物になりませんでした。どうして(現場猫)。
 ここで思い出す。「仮想アプライアンスで移行してきたMS-DOSがあるじゃん。」
 ってなわけで、すでにセットアップ済みのMS-DOS環境から日本語DOSの起動に必要なファイルをコピーして起動ディスクを作っていきます。

作業開始

 まずはいつものやつ。新しいフロッピーイメージを用意して、C:\> FORMAT A: /S。 FORMATコマンドに /S オプションをつけてフォーマット後にシステムファイルの転送まで一気にやっちゃう。追加で拡張メモリ領域を利用するために、HIMEM.SYS, EMM386.EXEも転送しました。これでDOS自体は起動しますが、日本語表示ができないので「ダメ〜」(トム・ブラウン)。
 DOS/V環境が動作してるので、必要なドライバファイルの確認は簡単。C:\ > TYPE CONFIG.SYSで、起動時に組み込まれるドライバが見られます。細かく言えば色々違うけど、そこはご愛嬌。そもそもこのブログを読む人がいないので誰も気にしない。  

日本語ドライバの転送

 必要なドライバたちがわかったところで、早速ドライバを準備していきます。今回は以下のドライバを用意しました。たぶんこれだけあれば足りるはず。

  • BILING.SYS : バイリンガル対応に必要なドライバ
  • JDISP.SYS : ディスプレイドライバ
  • JFONT.SYS : フォントドライバ
  • JKEYB.SYS, JKEYBRD.SYS : 日本語キーボードドライバ
  • ANSI.SYS : エスケープシーケンス処理ドライバ
  • 各種フォントファイル(ANK16/24.FNT, KANJI16/24.FNT, GAIJI16/24.FNT)

 あとはフロッピー上にCONFIG.SYSとAUTOEXEC.BATを作成して、こいつらを起動時に読み込んであげるようにします。最終的にこんな感じになりました。

DEVICEHIGH=BILING.SYS
DEVICEHIGH=HIGHMEM.SYS
DEVICEHIGH=JFONT.SYS /P=A:\
DEVICEHIGH=JDISP.SYS /HS=LC
DEVICEHIGH=JKEYB.SYS /101 A:\JKEYBRD.SYS 
DEVICEHIGH=ANSI.SYS

 コンベンショナルメモリ領域を確保したいから全部ハイメモリ領域に展開したけど、本当にこれでいいのかわからん。でもとりあえず動くからヨシ!
 ここまでの作業が終われば最小構成での起動ができます。フロッピーしか読めないし、ファイルの編集もできないけど。

CDドライバとかその他もろもろ

 流石にテキストファイルの編集ができないのは不便なので、EDITが使えるようにします。とは言っても、C:\DOS\から EDIT.COM と QBASIC.EXE をコピーしてくるだけでOKです。楽チン。  また、セットアップのためにはCD-ROMが読めないとダメなので、例によってOAKCDROM.SYSを組み込んであげます。どこにでもいる野生の9xを捕まえて、OAKCDROM.SYS と MSCDEX.EXEを引っこ抜きましょう。終わったらCONFIG.SYSにDEVICEHIGH=OAKCDROM.SYS /D:CD001を、AUTOEXEC.BATにC:\DOS\MSCDEX.EXE /D:CD001 /L:Eをそれぞれ追記します。これでCDも読めます。
 インストールでもするかね、って思ったんですけどFDISKとFORMATができないとどうにもならんので、FDISK.EXEとFORMAT.EXEもコピー、っと。

 これで無事にDOS環境からインストールCDのSETUP.EXEが動くようになりました。早速Windows Meをインストールしよ......え、何?「Windows98からのアップグレード限定」...?
 そういうのは先に確認するようにしましょう。僕との約束だよ!ではまたいつか。

Windows NT 3.51をインストールするお話

初投稿です。
先日ヤフオクで面白いものを購入したので、インストールしていきたいと思います。

何を買ったんですか

Windows NT Server 3.51です。詳しくはWikipediaでも読んどいてください。 現在のWindows 10はこのWindows NT系列で、名前の通りNT 10.0に当たります。

「じゃあNTじゃないWindowsもあるの?」

こう考える方(そもそもそんな人はこれを読まない)のために書いておくと、あの悪名高いWindows Meに代表される、MS-DOSを拡張したWindows 9x系があります。
いつかこの話についてちょっと書こうかな。

インストール準備編

というわけで仮想PC(VMWare)にNT3.51をインストールしていきます。 設定はこんな感じ。
・RAM:256MB
・HDD:1GB(SCSI)
NIC:ホストオンリー
・FD, CD
満を持して起動!と行きたいところですが、25年前のOSです。CDブートなんてことは当然できません。というわけで、こいつの力を借りたいと思います。
f:id:KLag:20201126154550p:plain
仮想フロッピーディスクを作って....
f:id:KLag:20201126155250p:plain
コントロールパネル→アプリケーションの(ry→起動ディスクって進んで.....
f:id:KLag:20201126155444p:plain 完成!!
Windows98があればMS-DOSの環境が手に入るんです、9x系はMS-DOSを拡張しているので。しかもこれスゴいのが、起動時にCDドライバを自動的に組み込んでくれるんですよ。AUTOEXEC.BATやらCONFIG.SYSやらをイジらなくていいのは楽ですね。

いざインストール!

それでは早速完成したディスクをVMWare上の仮想PCにマウントして起動していきます。 f:id:KLag:20201126160733p:plain
もちろんCD-ROMサポートを有効にして起動します。 f:id:KLag:20201126161023p:plain
起動した後はこんな感じです。コマンドプロンプトみたいな画面が出てきましたね。
「Cドライブが読めねぇよ!」って感じで怒られているので、ディスクのパーティション割りとフォーマットをしていきます。
起動ディスク1に入れ替えて、 A:\> fdiskf:id:KLag:20201126162018p:plain
あとはEnter連打でOK。 f:id:KLag:20201126162019p:plain
f:id:KLag:20201126162020p:plain
f:id:KLag:20201126162435p:plain
f:id:KLag:20201126162444p:plain
これでパーティションが作成されました。Escを押したらCtrl+Alt+Delで再起動します。
再起動が終わったら、A:\>format C: でフォーマットです。「データ消えるよ?」って言われるけど何も入ってないのでヨシ!(y) ボリュームラベルは何でもいいです。 f:id:KLag:20201127140808p:plain
で、フォーマットが完了。
ついでに、空のフロッピーディスクを4枚フォーマットしておきます。FORMAT.EXEが98のフロッピーに入ってるから、一旦シャットダウンして設定からフロッピードライブを追加しないとできないかも。まぁ上手くやってくれ。(VBoxなら最初からFAT12フォーマットした状態で作成できるぞ!!)

今回はEドライブにCDが割り当てられているので、A:\> E:でEドライブに移動したら、E:\> i386\winnt /T:Cを叩き込みます。 f:id:KLag:20201126163642p:plain
青い画面が出ました、BSoDですかね(すっとぼけ)
パスの入力は E:\i386って入力すればOKです。さすがにMIPSとかPowerPC、Alphaを使ってる人なんていないよね...? f:id:KLag:20201126164553p:plain
フロッピーディスクを4枚用意しろ」って言われるので言われた通りにしましょう。あとは挿し替え挿し替えを繰り返していきます。(これ実機だったら面白いんだろうなぁ、時間かかりそうだけど。)

f:id:KLag:20201126170314p:plain
フロッピーが完成したらCDデータのコピーが始まります。
ISOイメージに落とし込んでるのに結構時間がかかってしまうのは何故?調べてみましたがわかりませんでした!
f:id:KLag:20201126172532p:plain
コピーが終わりました。さっき作ったフロッピー(No.1)を突っ込んで再起動していきます。
再起動が終わったら、作ったフロッピーを番号順に入れるように指示されます。おとなしく従いましょう。

想定外

f:id:KLag:20201127030937p:plain
ここで悲しいお知らせがあります。
この画面でフリーズしやがりました。
しゃーない、諦めるか。 どうしようか考えた結果がこれ。VirtualBoxはVMDK形式の仮想ディスクに対応してるっぽいのでワンチャン狙っていきます。 f:id:KLag:20201127171316p:plain フロッピーを突っ込んで起動。Disk2, 3と挿し替えて...... f:id:KLag:20201127031924p:plain
キタキタキタ北千住!!!!
やっぱVirtualBoxしか勝たん(JK)。ちなみにVBoxのほうで最初からやり直してみたら「このファイルが足りないよ~ん」ってエラーが多発して使い物にならなかった。なんでだろ。
まぁいいや、Enterで続行。

続・セットアップ

f:id:KLag:20201127032608p:plain
ぼくはパソコンがよくわからないので、カスタムセットアップはできません。Enter。 f:id:KLag:20201127111620p:plain

これもEnter。 f:id:KLag:20201127155516p:plain
USキーボードを使っているのでSpace。JISキーボード民は全角/半角です。Dvorakとか親指シフトな人はS。そんな人いないよね? f:id:KLag:20201127155727p:plain
しれっとパーティションを512MBに縮小しています。
再起動後に「セットアップファイルが見つからないよ!」って怒られる場合は1GBより小さいパーティションを切って、そこにインストールしてあげるといいらしい。(ここでかなりの時間ハマりました。)
書いてて思ったんだけど、これNT3.51がFAT32を認識できないのが原因っぽい。FAT16でフォーマットしたら多分うまくいくと思う。
f:id:KLag:20201127162101p:plain
せっかくだから、俺はこのNTFSを選ぶぜ!! f:id:KLag:20201127162328p:plain
インストール先はお好みで。今回はC:¥WINNTに突っ込みます。
「コピー中」の文字とともにプログレスバーがにゅ~~~っと伸びていきます。(速すぎてスクショできなかったので画像はないです。) f:id:KLag:20201127164445p:plain
終わりました。Enterで再起動していきます。フロッピーは抜いておきましょう。
再起動が終わったら、GUIが表示されます。Windowsらしくなってきた。 f:id:KLag:20201127164851p:plain 名前を入力してEnter。確認ウィンドウが出たら「続行」をクリックします。 f:id:KLag:20201127165026p:plain f:id:KLag:20201127165427p:plain
ライセンスキーとかそういうのはないらしい。同時接続数を0にしたら「いろんなサービス無効化されるよ」って言われたので、ライセンスマネージャを使います。
続行すると「ライセンス事項に同意しろ!」って言われるので同意します。f:id:KLag:20201127170108p:plain f:id:KLag:20201127170128p:plain f:id:KLag:20201127170147p:plain
諸々の設定を済ませていきます。この辺は人によって選択する項目が変わってくると思うので詳細は省略します。
f:id:KLag:20201127170526p:plain f:id:KLag:20201127170600p:plain
管理者パスワードとかスワッピングファイルとか。時刻の設定もここでやっていきます。 f:id:KLag:20201127170716p:plain
VGAドライバは後で適用します。とりあえずは16色のきったねぇ画面で我慢。 f:id:KLag:20201127171614p:plain
せっかくなので作っておきましょう。1TBに比べたら1.44MBってあってないようなものだし。 f:id:KLag:20201127171757p:plain
おつかれさまでした。後は再起動して....... f:id:KLag:20201127171903p:plain f:id:KLag:20201127171951p:plain さっき設定したパスワードでログオンして....... f:id:KLag:20201127172058p:plain テテーン!!!(幻聴)
サウンドドライバがないためTADA.WAVは聞こえません。
ひとまず、これにてインストールは終了です。

まとめ

95以前のWindowsってなかなかイイものですね、これが初めてなんですけど。
「閉じる」ボタンがないとか、最小化したものがデスクトップに並んでいく感じとかがなかなか新鮮です。
GUIもまだ補助的でコピペするにもパスを打ち込まなきゃいけないのが結構アレですが、それも多分レトロなOSの楽しみ方なんだろうなぁとか思ってます。僕はWindows2000と同期なので。
また近いうちに、こいつにサウンドドライバとかVGAドライバとかを当てていく話をしようかな。
ではまたいつか。