バックグラウンドで実行されている VM に割り当てられた IP アドレスを取得するにはどうすればよいですか?

バックグラウンドで実行されている VM に割り当てられた IP アドレスを取得するにはどうすればよいですか?

次のコマンドを使用して、Virtual Box から Ubuntu インスタンスをバックグラウンドで実行します。

VBoxManage startvm ${VM_NAME} --type headless

GUI 経由で実行する場合との主な違いは、起動後に GUI に入るとifconfigIP アドレスを確認してsshホスト上の端末からアクセスでき、バックグラウンドでは当然できないことです。

ネットワーク上で IP アドレスが動的に割り当てられていると仮定した場合、ssh の目的で新しく作成されたインスタンスに割り当てられた IP を抽出する方法はありますか。または、IP を知らなくても (たとえば、ホストのバックドア ポート経由で) ssh で接続する方法はありますか。

答え1

VBoxManageコマンドを使用してIPアドレスを抽出できます。このフォーラム投稿virtualbox.org で:

VBoxManage guestproperty enumerate <vmname>

ただし、特別な理由がない限り、ゲスト VM に静的 IP アドレスを割り当てることを強く検討してください。これは、DHCP を使用している場合でも可能です。DHCP サーバーが割り当てる範囲外の IP アドレスを選択するだけです。

答え2

まず最初にインストールしたことを確認してくださいVirtualBox 拡張パックそうでない場合はインストールしてください。

例えば(Ubuntuの場合)

> wget http://download.virtualbox.org/virtualbox/4.2.12/Oracle_VM_VirtualBox_Extension_Pack-4.2.12-84980.vbox-extpack
> sudo VBoxManage extpack install ./Oracle_VM_VirtualBox_Extension_Pack-4.2.12-84980.vbox-extpack

または

https://www.virtualbox.org/wiki/ダウンロード

その後、VMのIPを取得できます

VBoxManage guestproperty enumerate <_name_of_VM_> | grep IP | grep -o -w -P -e '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

答え3

Guest Additionをインストールしなくても実行できます

しかし、ネットワークについて知っておく必要があります。
例えば、2つのアダプタを持つVMがあります。
2つのネットワークアダプタ

1つはインターネット通信用、
もう1つはホストのみの通信用

コマンドでネットワークを見ることができますVBoxManage リスト

NAT ネットワーク:

% VBoxManage は NATNET をリストします
ネットワーク名: NatNetwork
IP: 10.10.12.1
ネットワーク: 10.10.12.0/24
DHCP 有効: はい
有効: はい

ホストのみのネットワーク

% VBoxManage リスト hostonlyifs
名前: vboxnet0
DHCP: 無効
IPアドレス: 192.168.6.1
ネットワークマスク: 255.255.255.240


ここでは実行中のVMを表示するメイン部分です

% vboxmanage 実行中のvmsをリストします
「centos7 node0 IP テスト」 {46ec9075-f49b-4d16-9867-d56710b6a3da}

VM uuid が必要です
。46ec9075-f49b-4d16-9867-d56710b6a3da です。

MACアドレスを取得できるようになりました

% vboxmanage showvminfo --details 46ec9075-f49b-4d16-9867-d56710b6a3da | fgrep MAC
NIC 1: MAC: 08002783E8BB、アタッチメント: NAT ネットワーク 'NatNetwork'、ケーブル接続: オン、トレース: オフ (ファイル: なし)、タイプ: 82540EM、報告された速度: 0 Mbps、ブート優先度: 0、Promisc ポリシー: 拒否、帯域幅グループ: なし
NIC 2: MAC: 080027D992F0、アタッチメント: ホストオンリー インターフェイス 'vboxnet0'、ケーブル接続: オン、トレース: オフ (ファイル: なし)、タイプ: 82540EM、報告された速度: 0 Mbps、ブート優先度: 0、Promisc ポリシー: 拒否、帯域幅グループ: なし

'NatNetwork' の最初のアダプタの 08002783E8BB通信網
'vboxnet0' の 2 番目のアダプタ用の 080027D992F0インターフェース

これで最初のアダプタのDHCPテーブルからIPを取得できるようになりました

% vboxmanage dhcpserver findlease --network NatNetwork --mac-address=08002783E8BB
IPアドレス: 10.10.12.4                     
MAC アドレス: 08:00:27:83:e8:bb
状態: 確認済み
発行日: 2020-07-13T13:31:20Z (1594647080)
有効期限: 2020-07-13T13:41:20Z (1594647680)
TTL: 600 秒、現在残り 586 秒

そして2番目

% vboxmanage dhcpserver findlease --interface vboxnet0 --mac-address=080027D992F0
IPアドレス: 192.168.6.3
MAC アドレス: 08:00:27:d9:92:f0
状態: 確認済み
発行日: 2020-07-13T13:29:06Z (1594646946)
有効期限: 2020-07-13T13:39:06Z (1594647546)
TTL: 600 秒、現在残り 399 秒


natネットワークの場合はオプション--networkを使用し、
ホストのみのアダプタの場合はオプション--interfaceを使用することに注意してください。

ホストからSSHでこのVMに接続します

% ssh[メールアドレス]
[メールアドレス]のパスワード:
最終ログイン: 2020年7月13日月曜日 09:05:33
[ルート@node0 ~]#

答え4

これは私が手動でも Ansible でも実行する方法と同じです。「/Net/0/」は最初のネットワーク インターフェイス、「/Net/1/」は 2 番目のネットワーク インターフェイスなどです。「/V4/」は IPv4 用、「/V6/」は IPv6 用です。

IPv4バージョン

VBoxManage guestproperty get <uuid|vmname> "/VirtualBox/GuestInfo/Net/0/V4/IP" | sed -e 's/Value: //g'

IPV6バージョン

VBoxManage guestproperty get <uuid|vmname> "/VirtualBox/GuestInfo/Net/0/V6/IP" | sed -e 's/Value: //g'

簡単なスクリプトにすると:

#!/bin/sh
for VM in $(VBoxManage list runningvms | awk -F\{ '{print $2}' | sed -e 's/}//g');
do {
  VMNAME="$(VBoxManage showvminfo ${VM} --machinereadable | awk -F\= '/^name/{print $2}')"
  VMIP=$(VBoxManage guestproperty get ${VM} "/VirtualBox/GuestInfo/Net/0/V4/IP" | sed -e 's/Value: //g')
  printf "VM-IP: %-16s VM-Name: %-50s\n" "${VMIP}" "${VMNAME}"
} done

これにより、実行中のすべての VM について次のような出力が提供されます。

VM-IP: 10.13.172.82     VM-Name: "Ansible Lab VM1 Master"
VM-IP: 10.13.172.84     VM-Name: "Ansible Lab VM2 Slave CentOS"
VM-IP: 10.13.172.83     VM-Name: "Ansible Lab VM3 Slave Win10"
...etc

注意: Guest Additions をインストールする必要があります。

関連情報