Proxmox API。 はじめに

みなさんこんにちは!

今日は、悪名高い仮想化システムであるProxmoxのAPIの使用について少しお話ししたいと思います。



背景...

数年前、悪名高いヘッツナーのデータセンターの1つにある良い車を手にしたとき、proxmoxに出会いました。 当時、私たちは私たちのニーズに合わせて仮想化を高めることについて疑問を持っていました。 VMWare、OpenStack、そしてもちろんProxmoxなど、いくつかのオプションを検討しました。 私は彼が他の2人の候補者よりも優れているとは言いませんが、その瞬間に彼は私たちのニーズを完全に満たしました。 しばらくして、仮想マシンのステータスを監視し、VMを起動/停止し、再起動し、いくつかの設定を管理できるサードパーティユーザー向けの一種のコントロールパネルを作成する必要がありました。 もちろん、proxmoxを使用すると、ユーザーとユーザーグループを追加し、それらに権限を割り当てることができます。 しかし、このオプションは私たちには適していませんでした。 今の状態はわかりませんが、当時はロシア語でのProxmox APIの通常のドキュメントはありませんでした。 もちろん、これで私を止めることはできず、私は英語版を完全に管理しました。 しかし、英語とうまく通じない人が常にいます。 したがって、この記事はあなたのためです。

すぐに、予約したすべてのVM(仮想マシン)がKVMに基づいていることを予約します。 したがって、この記事で検討するAPIは、PhPを使用するKVMベースのマシン用です。







それでは始めましょう...



APIを使用するには、githubリポジトリから取得できるPhPクラスが必要です。

APIサーバーへのリクエストのタイプは、GET、POST、PUTの3つのタイプのみに分類されます。 そして、JSON形式で回答を受け取ります。



ダウンロードしたAPIクラスを含むindex.phpファイルを作成し、オブジェクトを作成します。



require_once "proxmox.api.php"; $px = new PVE2_API("192.168.2.1", "root", "pam", "my_password");
      
      





パラメータとして、サーバーのIP、ユーザー名、パスワードを示します。

デフォルトでは、proxmoxはポート8006にインストールされます。 ただし、変更した場合は、proxmox APIクラスのポートも変更する必要があります。 これを行うには、次のような行を見つける必要があります(3行のみです)。

curl_setopt($prox_ch, CURLOPT_URL, "https://".$this->pve_hostname.":8006/api2/json/access/ticket");







この93行があります。 (クラスをダウンロードした時点で、たぶんいくつかの変更があるかもしれません。チェックしませんでした)8006を必要な値に置き換えます。



