@minotavr1712

Как в Python получить ip-адрес виртуалки, созданной вагрантом?

Vagrantfile:
Vagrant.configure("2") do |config|

  N = 3

  (1..N).each do |i|
    config.vm.box = "generic/ubuntu2004"
    config.vm.define "node_#{i}" do |node|
      node.vm.network "public_network", type: "dhcp"
      node.vm.hostname = "vm#{i}"
      node.vm.provider :vmware_desktop do |vb|
        vb.memory = 2048
        vb.cpus = 1
        vb.gui = false
      end
    end
  end
  config.vm.provision "shell" do |s|
    ssh_pub_key = File.readlines("/home/eugene/.ssh/eugene.pub").first.strip
    s.inline = <<-SHELL
      mkdir /root/.ssh
      echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
      echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
    SHELL
  end
end


Функция получения ip-адреса:
def __get_local_ip(self):
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

            sock.connect(('8.8.8.8', 80))
            print("Got ip ", sock.getsockname()[0])

            return sock.getsockname()[0]
        except socket.error:
            try:
                return socket.gethostbyname(socket.gethostname()) 
            except socket.gaierror:
                return '127.0.0.1'
        finally:
            sock.close()


Полученные ip-адреса при создании виртуалки:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:f4:61:65 brd ff:ff:ff:ff:ff:ff
    inet 172.16.57.204/24 brd 172.16.57.255 scope global dynamic eth0
       valid_lft 1786sec preferred_lft 1786sec
    inet6 fe80::20c:29ff:fef4:6165/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:f4:61:6f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.206/24 brd 192.168.0.255 scope global dynamic eth1
       valid_lft 258121sec preferred_lft 258121sec
    inet6 fe80::20c:29ff:fef4:616f/64 scope link 
       valid_lft forever preferred_lft forever


При вызове функции __get_local_ip() на виртуалке получаю то "Got ip 172.16.57.204", то "Got ip 192.168.0.206".
Как сделать так, чтобы назначался только 192.168.0.206? Может вагрант сконфижил неправильно, может код получение айпишника можно как-то доработать
  • Вопрос задан
  • 272 просмотра
Пригласить эксперта
Ответы на вопрос 1
TemaSM
@TemaSM
Fullstack, DevOps, InfSec
Проблема заключается в том, что вы используете тип сетевого подключения public_network, который позволяет вашей виртуальной машине получать IP-адрес от DHCP-сервера, находящегося в вашей локальной сети. Это означает, что IP-адрес, который вы получаете в своей функции __get_local_ip(), может меняться при каждом запуске виртуальной машины, так как он зависит от IP-адреса, выданного DHCP-сервером.

Если вы хотите назначать статический IP-адрес вашей виртуальной машине, вы можете использовать тип сетевого подключения private_network. Для этого вам необходимо изменить конфигурацию виртуальной машины в Vagrantfile следующим образом:
Vagrant.configure("2") do |config|

  N = 3

  (1..N).each do |i|
    config.vm.box = "generic/ubuntu2004"
    config.vm.define "node_#{i}" do |node|
      node.vm.network "private_network", ip: "192.168.50.#{i}"
      node.vm.hostname = "vm#{i}"
      node.vm.provider :vmware_desktop do |vb|
        vb.memory = 2048
        vb.cpus = 1
        vb.gui = false
      end
    end
  end
  config.vm.provision "shell" do |s|
    ssh_pub_key = File.readlines("/home/eugene/.ssh/eugene.pub").first.strip
    s.inline = <<-SHELL
      mkdir /root/.ssh
      echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
      echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
    SHELL
  end
end

Здесь мы изменили тип сетевого подключения на private_network и назначили статический IP-адрес каждой виртуальной машине, используя опцию ip. В данном примере IP-адреса будут назначены в диапазоне 192.168.50.1-3.

Теперь, когда вы запустите виртуальную машину, она всегда будет иметь тот же IP-адрес, что вы назначили в Vagrantfile, и вы можете использовать этот IP-адрес в своей функции __get_local_ip() для получения IP-адреса виртуальной машины.

Если ответ помог или считаете что может быть полезен другим - не забудьте отметить его как решение вашего вопроса. Успехов!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы