Распечатать сообщение после загрузки бродячей машины с бродягой вверх

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

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

def hello
    puts 'hello'
end

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

hello 

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


person Roman Iuvshin    schedule 13.06.2015    source источник


Ответы (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!
person Cory Klein    schedule 26.04.2016

Вы также можете использовать переменную стиля 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: ------------------------------------------------------
person slm    schedule 31.05.2017

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

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 (как упоминалось в Vagrant Ошибка 1673) необходимо для подавления ошибки Ubuntu stdin: is not a tty.

person joemaller    schedule 17.08.2015
comment
Обратите внимание, что если вы хотите использовать переменную Ruby в аргументах, этот вопрос вы рассмотрели. - person Brian Brownton; 31.03.2016
comment
Что делать, если у вас есть Vagrantfile, который вызывает несколько виртуальных машин? Я не хочу, чтобы всплывающее сообщение появлялось несколько раз. я =действительно= хочу, чтобы он отображался после завершения всей обработки и до выхода vagrant. - person Juan Jimenez; 01.10.2017
comment
Это все еще работает, но его следует считать устаревшим в пользу config.vm.post_up_message, как указано в ответе Кори Кляйна от 26 апреля 2016 г. - person joemaller; 13.01.2018

Как только я начал изучать 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.

person Roman Iuvshin    schedule 12.10.2015

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

$ vagrant plugin install vagrant-triggers

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

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

к Vagrantfile.

person Jon Burgess    schedule 15.06.2015
comment
Это будет выполняться только для первого vagrant up и только после этого для vagrant provision. Следовательно, он может не совсем делать то, что вам нужно. - person Jon Burgess; 15.06.2015
comment
Обновленный ответ - наткнулся на другой плагин, который может делать то, что вы хотите. - person Jon Burgess; 22.07.2015

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

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

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

person Daniel Rhodes    schedule 16.05.2018