Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
2019 - PVE 社群 - Rails 串接 Proxmox VE API 自動化教學用虛...
Search
蒼時弦や
December 07, 2019
Programming
680
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
2019 - PVE 社群 - Rails 串接 Proxmox VE API 自動化教學用虛擬機分配
再接案公司用 Proxmox VE 建制簡易的練習 VM 環境,讓同事可以在需要的時候申請機器來練習使用。
蒼時弦や
December 07, 2019
More Decks by 蒼時弦や
See All by 蒼時弦や
2024 - COSCUP - Clean Architecture in Rails
elct9620
2
220
2023 - RubyConfTW - Rethink Rails Architecture
elct9620
0
280
20230916 - DDDTW - 導入 Domain-Driven Design 的最佳時機
elct9620
0
520
2023 - WebConf - 選擇適合你的技能組合
elct9620
0
750
20230322 - Generative AI 小聚 ft. Happy Designer
elct9620
0
500
2022 - 默默會 - 重新學習 MVC 的 Model
elct9620
1
520
MOPCON 2022 - 從 Domain-Driven Design 看網站開發框架隱藏
elct9620
1
550
2022 - COSCUP - 我想慢慢寫程式該怎麼辦?
elct9620
0
320
2022 - COSCUP - 打造高速 Ruby 專案開發流程
elct9620
0
360
Other Decks in Programming
See All in Programming
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
160
Workers Cache を知る
syumai
0
210
Building an Out-of-Order CPU
latte72
1
800
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.4k
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
510
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
910
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
190
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
150
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
310
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
270
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
160
Intent as Code
shoppingjaws
6
1.1k
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Docker and Python
trallard
47
4.2k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Darren the Foodie - Storyboard
khoart
PRO
4
3.9k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
530
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
560
Transcript
Rails 串接 Proxmox VE API 自動化教學用虛擬機分配 Photo by Franck V.
on Unsplash
WEB DEVELOPER GAME DEVELOPER ࣌ ݭ @elct9620
None
為什麼 使用 Proxmox VE?
Photo by Hal Gatewood on Unsplash 接案公司
Photo by Jordan Harrison on Unsplash 硬體資源不足
Photo by NESA by Makers on Unsplash 技術交接容易
為什麼 要做虛擬機練習系統?
Photo by Christina @ wocintechchat.com on Unsplash 熟悉 DevOps 的人太少
Photo by Jordan Sanchez on Unsplash 練習的機會不多
Photo by Christian Fregnan on Unsplash 人工開設虛擬機並不方便
如何用 Proxmox VE 解決 問題?
API Snapshot Qemu Agent + +
require 'net/http' rquire 'oj' uri = URI('https:!//192.168.100.220:8006/api2/json/access/ticket') req = Net!::HTTP!::Post.new
req['Content-Type'] = 'application/x-!!www-form-urlencoded' req.body = URI.encode_!!www_form(username: 'xxx@pve', password: 'xxx') token = {} Net!::HTTP.start(uri.host, uri.port, use_ssl: true) do |http| res = http.request(req) token = Oj.load(res.body)&.fetch('data', {}) end puts token['ticket'] # !=> XXXX puts token['CSRFPreventionToken'] # !=> XXX
require 'net/http' rquire 'oj' uri = URI(TICKET_URI) req = Net!::HTTP!::Post.new
req['Content-Type'] = 'application/x-!!www-form-urlencoded' req.body = URI.encode_!!www_form( username: 'xxx@pve', password: 'xxx' )
token = {} Net!::HTTP.start( uri.host, uri.port, use_ssl: true ) do
|http| res = http.request(req) token = Oj.load(res.body)&.fetch('data', {}) end puts token['ticket'] # !=> XXXX puts token['CSRFPreventionToken'] # !=> XXX
req = Net!::HTTP!::Get.new(uri) req['Cookie'] = "PVEAuthCookie=!#{token['ticket']}"
req = Net!::HTTP!::Post.new(uri) req['Cookie'] = "PVEAuthCookie=!#{token['ticket']}" req['CSRFPreventionToken'] = token['CSRFPreventionToken']
詳細的文件可以在 Wiki 中找到
非同步 行為處理
Proxmox!::API.post('nodes/pve/100/status/start') .fetch(:data) # !=> UPID:pve:00001560:3C9C598C:5C6944F7:qmstart: 100:user@pve:
需要自己用 UPID 確認狀態
loop do status = task('pve', upid) break if status['exitstatus'] !==
'OK' sleep 1 end
Snapshot Backup VS
None
如何 自動設定 SSH Key 到機器
None
None
File Write Qemu Agent VM PlayGround GitLab Public Key
File Write Qemu Agent VM PlayGround GitLab Public Key 從
GitLab 取出 使用者 Public Key
File Write Qemu Agent VM PlayGround GitLab Public Key 透過
Proxmox API 控制 Qemu Agent
File Write Qemu Agent VM PlayGround GitLab Public Key 將
Public Key 寫入 指定的虛擬機
預設 權限不足,需要自己調整 SELinux
None
THANKS