@@ -6,6 +6,9 @@ require 'net/http'
66require 'uri'
77require 'csv'
88
9+ # 表示用の定数
10+ SEPARATOR_WIDTH = 60 # セパレーター行の幅
11+
912# Minitestタスクの定義
1013Rake ::TestTask . new ( :test ) do |t |
1114 t . libs << "test"
@@ -49,10 +52,10 @@ task :default => :test
4952desc "利用可能なDojoPaaS管理タスクをすべて表示"
5053task :default do
5154 puts "\n 🔧 DojoPaaS 管理タスク"
52- puts "=" * 50
55+ puts "=" * SEPARATOR_WIDTH
5356 puts "'rake -T' ですべての利用可能なタスクを確認"
5457 puts "'rake -D [タスク名]' で詳細な説明を表示"
55- puts "=" * 50
58+ puts "=" * SEPARATOR_WIDTH
5659 sh "rake -T"
5760end
5861
@@ -127,7 +130,7 @@ namespace :server do
127130
128131 puts "✅ 有効なIPアドレス: #{ validated_ip_str } "
129132 puts "🔍 サーバー情報を検索中..."
130- puts "-" * 50
133+ puts "-" * SEPARATOR_WIDTH
131134
132135 # 検証済みIPでinitialize_server.rbスクリプトを実行(コマンドエコーを抑制)
133136 sh "ruby scripts/initialize_server.rb --find #{ validated_ip_str } " , verbose : false
@@ -153,7 +156,7 @@ namespace :server do
153156
154157 puts "📋 Issue処理中: #{ issue_url } "
155158 puts "🔍 サーバー情報を抽出中..."
156- puts "-" * 50
159+ puts "-" * SEPARATOR_WIDTH
157160
158161 sh "ruby scripts/initialize_server.rb --find #{ issue_url } " , verbose : false
159162 end
@@ -171,7 +174,7 @@ namespace :server do
171174 end
172175
173176 puts "🔍 サーバー名で検索: #{ name } "
174- puts "-" * 50
177+ puts "-" * SEPARATOR_WIDTH
175178
176179 sh "ruby scripts/initialize_server.rb --find #{ name } " , verbose : false
177180 end
@@ -319,25 +322,62 @@ namespace :server do
319322 desc "現在稼働中のサーバー一覧を表示"
320323 task :list do
321324 require_relative 'scripts/sakura_server_user_agent'
322-
325+ require 'dotenv/load'
326+
323327 puts "📋 サーバー一覧を取得中..."
324328 puts "データソース: #{ SakuraServerUserAgent ::INSTANCES_CSV_URL } "
325- puts "-" * 50
326-
329+ puts "-" * SEPARATOR_WIDTH
330+
327331 begin
328332 uri = URI ( SakuraServerUserAgent ::INSTANCES_CSV_URL )
329333 response = Net ::HTTP . get_response ( uri )
330-
334+
331335 if response . code == '200'
332336 # エンコーディングを明示的に設定してCSVを解析(無効な文字を安全に処理)
333337 response . body . force_encoding ( 'UTF-8' ) . scrub ( '?' )
334338 csv_data = CSV . parse ( response . body , headers : true )
339+
340+ # APIクライアントを初期化(ステータス確認用)
341+ server_statuses = { }
342+ if ENV [ 'SACLOUD_ACCESS_TOKEN' ] && ENV [ 'SACLOUD_ACCESS_TOKEN_SECRET' ]
343+ begin
344+ # デフォルトパラメータ(石狩第二)が自動的に使用される
345+ client = SakuraServerUserAgent . new
346+ servers_data = client . get_servers ( )
347+ if servers_data && servers_data [ 'Servers' ]
348+ servers_data [ 'Servers' ] . each do |server |
349+ server_statuses [ server [ 'Name' ] ] = server [ 'Instance' ] [ 'Status' ]
350+ end
351+ end
352+ rescue
353+ # エラーは無視してステータスなしで続行
354+ end
355+ end
335356
336357 puts "📊 サーバー一覧(#{ csv_data . length } 台):"
337358 puts ""
338-
359+
339360 csv_data . each do |row |
340- puts " 🖥️ #{ row [ 'Name' ] } "
361+ server_name = row [ 'Name' ]
362+ status = server_statuses [ server_name ]
363+
364+ # ステータスに応じた絵文字と表示を設定
365+ status_display = if status
366+ case status
367+ when 'up'
368+ " (✅ up)"
369+ when 'down'
370+ " (⏸️ down)"
371+ when 'cleaning'
372+ " (🧹 cleaning)"
373+ else
374+ " (❓ #{ status } )" # 予期しないステータスの場合
375+ end
376+ else
377+ "" # APIが利用できない場合は何も表示しない
378+ end
379+
380+ puts " 🖥️ #{ server_name } #{ status_display } "
341381 puts " IPアドレス: #{ row [ 'IP Address' ] } " # スペースを追加
342382 puts " 説明: #{ row [ 'Description' ] } " if row [ 'Description' ]
343383 puts ""
@@ -359,6 +399,15 @@ namespace :server do
359399 end
360400 puts ""
361401
402+ # ステータス表示についての注記
403+ if !ENV [ 'SACLOUD_ACCESS_TOKEN' ] || !ENV [ 'SACLOUD_ACCESS_TOKEN_SECRET' ]
404+ puts "ℹ️ 注: API認証情報が設定されていないため、サーバーステータス(up/down)は表示されていません"
405+ puts " ステータスを表示するには、SACLOUD_ACCESS_TOKEN と SACLOUD_ACCESS_TOKEN_SECRET を設定してください"
406+ elsif server_statuses . empty?
407+ puts "ℹ️ 注: API接続エラーのため、サーバーステータス(up/down)を取得できませんでした"
408+ end
409+ puts ""
410+
362411 else
363412 abort "❌ エラー: サーバー一覧の取得に失敗しました (HTTP #{ response . code } )"
364413 end
@@ -367,6 +416,55 @@ namespace :server do
367416 abort "❌ エラー: #{ e . message } "
368417 end
369418 end
419+
420+ # ========================================
421+ # 個別サーバー作成タスク(テスト用)
422+ # ========================================
423+ desc "指定したサーバーを個別に作成(テスト用)"
424+ task :create , [ :server_name ] => [ :check_api_credentials ] do |t , args |
425+ server_name = args [ :server_name ]
426+
427+ unless server_name
428+ abort "❌ エラー: サーバー名が必要です\n " \
429+ "使い方: rake server:create[coderdojo-japan]\n " \
430+ "注意: servers.csvに登録されているサーバー名を指定してください"
431+ end
432+
433+ puts "=" *SEPARATOR_WIDTH
434+ puts "🚀 DojoPaaS 個別サーバー作成"
435+ puts "=" *SEPARATOR_WIDTH
436+ puts ""
437+ puts "サーバー名: #{ server_name } "
438+ puts ""
439+
440+ # deploy.rbのCoderDojoSakuraCLIクラスを使用(DRY原則)
441+ require_relative 'scripts/deploy'
442+
443+ cli = CoderDojoSakuraCLI . new ( [ ] )
444+ success = cli . create_single_server ( server_name )
445+
446+ if success
447+ puts ""
448+ puts "=" *SEPARATOR_WIDTH
449+ puts "✅ サーバー作成プロセス完了"
450+ puts "=" *SEPARATOR_WIDTH
451+ puts ""
452+ puts "【次のステップ】"
453+ puts "1. SSHで接続確認:"
454+ puts " ssh ubuntu@<IPアドレス>"
455+ puts ""
456+ puts "2. スタートアップスクリプトの実行状況確認:"
457+ puts " ssh ubuntu@<IPアドレス> 'sudo tail -f /var/log/cloud-init-output.log'"
458+ puts ""
459+ else
460+ puts ""
461+ puts "=" *SEPARATOR_WIDTH
462+ puts "❌ サーバー作成に失敗しました"
463+ puts "=" *SEPARATOR_WIDTH
464+ exit 1
465+ end
466+ end
467+
370468end
371469
372470# ヘルパーメソッド(将来の拡張用に保持)
0 commit comments