摘要: 本文翻译自 Vagrant 官方文档 Shell Provisioner 部分,主要介绍了 Vagrant Shell 配置器的使用,如何使用内联脚本代码和外部脚本文件来配置虚拟机。
Provisioner name: “shell”
Vagrant Shell 配置器允许你向虚拟机上传脚本并执行。
对于想要快速启动和运行 Vagrant 的新手来说,Shell 配置器非常理想,并为不熟悉 Chef
或 Puppet
等配置管理系统的用户提供了选择。
对于类 POSIX 机器,shell 配置器使用 SSH 执行脚本。对于 Windows 机器,使用 WinRM 来执行脚本,shell 配置器通过 WinRM 执行 PowerShell 和 Batch (译者注:批处理) 脚本。
shell 配置器有很多选项,其中 inline
或者 path
选项是必须的:
剩下的这些选项是可选的:
/tmp/vagrant-shell
。在 Windows 下,这个默认路径是 C:\tmp\vagrant-shell
。PowerShell
的额外参数,如果你在 Windows 使用 PowerShell。env
选项中的 Hash 值标记为敏感数据,并将其从输出中隐藏起来。默认值是 “false”。也许最简单的入门方式是使用内联脚本。内联脚本是直接在 Vagrantfile 文件中给定的脚本代码。例如:
Vagrant.configure("2") do |config|
config.vm.provision "shell",
inline: "echo Hello, World"
end
当配置器运行时,会在虚拟机中运行 echo Hello, World
。
结合少量 Ruby 代码,很容易将 shell 脚本直接嵌入到 Vagrantfile 文件。举例如下:
$script = <<-SCRIPT
echo I am provisioning...
date > /etc/vagrant_provisioned_at
SCRIPT
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: $script
end
我知道如果你对 Ruby 不熟悉,那么上面的配置可能会看起来非常高级,但是不用害怕,它做的很简单:将 shell 脚本被赋 $shell
变量。这个全局变量包含一个字符串,然后作为内联脚本传递给 Vagrant 配置文件。
当然,如果在 Vagrantfile 中还有除了基本变量赋值之外的其他 Ruby 代码使你感到不舒服,那么您可以使用一个实际的脚本文件,在下一节中将对此进行说明。
对于 Windows 虚拟机,内联脚本必须是是 PowerShell。Batch(译者注:批处理) 脚本不能作为内联脚本。
shell 配置器还可以指定本地主机上的脚本的路径。Vagrant 会将该脚本上传到虚拟机并执行。例如:
Vagrant.configure("2") do |config|
config.vm.provision "shell", path: "script.sh"
end
上面的路径是相对于中 Vagrantfile 的路径。也可以使用绝对路径,以及 ~
(家目录)和 ..
等快捷方式。
如果你使用远程脚本作为配置器,你也可以将远程脚本的 URL 作为 path
的参数:
Vagrant.configure("2") do |config|
config.vm.provision "shell", path: "https://example.com/provisioner.sh"
end
如果你在 Windows 上运行 Batch(译者注:批处理) 或者 PowerShell 脚本,请确保外部路径具有适当的扩展名(”.bat” 或者 “.ps1”),由于 Windows 使用扩展名来决定所执行文件的类型。如果没有扩展名,那么脚本可能无法使用。
如果运行一个已经在虚拟机存在的脚本文件,你可以使用内联脚本来调用该远程虚拟机脚本:
Vagrant.configure("2") do |config|
config.vm.provision "shell",
inline: "/bin/sh /path/to/the/script/already/on/the/guest.sh"
end
您可以像任何普通的shell脚本一样参数化脚本。这些参数可以指定给 shell 配置器。应该将它们指定为字符串,因为它们将作为命令行的输入,因此确保正确地转义任何字符:
Vagrant.configure("2") do |config|
config.vm.provision "shell" do |s|
s.inline = "echo $1"
s.args = "'hello, world!'"
end
end
如果您不想担心引用,则还可以将参数指定为数组:
Vagrant.configure("2") do |config|
config.vm.provision "shell" do |s|
s.inline = "echo $1"
s.args = ["hello, world!"]
end
end