原文地址

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. document.domain location.hostname location.host

    document.domain    location.hostname     location.host   :https://www.cnblogs.com/shd-study/p/103031 ...

  2. BZOJ 1767] [Ceoi2009] harbingers (斜率优化)

    [BZOJ 1767] [Ceoi2009] harbingers (斜率优化) 题面 给定一颗树,树中每个结点有一个邮递员,每个邮递员要沿着唯一的路径走向capital(1号结点),每到一个城市他可 ...

  3. P1522 牛的旅行 (Floyd)

    [题目描述] 请编程找出一条连接两个不同牧场的路径,使得连上这条路径后,这个更大的新牧场有最小的直径.输出在所有牧场中最小的可能的直径. [题目链接] https://www.luogu.org/pr ...

  4. ES6——面向对象-基础

    面向对象原来写法 类和构造函数一样 属性和方法分开写的 // 老版本 function User(name, pass) { this.name = name this.pass = pass } U ...

  5. ajaxSubmit 实现图片上传 SSM maven

    文件上传依赖: <!-- 文件上传组件 --> <dependency> <groupId>commons-fileupload</groupId> & ...

  6. Docker备份镜像

    docker save -o mycentos.tar mycentos_new:1.1 指定输出到的文件 执行后,运行 ls 命令即可看到打成的tar包, 因为有463M所以打包要一会

  7. 2018-08-15-weekly

    Algorithm 5. Longest Palindromic Substring What 给定一个字符串s,找到s中最长的回文子字符串. 给定s的最大长度为1000. How 这是一道比较经典的 ...

  8. bzoj4002 [JLOI2015]有意义的字符串 特征根+矩阵快速幂

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4002 题解 神仙题. 根据下面的一个提示: \[ b^2 \leq d \leq (b+1)^ ...

  9. 如何用node开发自己的cli工具

    如何用node开发自己的cli工具 灵感 写这个工具的灵感以及场景源于youtube的一次闲聊 github 地址 blog首发 使用场景 原本我们写博客展示shell,例如:安装运转docker,一 ...

  10. 覆盖(Override)和重写(Overload)的区别

    Overload Overload是重载的意思. 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). Overload对我们来说可能比较 ...