Vagrant provision 在没有明显原因的情况下无法执行下一个脚本

Vagrant provision fails to execute the next script without an obvious reason why

我 created/co-opted 几个 bash 脚本来配置我的客人 Ubuntu 14.04 OS;现在给我带来麻烦的是安装 ffmpeg。当脚本完成时,vagrant 除了发送 SSH keep-alives 之外什么都不做。

主机 OS: Windows 7 x64

无限重复保活之前的最后输出是:

INSTALL libavutil/sha.h
INSTALL libavutil/sha512.h
INSTALL libavutil/stereo3d.h
INSTALL libavutil/threadmessage.h
INSTALL libavutil/time.h
INSTALL libavutil/timecode.h
INSTALL libavutil/timestamp.h
INSTALL libavutil/tree.h
INSTALL libavutil/twofish.h
INSTALL libavutil/version.h
INSTALL libavutil/xtea.h
INSTALL libavutil/tea.h
INSTALL libavutil/lzo.h
INSTALL libavutil/avconfig.h
INSTALL libavutil/ffversion.h

DEBUG ssh: stdout: INSTALL      libavutil/libavutil.pc

DEBUG ssh: stdout: Done

DEBUG ssh: Sending SSH keep-alive...
DEBUG ssh: Sending SSH keep-alive...
DEBUG ssh: Sending SSH keep-alive...

相关脚本如下:

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure(2) do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://atlas.hashicorp.com/search.
  config.vm.box = 'ubuntu/trusty64'
  config.vm.hostname = 'dev'

  config.ssh.forward_agent = true
  config.ssh.pty = true

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network :private_network, type: :dhcp, auto_config: false

  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  config.vm.network :public_network,
                    ip: '192.168.11.14',
                    bridge: 'Realtek PCIe GBE Family Controller'

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  #
  # Do not share root directory of vagrant
  # config.vm.synced_folder '.', '/vagrant', disabled: true
  # Share ruby repository directories
  config.vm.synced_folder '.',
                          '/home/vagrant/apps',
                          nfs: true,
                          mount_options: [
                            'nfsvers=3',
                            'vers=3',
                            'actimeo=1',
                            'rsize=8192',
                            'wsize=8192',
                            'timeo=14',
                            :nolock,
                            :udp,
                            :intr,
                            :user,
                            :auto,
                            :exec,
                            :rw
                          ]

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  config.vm.provider :virtualbox do |vb|
    # Display the VirtualBox GUI when booting the machine
    vb.gui = true

    # Use VBoxManage to customize the VM.
    vb.name = 'Ubuntu'
    vb.cpus = 4
    vb.memory = 2048
    vb.customize ['modifyvm', :id, '--vram', 64]
    vb.customize ['modifyvm', :id, '--audio', :dsound]
    vb.customize ['modifyvm', :id, '--audiocontroller', :ac97]
    vb.customize ['modifyvm', :id, '--clipboard', :bidirectional]
  end

  # Provisioning
  config.vm.provision :shell, path: './provisioning/user/install-apps.sh',
                              privileged: false, name: 'Applications'
  config.vm.provision :shell, path: './provisioning/user/install-rvm.sh',
                              args: 'stable', privileged: false, name: 'RVM'
  config.vm.provision :shell, path: './provisioning/user/install-ruby.sh',
                              args: '2.3.1', privileged: false, name: 'Ruby'
  config.vm.provision :shell, path: './provisioning/user/install-ruby-gems.sh',
                              privileged: false, name: 'Ruby Gems'
  config.vm.provision :shell, path: './provisioning/root/install-nginx.sh',
                              args: '1.9.9', name: 'Nginx'

  config.vm.provision :chef_solo do |chef|
    # chef.version = '12.10.40'

    # Paths to your cookbooks (on the host)
    chef.cookbooks_path = ['cookbooks']
    # Add chef recipes
    chef.add_recipe 'apt'
    chef.add_recipe 'git' # Is required for NPM
    chef.add_recipe 'sqlite'
    chef.add_recipe 'mysql'
    chef.add_recipe 'nodejs'
    chef.add_recipe 'memcached'
    chef.add_recipe 'imagemagick'
    chef.add_recipe 'optipng'
    chef.add_recipe 'sublime-text'
    chef.add_recipe 'tomcat'
  end
end

安装-apps.sh

#!/usr/bin/env bash

echo Turning off console beeps...
grep '^set bell-style none' /etc/inputrc || echo 'set bell-style none' >> /etc/inputrc

echo Installing languages
sudo apt-get -y update
sudo locale-gen en_US en_US.UTF-8
sudo dpkg-reconfigure locales

echo Installing essential apps
sudo apt-get -y install build-essential curl yasm

echo Installing desktop apps
sudo apt-get -y install ubuntu-desktop

hash ffmpeg 2>/dev/null || {
  # Build ffmpeg
  echo Installing ffmpeg

  sudo apt-get -y install autoconf automake libass-dev libfreetype6-dev \
    libsdl1.2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev \
    libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev libx264-dev libmp3lame-dev libopus-dev

  mkdir ~/ffmpeg_sources
  cd ~/ffmpeg_sources
  wget http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
  tar xjvf ffmpeg-snapshot.tar.bz2
  cd ffmpeg
  PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
    --prefix="$HOME/ffmpeg_build" \
    --pkg-config-flags="--static" \
    --extra-cflags="-I$HOME/ffmpeg_build/include" \
    --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
    --bindir="$HOME/bin" \
    --enable-gpl \
    --enable-libass \
    --enable-libfreetype \
    --enable-libmp3lame \
    --enable-libopus \
    --enable-libtheora \
    --enable-libvorbis \
    --enable-libx264 \
    --enable-nonfree

  PATH="$HOME/bin:$PATH" make
  make install
  make distclean
  hash -r

  source ~/.profile
}

echo Done
exit 0

安装-rvm.sh

#!/usr/bin/env bash

echo Installing RVM gpg key
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 --trust-model always

echo Installing RVM
\curl -sSL https://get.rvm.io | bash -s 

exit 0

为了简洁起见,我不会包含其他脚本。当使用 gui 登录 vagrant 时,似乎没有什么异常,并且 ffmpeg 可用......但没有提供其他任何东西。没有 RVM,没有 Nginx,什么都没有。

您可能在 vagrant 中遇到了 bug,为了进行配置,您可以 运行 在 Vagrantfile 中使用以下设置来传递错误

  config.ssh.forward_agent = false
  config.ssh.pty = false