原文地址

Provisioner 命令:“shell”

示例:

node.vm.provision "shell" do |s|
s.inline = <<-SHELL
# 更改时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
timedatectl set-timezone Asia/Shanghai
SHELL

通过 Vagrant Shell 配置程序可以在虚拟机中上传和执行脚本。

Shell 为不熟悉 Chef 或 Puppet 等完整配置管理系统的用户提供了强大的选择。

1. 选项

shell 配置程序支持两个选项:

  • inline(字符串)- 在行内指定远程机器要执行的 shell 命令。更多信息参考第二小节 行内脚本。
  • path(字符串)- 要上传并执行的脚本的路径。可以是跟项目的 Vagrantfile 相关的脚本,也可以是远程脚本(例如 gist)。

剩下的可用选项是可选的:

  • args(字符串或数组) - 作为单个字符串执行时传递给shell脚本的参数。必须将这些参数写入,就好像它们是直接在命令行中键入的一样,所以必须根据需要转义字符,引号等。也可以使用数组传递参数,此时,Vagrant 会自动处理引用。
  • env(hash 散列) - 作为环境变量传递给脚本的键值对的列表。Vagrant 将处理环境变量值的引用,但键保持不变。
  • binary(boolean) - 自动用 Unix 行结束符替换 Windows 行结束符。如果设置为 false,则 Vagrant 不会这样做。默认情况下是“false”。如果 shell 配置程序通过 WinRM 进行通信,则默认为“true”。
  • privileged(boolean) - 指定是否以特权用户身份执行 shell 脚本(sudo)。默认情况下这是“true”。Windows 虚拟机使用计划任务作为真正的管理员运行,而不受 WinRM 限制。
  • upload_path(字符串) - shell 脚本将被上传到的远程路径。该脚本通过 SSH 用户上载到 SCP 上,因此该位置必须对该用户可写。默认情况下是“/tmp/vagrant-shell”。
  • keep_color(boolean) - 根据输出是来自标准输出 stdout 还是标准错误 stderr,Vagrant 自动以绿色和红色输出。如果设为 true,Vagrant 不会设置颜色,以允许脚本中的原生色彩输出。
  • name (字符串) - 此值将显示在输出中,以便在存在多个 shell 提供程序时,用户更容易识别。
  • powershell_args(字符串) - 如果在 Windows 上使用 PowerShell 进行配置管理,则可以通过这个参数传递给 PowerShell 额外参数。
  • powershell_elevated_interactive(boolean) - 在 Windows 上以交互模式运行提升的脚本。默认情况下这是“false”。需要同时开启 privileged 参数,这个参数才会有效。一定要启用 Windows 的自动登录,因为用户必须登录才能使用交互模式。
  • md5(字符串) - 用于验证远程下载的 shell 文件的 MD5 校验和。
  • sha1(字符串) - 用于验证远程下载的 shell 文件的 SHA1 校验和。
  • sensitive(boolean) - 将 env 选项中使用的哈希值标记为敏感,并将其隐藏在输出中。默认情况下是“false”。

2. 行内脚本(inline script)

对于单行脚本,可以直接在 Vagrantfile 中指定:

Vagrant.configure("2") do |config|
config.vm.provision "shell",
inline: "echo Hello, World"
end

当虚拟机内的配置程序运行时,会打印 Hello, World。

对于多行脚本,需要标明脚本边界:

Vagrant.configure("2") do |config|
node.vm.provision "shell" do |s|
s.inline = <<-SHELL
# 更改时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
timedatectl set-timezone Asia/Shanghai
echo 'sync time'
SHELL
end
end

结合一点 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

上面的内容将脚本分配给全局变量 $script。这个全局变量包含一个字符串,然后作为内联脚本传递给 Vagrant 配置。

3. 外部脚本

shell 配置程序可以通过路径使用宿主机的脚本。Vagrant 会上传这个脚本到虚拟机并执行。例如:

Vagrant.configure("2") do |config|
config.vm.provision "shell", path: "script.sh"
end

上面例子中使用的是相对路径,相对于项目的根 Vagrantfile 位置。也可以使用绝对路径,同时还支持 ~ 家目录和 .. 父目录。

也可以在 path 参数中通过 URL 来使用远程脚本:

Vagrant.configure("2") do |config|
config.vm.provision "shell", path: "https://example.com/provisioner.sh"
end

要运行虚拟机上已有的脚本,可以使用内联脚本来调用虚拟机上的远程脚本:

Vagrant.configure("2") do |config|
config.vm.provision "shell",
inline: "/bin/sh /path/to/the/script/already/on/the/guest.sh"
end

4. 脚本参数

可以像任何普通的 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

