Печать сообщения после загрузки машины vagrant с надписью " vagrant up"


Мне нужно вывести сообщение о завершении команды vagrant up.

Я попытался определить функцию:

def hello
    puts 'hello'
end

А затем вызываем его и конец файла:

hello 

Но он всегда печатает в начале вывода, а не в конце. Как я могу напечатать сообщение в конце?

6 13

6 ответов:

Vagrant теперь имеет встроенную поддержку для сообщения, появляющегося после vagrant up. Просто добавьте это к вашему Vagrantfile:

config.vm.post_up_message = "This is the start up message!"

А затем, когда ваша виртуальная машина появится, вы увидите это сообщение зеленым цветом:

==> default: Machine 'default' has a post `vagrant up` message. This is a message
==> default: from the creator of the Vagrantfile, and not from Vagrant itself:
==> default:
==> default:     This is the start up message!

Вы также можете использовать переменную стиля HEREDOC с config.vm.post_up_message следующим образом:

$msg = <<MSG
------------------------------------------------------
Local Websphere, accessible at 127.0.0.1

URLS:
 - app under test  - http://localhost:8080/<app url>/
 - ibm console     - http://localhost:9060/ibm/console

------------------------------------------------------
MSG

...
...

Vagrant.configure("2") do |config|
  config.vm.post_up_message = $msg
end

, что приведет к выходу примерно так:

==> default: Machine 'default' has a post `vagrant up` message. This is a message
==> default: from the creator of the Vagrantfile, and not from Vagrant itself:
==> default:
==> default: ------------------------------------------------------
==> default: Local Websphere, accessible at 127.0.0.1
==> default:
==> default: URLS:
==> default:  - app under test  - http://localhost:8080/<app url>/
==> default:  - ibm console     - http://localhost:9060/ibm/console
==> default:
==> default: ------------------------------------------------------

Vagrant не нуждается в плагине для отображения сообщения в конце, просто добавьте оболочку provisioner после всех ваших других provisioners и имейте это эхо, что вы хотите.

config.vm.provision "ansible" do |ansible|
  # ... or other existing provisioners

config.vm.provision "shell", privileged: false, inline: <<-EOF
  echo "Vagrant Box provisioned!"
  echo "Local server address is http://#{$hostname}"
EOF

С этим, vagrant up должно закончиться примерно так:

==> default: Running provisioner: shell...
    default: Running: inline script
==> default: Vagrant Box provisioned!
==> default: Local server address is http://vagrant.dev

Добавление privileged: false (Как упоминалось в VagrantIssue 1673 ) необходимо для подавления ошибки Ubuntu stdin: is not a tty.

Попробуйте плагин vagrant-triggers:

$ vagrant plugin install vagrant-triggers

Затем добавить:

config.trigger.after :up do
  puts 'hello'
end

К Vagrantfile.

Как только я начал изучать Ruby, я нашел идеальное решение :)

BEGIN объявляет код, вызываемый перед запуском программы.

#!/usr/bin/ruby
puts "This is main Ruby Program"
BEGIN {
    puts "Initializing Ruby Program"
}

Она произведет следующее:

Initializing Ruby Program
This is main Ruby Program

И он прекрасно работает внутри Vagrantfile.

Решение heredoc из @slm супер-мило, но вы также можете поместить heredoc в Рубин таким образом:

config.vm.post_up_message = <<-HEREDOC
  This is line 1
  This is line 2
  THis is line 3
HEREDOC

На самом деле существует несколько слегка отличающихся стилей Ruby heredoc: https://infinum.co/the-capsized-eight/multiline-strings-ruby-2-3-0-the-squiggly-heredoc