サーバーで認証が成功したかどうかを確認するには、次の方法を使用する必要があります。



 if($px->constructor_success()){ if($px->login()){ // do something.. } }
      
      







ここで、最初の要求を満たそうとします。これにより、関心のあるVMに関する情報が得られます。 各仮想マシンには固有の識別番号があり、それによって情報を受け取ります。 各VMは、独自の「ノード」(ノード)に配置することもできます。この「ノード」も要求に参加します。



 if($px->constructor_success()){ if($px->login()){ $status = $px->get("/nodes/node2/qemu/100/status/current"); var_dump($status); } }
      
      





ここで、node2は使用しているノードの名前、100はVMのIDです。



その結果、次のような結果が得られます。

 array(19) { ["disk"]=> int(0) ["status"]=> string(7) "running" ["ha"]=> int(0) ["freemem"]=> int(518893568) ["qmpstatus"]=> string(7) "running" ["netout"]=> int(214648283) ["maxdisk"]=> int(21474836480) ["maxmem"]=> int(3221225472) ["pid"]=> string(6) "526695" ["uptime"]=> int(2585643) ["balloon"]=> int(3221225472) ["cpu"]=> float(0.089612785396815) ["netin"]=> int(3038528849) ["diskread"]=> int(5224400988) ["template"]=> string(0) "" ["name"]=> string(15) "vds-192.168.1.9" ["diskwrite"]=> int(100378349568) ["mem"]=> int(2638614528) ["cpus"]=> int(1) }
      
      







大部分は、ここではすべてが明確であるため、コメントしません。さらに先に進みます。

VMのステータスを受け取った前の例では、GETリクエストを使用しました。 原則として、GETは情報の受信、POST、およびPUTに使用され、いくつかのアクションを実行したり、設定を変更したりします。



次に、仮想マシンを停止してみます。 これを行うには、vmid(仮想マシン識別子とノード)を使用してPOSTリクエストを送信します。



 if($px->constructor_success()){ if($px->login()){ $px->post("/nodes/node2/qemu/192/status/shutdown", array("forceStop" => true)); } }
      
      







ご覧のとおり、すべてが非常に簡単です。 POSTリクエストの最初のパラメーターはVMに関する情報であり、2番目のパラメーターは必ずしもオプションのパラメーターではありません。 この場合、わかりやすくするために、forceStopパラメーターを使用しました。 VMは、何らかの理由で「自発的に」作業を完了できない場合があります。 これは、システムエラー、ダングリングプロセスなど、さまざまな理由で発生する可能性があります。 そのため、forceStopパラメーターはproxmox'uに、マシンがとにかく作業を完了する必要があることを伝えます。 パラメータの完全なリストは、ドキュメントに記載されています。



VMを実行します。



 if($px->constructor_success()){ if($px->login()){ $start = $px->post("/nodes/node2/qemu/192/status/start"); } }
      
      







VMステータスに使用できるすべてのコマンド:







設定に移りましょう...



通常どおり、特定のVMの設定を取得します。



 if($px->constructor_success()){ if($px->login()){ $start = $px->get("/nodes/node2/qemu/166/config"); var_dump($start); } }
      
      







すべてが正常であれば、次の結果が得られます。



 array(10) { ["net0"]=> string(36) "e1000=9A:7B:96:C7:C4:7D,bridge=vmbr0" ["ide2"]=> string(59) "local:iso/debian-6.0.7-amd64-CD-1.iso,media=cdrom,size=645M" ["name"]=> string(15) "san-192.168.1.9" ["bootdisk"]=> string(4) "ide0" ["cores"]=> int(1) ["ide0"]=> string(50) "local:166/vm-166-disk-1.qcow2,format=qcow2,size=1G" ["ostype"]=> string(3) "l26" ["memory"]=> int(512) ["sockets"]=> int(1) ["digest"]=> string(40) "2aa7fcf6cbaff2f11d2f50f1b7b18fc97d2b04d6" }
      
      







VM構成をインストールするには、PUT要求を使用する必要があります。



 if($px->constructor_success()){ if($px->login()){ $px->put("/nodes/node2/qemu/166/config", array( )); } }
      
      







配列内の必要なパラメーターとその値を指定する必要があります。 多くのパラメータがあり、公式のドキュメントに記載されているため、すべてのパラメータを提供するわけではありません。 一部のアドインを有効にするには、VMの再起動が必要です。



もう少しおもしろい。 仮想マシンの作成プロセスを自動化することが必要になる場合があります。 これについては、次の記事で詳しく説明しますが、最も短気な人のために、ここで小さな例を紹介します。



 if($px->constructor_success()){ if($px->login()){ $d = array( 'vmid' => '777', 'memory' => '300', 'cores' => '2', 'autostart' => true, 'ostype' => 'l26', 'ide0' => 'local:32,format=qcow2', 'ide2' => 'local:iso/ubuntu-12.04.2-server-amd64.iso,media=cdrom', 'net0' => 'e1000,bridge=vmbr0' ); $px->post("/nodes/node2/qemu", $d); $px->post("/nodes/node2/qemu/777/status/start"); } }
      
      







ここで:







今のところすべてです。 次のパートでは、上記で説明したメソッドを掘り下げ、その時点でAPIで見つけられなかった微妙な点について説明します。



PS記事を1つ差し引く代わりに、少し時間をかけて、何が悪いのか、何が好きではないのか、もっと見たいと思うのかを説明してください。 これにより、自分の間違いを理解でき、将来それらを犯すことがなくなります。



ご清聴ありがとうございました。



All Articles