原文地址

虽然 Vagrant 提供了用于配置虚拟机的多个选项,但是有标准用法,好多知识点对这个 provisioner 是通用的。

配置

首先,Vagrantfile 中配置的每个 provisioner 都使用 config.vm.provision 方法调用。例如,使用 shell 配置程序:

Vagrant.configure("2") do |config|
# ... other configuration config.vm.provision "shell", inline: "echo hello"
end

每个 provisioner 都有类型,例如“shell”,是第一个参数。后面紧跟着用于配置特定 provisioner 的键值对。除了基本的键值对,还可以使用 Ruby 块这种类似变量定义的语法。下面示例跟上面的相同:

Vagrant.configure("2") do |config|
# ... other configuration config.vm.provision "shell" do |s|
s.inline = "echo hello"
end
end

基于块的语法的好处是,使用多个选项可以大大提高可读性。此外,一些 provisioner (如 Chef provisioner)具有可在该块内调用的特殊方法,以简化无法使用键值对进行的配置,此语法还可以将参数传递给 shell 脚本。

使用 = 样式设置的属性可以在单行中设置,例如上面的 inline ="echo hello"。如果样式更像是一个函数调用,比如 add_recipe "foo",那么这不能在一行中指定。

Provisioner 也可以被命名(自 1.7.0 起)。这些名称可以用于输出以及覆盖 provisioner 设置(下面会进一步介绍)。下面显示了一个命名过的 provisioner:

Vagrant.configure("2") do |config|
# ... other configuration config.vm.provision "bootstrap", type: "shell" do |s|
s.inline = "echo hello"
end
end

命名 provisioner 很简单。config.vm.provision 的第一个参数就是名字,后面的 type 参数用于指定 provisioner 类型,例如 type: "shell"

运行 Provisioner

provisioner 在三种情况下运行:第一次 vagrant upvagrant provisionvagrant reload --provision

如果不想运行 provisioner,可以将 --no-provision 标志传递给 up 和 reload。类似,也可以传递 --provision 来强制执行 provisioning。

如果有多个 provisioner,要运行指定的 provisioner 时,可以使用 --provision-with 标志。例如,同时又 shell 和 Puppet 配置程序时,如果只想运行 shell,可以执行 vagrant provision --provision-with shell--provision-with 的参数可以是 provisioner 的类型(例如 shell)或命令(例如上面示例中的 bootstrap)。

运行一次还是一直运行

默认情况下,除非设置了 --provision 标志,否则 provisioner 配置程序只在上次 vagrant destroy 后的第一次 vagrant up 期间运行一次。

或者,可以配置 provisioner 以在每次启动或重新加载时运行。只有在显式指定 --no-provision 标志时才会运行它们。为此,请将 run 选项设置为“always”,如下所示:

Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: "echo hello",
run: "always"
end

如果想在“提示消息”中提示用户有可选的 provisioner,或者 provisioner 在启动之前依赖其他配置,也可以将 run 选项设置为“never”。之后可以通过 vagrant provision --provision-with bootstrap 调用。

如果使用块格式,则必须在块外指定 run 这个选项,如下所示:

Vagrant.configure("2") do |config|
config.vm.provision "shell", run: "always" do |s|
s.inline = "echo hello"
end
end

多个 Provisioner

可以使用多个 config.vm.provision 方法来定义多个 provisioner。这些 provisioner 将按照他们定义的顺序运行。常见的使用常见是:使得 shell 脚本可以引导某些系统,以便其他设置程序可以稍后进行。

如果在多个“scope”级别定义 provisioner(例如在配置块中全局化,然后在多机器定义中,然后可能在 provider 特定的覆盖中),那么外部 scope 将始终在任何内部 scope 之前运行。例如,在下面的 Vagrantfile 中:

Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: "echo foo" config.vm.define "web" do |web|
web.vm.provision "shell", inline: "echo bar"
end config.vm.provision "shell", inline: "echo baz"
end

provisioner 的顺序是打印“foo”,“baz”,然后是“bar”。

使用多个 provisioner 时,使用 --provision-with 设置和名称可以更好地控制运行的内容和时间。

覆盖 Provisioner 的设置

警告:高级主题! Provisioner 覆盖是一个高级主题,如果已经在使用多机器和/或提供程序覆盖,那么它非常有用。 如果你刚刚开始使用 Vagrant,可以放心地跳过。

在使用 multi-machine 或特定于 provider 的功能时,可能需要在 Vagrantfile 的全局配置范围中定义通用 provisioner,但在内部覆盖它们的某些方面。Vagrant 允许你这样做,但有一些细节需要考虑。

要覆盖设置,必须为 provisioner 分配一个名称。

Vagrant.configure("2") do |config|
config.vm.provision "foo", type: "shell",
inline: "echo foo" config.vm.define "web" do |web|
web.vm.provision "foo", type: "shell",
inline: "echo bar"
end
end

在上面,只会显示“bar”,因为内联设置会重载外部provisioner。这个重载只在该范围内有效:“web”虚拟机。如果定义了另一个虚拟机,它仍会回显“foo”,除非它本身也重载了 provisioner。