Vagrant 手册之 Provisioning - Shell 配置程序的更多相关文章

  1. Vagrant 手册之 Provisioning - file 配置程序

    原文地址 Provisioner 命令:"file" 通过 file 配置程序可以上传宿主机的文件或目录到虚拟机中. 使用场景:将宿主机的 ~/.gitconfig 复制到虚拟机中 ...

  2. Vagrant 手册之 Provisioning - 基本用法

    原文地址 虽然 Vagrant 提供了用于配置虚拟机的多个选项,但是有标准用法,好多知识点对这个 provisioner 是通用的. 配置 首先,Vagrantfile 中配置的每个 provisio ...

  3. Vagrant 手册之 Provisioning - 概述

    原文地址 通过 Vagrant 中的 provisioner 配置程序,可以在使用 vagrant up 启动虚拟机时,在虚拟机上执行安装软件.更改配置等操作. box 通常是通用的,而每个项目总有自 ...

  4. Vagrant 手册之 Provisioning - File

    原文地址 Provisioner 名字:"file" Vagrant 的 file provisioner 允许将文件或目录从主机上传到客户机. File provisioning ...

  5. Vagrant 手册之网络 - 公共网络 public network

    原文地址 Vagrantfile 配置文件中公共网络的标识符:public_network,例如: config.vm.network "public_network" Vagra ...

  6. Vagrant 手册之 Vagrantfile - 配置版本

    原文地址 配置版本是 Vagrant 1.1+(引入了大量新功能和配置选项) 能够与 Vagrant 1.0.x Vagrantfiles 保持向后兼容的机制. 现在运行 vagrant init 时 ...

  7. Vagrant (2) —— 基本安装与配置(下)

    Vagrant (2) -- 基本安装与配置(下) 摘要 基本安装与配置 版本 Vagrant版本: 1.8.1 内容 预置 我们可以通SSH登录然后安装一个web服务器,但是这样每个使用Vagran ...

  8. shell配置java环境变量和批处理配置环境变量

    linux配置java环境只需在/etc/profile中添加以下 前提是把jdk解压到/usr/local路径,当然路径可以随便改 export JAVA_HOME=/usr/local/jdk1. ...

  9. Vagrant 手册之 Vagrantfile - 机器设置 config.vm

    原文地址 配置的命名空间:config.vm config.vm 中的设置修改 Vagrant 管理的机器的配置. 1. 可用的设置项 config.vm.boot_timeout Vagrant 等 ...

随机推荐

  1. JAVA总结--dubbo与zookeeper

    读累了就看看实操https://www.cnblogs.com/huasky/p/10214642.html 一.SOA 概念:SOA:Service-Oriented Architecture,面向 ...

  2. oracle-第N篇加强专题

    1.Oracle数据库日期类型 1>日期的比较 2>日期格式化 2.Oracle字符串类型 1>常用函数

  3. 洛谷 P1108 低价购买(LIS,统计方案数)

    传送门 解题思路 看第一个要求,很显然是求最长下降子序列,和LIS几乎一样,很简单,再看第二个问号,求最长下降子序列的方案数??这怎么求? 注意:当二种方案“看起来一样”时(就是说它们构成的价格队列一 ...

  4. Version Controlling with Git in Visual Studio Code and Azure DevOps

    Overview Azure DevOps supports two types of version control, Git and Team Foundation Version Control ...

  5. JVM内存模型及参数调优

    堆.栈.方法区概念区别 1.堆 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.根据垃圾回收机制的不同, Java堆有可能拥有不同的结构,最为常见的就是 ...

  6. jQuery的加法运算,val()获取的结果相加变成了字符串连接。

    加法运算 ?想必大家听到这都会不屑了,加法运算这是多么简单的运算.然而有的时候在jQuery也让人挺头疼的. 常规的是: var num1 = 123; var num2=123; var total ...

  7. [资料] 常见的IC芯片解密方法与原理解析!

    其实了解芯片解密方法之前先要知道什么是芯片解密,网络上对芯片解密的定义很多,其实芯片解密就是通过半导体反向开发技术手段,将已加密的芯片变为不加密的芯片,进而使用编程器读取程序出来.   芯片解密所要具 ...

  8. thinkphp 关联

    原理:https://www.kancloud.cn/laowu199/e_dev/448632 示例数据库 hasOne:有一个,加上主谓语应该是 ,A 有一个 BhasMany:有很多,A 有很多 ...

  9. Thread类与Runnable接口

    Runnable 先看看源码中对Runnable的声明 @FunctionalInterface public interface Runnable { /** * When an object im ...

  10. macaca搭建

    对于新鲜的事务总是那么好奇,在自动化的过程中,有幸了解到macaca,记录下安装过程,具体介绍请移步官网:https://github.com/macacajs/ python版本参考:https:/ ...