Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
2019 - PVE 社群 - Rails 串接 Proxmox VE API 自動化教學用虛...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
蒼時弦や
December 07, 2019
Programming
650
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
210
2023 - RubyConfTW - Rethink Rails Architecture
elct9620
0
240
20230916 - DDDTW - 導入 Domain-Driven Design 的最佳時機
elct9620
0
480
2023 - WebConf - 選擇適合你的技能組合
elct9620
0
690
20230322 - Generative AI 小聚 ft. Happy Designer
elct9620
0
470
2022 - 默默會 - 重新學習 MVC 的 Model
elct9620
1
510
MOPCON 2022 - 從 Domain-Driven Design 看網站開發框架隱藏
elct9620
1
540
2022 - COSCUP - 我想慢慢寫程式該怎麼辦?
elct9620
0
300
2022 - COSCUP - 打造高速 Ruby 專案開發流程
elct9620
0
330
Other Decks in Programming
See All in Programming
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
120
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
390
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
150
Contextとはなにか
chiroruxx
0
290
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
530
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
5
4k
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
180
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
350
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
320
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
240
Featured
See All Featured
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
390
From π to Pie charts
rasagy
0
210
Embracing the Ebb and Flow
colly
88
5.1k
GraphQLとの向き合い方2022年版
quramy
50
15k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
330
Designing Powerful Visuals for Engaging Learning
tmiket
1
410
New Earth Scene 8
popppiees
3
2.3k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Utilizing Notion as your number one productivity tool
mfonobong
4
320
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
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