顺序要小心。当覆盖子范围中的 provisioner 时,provisioner 将在该点运行。在下面的例子中,输出将是“foo”,然后是“bar”:

Vagrant.configure("2") do |config|
config.vm.provision "foo", type: "shell",
inline: "echo ORIGINAL!" config.vm.define "web" do |web|
web.vm.provision "shell",
inline: "echo foo"
web.vm.provision "foo", type: "shell",
inline: "echo bar"
end
end

如果想保留原来的顺序,可以指定 preserve_order:true 标志:

Vagrant.configure("2") do |config|
config.vm.provision "do-this",
type: "shell",
preserve_order: true,
inline: "echo FIRST!"
config.vm.provision "then-this",
type: "shell",
preserve_order: true,
inline: "echo SECOND!"
end

Vagrant 手册之 Provisioning - 基本用法的更多相关文章

  1. Vagrant 手册之 Provisioning - 概述

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

  2. Vagrant 手册之 Provisioning - Shell 配置程序

    原文地址 Provisioner 命令:"shell" 示例: node.vm.provision "shell" do |s| s.inline = < ...

  3. Vagrant 手册之 Provisioning - File

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

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

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

  5. Vagrant 手册之同步目录 - 基本用法

    原文地址 - 概述 原文地址 - 基本用法 同步目录 Synced folder 支持在宿主机和客户机之间共享目录,从而允许你在宿主机的项目文件上工作,但是可以在客户机上编译并运行. 默认情况下,Va ...

  6. Vagrant 手册之网络 - 概述及基本用法

    原文地址 - 概述 原文地址 - 基本用法 为了访问创建的 Vagrant 环境,Vagrant 为端口转发.连接公共网络.创建私有网络等功能暴露了一些高层网络选项. 高层网络选项用于提供可以跨 pr ...

  7. Vagrant 手册之 Multi-machine 多机器

    原文地址 Vagrant 可以在一个 Vagrantfile 中定义并控制多个虚拟机.这就是"multi-machine"环境. 这些机器可以协同工作或互相关联.multi-mac ...

  8. Vagrant 手册之 Vagrantfile - SSH 设置 config.ssh

    原文地址 配置的命名空间:config.ssh config.ssh 中的设置与配置 Vagrant 如何通过 SSH 访问您的计算机相关. 大多数 Vagrant 设置一样,一般使用默认设置即可,但 ...

  9. Vagrant 手册之多个虚拟机 multi-machine

    原文地址 Vagrant 可以通过一个 Vagrantfile 定义并控制多个客户机.这就是所谓的"multi-machine"多虚拟机环境. 这些机器通常可以协同工作,或者互相关 ...

随机推荐

  1. Delphi Unicode学习

    String.AnsiString及Tbytes之间的转换一.string转为AnsiString1.直接赋值 (有警告)2.AnsiString()类型强制转换.(无警告) 二.AnsiString ...

  2. D Makoto and a Blackboard

    Makoto and a Blackboard time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  3. 回溯---IP 地址划分

    IP 地址划分 93. Restore IP Addresses(Medium) Given "25525511135", return ["255.255.11.135 ...

  4. vue访问外部接口设置代理,解决跨域(vue-cli3.0)

    vue-cli3.0搭建的项目,平时访问内部接口配置了拦截器,今天需要调用天气预报的外部接口,发现跨域问题,通过配置代理解决. 1.在vue.config.js中配置代理 module.exports ...

  5. 行人重识别(ReID) ——基于MGN-pytorch进行可视化展示

    下载MGN-pytorch:https://github.com/seathiefwang/MGN-pytorch 下载Market1501数据集:http://www.liangzheng.org/ ...

  6. 机器学习-K-means聚类及算法实现(基于R语言)

    K-means聚类 将n个观测点,按一定标准(数据点的相似度),划归到k个聚类(用户划分.产品类别划分等)中. 重要概念:质心 K-means聚类要求的变量是数值变量,方便计算距离. 算法实现 R语言 ...

  7. IC设计流程介绍

    芯片设计分为前端设计和后端设计,前端设计(也称逻辑设计)和后端设计(也称物理设计)并没有统一严格的界限,涉及到与工艺有关的设计就是后端设计. 1. 规格制定        芯片规格,也就像功能列表一样 ...

  8. Linux性能优化从入门到实战:17 网络篇:网络基础

    网络模型 为了解决网络互联中异构设备的兼容性问题,并解耦复杂的网络包处理流程,国际标准化组织制定了开放式系统互联通信参考模型(Open System Interconnection Reference ...

  9. Linux性能优化从入门到实战:11 内存篇:内存泄漏的发现与定位

      用户空间内存包括多个不同的内存段,比如只读段.数据段.堆.栈以及文件映射段等.但会发生内存泄漏的内存段,只有堆和文件映射段中的共享内存.   内存泄漏的危害非常大,这些忘记释放的内存,不仅应用程序 ...

  10. python实现通过企业微信发送消息

    实现了通过企业微信发送消息,平时用于运维的告警还是不错的,相对于邮件来说,实时性更高,不过就是企业微信比较麻烦,此处不做过多解释. 企业微信api的详细请看:http://work.weixin.qq ...