如何在“流浪”的同时自定义输出'运行?

时间:2016-03-09 13:18:22

标签: linux vagrant

我想通知流浪者用户所用机器的IP地址。我的第一个想法是使用' /etc/rc.local'并将ifconfig的输出打印到' / vagrant'中的文件中。目录,但似乎在调用rc.local后挂载此目录。所以我需要另一种方法来通知用户没有任何ssh登录。

我的第二个想法是将ifconfig输出写入某些" place"它在vagrant启动输出中显示...如下面的示例所示。

...
default: Guest Additions Version: 4.3.10
default: VirtualBox Version: 5.0
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
default: /vagrant => /home/user/vagrant/test
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
# start of desired output
Adresses found:
10.0.2.15
172.28.128.3
# end of desired output
==> default: flag to force provisioning. Provisioners marked to run always will still run.
...

欢迎所有想法。

3 个答案:

答案 0 :(得分:1)

首先,您需要确定如何获取IP地址(即DHCP或静态)。然后基于此,您基本上只需将私有网络代码添加到vargrantfile中:

DHCP:

Vagrant.configure("2") do |config|
  config.vm.network "private_network", type: "dhcp"

静态:

Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.50.4"

然后你可以添加一个shell和ruby的混合物:

$script = <<SCRIPT
  echo private_network...
  ip: "192.168.50.4"
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: $script

希望有足够的帮助让你前进。

答案 1 :(得分:1)

因为另一个答案没有描述如何从虚拟机内部发布动态数据,所以我写了我的解决方案。

步骤1:我将一个网络服务器放入vagrant vm并将访客端口80发布到主机端口8888

步骤2:准备guest的/etc/rc.local,以便收集所有需要的动态vm信息,并将输出写入文件'info.txt'中的webserver根目录

步骤3:向vagrantfile添加第二个配置条目,每个'vagrant up'运行并通知用户他可以在哪里获得更多信息

# Vagrantfile
...
config.vm.provision "shell", path: "scripts/bootstrap.sh"
config.vm.provision "shell", inline: "echo 'check http://localhost:8888/info.txt for more information'",
  run: "always"
...

答案 2 :(得分:1)

您可能对this SO answer感兴趣,vagrant-hostmanager试图在vagrant up上实现将网络接口的IP输出到终端的相同功能。

答案中的相关位 -

在客人身上:

/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}

应该得到这样的东西:

10.0.2.15

然后可以在你的Vagrant文​​件中使用它,如下所示:

config.vm.provision "shell", inline: <<-SHELL
    sudo -i /vagrant/my_provisioning_script.sh $(/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}')
SHELL

这里的技巧是知道哪个接口(上例中的eth0)具有您想要的IP。当然如果你对grep或awk很好,你可以修改第一个命令来检查所有接口上的IP ......但这超出了我的能力。

# content of Vagrantfile
$infoScript = <<SCRIPT
  echo 'IP-addresses of the vm ...'
  ifconfig | grep 'inet A' | grep Bcast | awk '{print $2}' | sed 's/addr://'
SCRIPT

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.box_check_update = false
  config.vm.network "private_network", type: "dhcp"
  config.vm.network "forwarded_port", guest: 80, host: 8888
  config.vm.provider "virtualbox" do |vb|
     vb.name = "demo"
     vb.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]
     vb.memory = "2048"
     vb.cpus = 2
  end
  # normal provision to set up the vm
  config.vm.provision "shell", path: "scripts/bootstrap.sh"
  # extra provision to print all the ip's of the vm
  config.vm.provision "shell", inline: $infoScript,
      run: "always"
end

修改 你可能也对Hakan's answer插件感兴趣,如果回显IP的目的只是为了你可以连接到盒子,这个插件可以修改你的客人的或主机因此您无需担心IP,而是使用类似http://mydevbox.local

的内容