原文地址

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

配置

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

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

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

Vagrant.configure("2") do |config|# ... other configurationconfig.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 configurationconfig.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"endconfig.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

转载于:https://www.cnblogs.com/kika/p/10851611.html

Vagrant 手册之 Provisioning - 基本用法相关推荐

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

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

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

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

  3. 使用Vagrant部署虚拟分布式开发和测试环境

    同步更新到笔者个人博客,可以访问我的博客查看原文:https://www.rockysky.tech 创建自动化配置开发环境 最近由于最近研究和学习的关系,需要经常配置和搭建多个虚拟机组成的分布式系统 ...

  4. mysql distinct 的用法

    在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所 ...

  5. mysql筛选不重复数据库_mysql的distinct用法-mysql中如何筛选出非重复的数据

    使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一 条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所 ...

  6. Vagrant设置私有网络

    前言 Varangt可以配置私有网络,有多种方式,其中静态IP是我常用的一种.本文介绍如何为虚拟机指定静态IP. 设置静态IP 当你为虚拟机指定静态 IP后,主机就可以通过指定的静态 IP 访问虚拟机 ...

  7. mysql级联distinct_mysql的distinct用法

    使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有 distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所 ...

  8. Java phantomjs 网页截图

    简介 根据传入的url对网页进行截图.打开网页和截取图片通过软件phantomjs.exe在后台静默完成.注:该过程不需要打开浏览器 优点: 1.该软件支持多个平台,包括Linux,Windows. ...

  9. distinct 只针对一个字段

    仅作自己参考 转至:http://blog.csdn.net/u013402772/article/details/51262524 在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mys ...

最新文章

  1. PowerDesigner逆向生成
  2. 华擎b365m itx 黑苹果_迷你ITX小机箱装机实录,黑苹果首选
  3. 经典C语言程序100例之六
  4. css截断长文本显示
  5. 百度大数据可视化产品矩阵
  6. 2.1.1Remove Duplicates from Sorted Arr
  7. 我终于知道post和get的区别
  8. 并不是每个女生都能穿出这种效果......
  9. 我的世界javamod怎么装_「装修细节」除了中央空调外的高颜值装空调大法
  10. QString与中文问题
  11. 【JAVA中级篇】线程池
  12. MyCat分布式数据库集群架构工作笔记0023---高可用_单表存储千万级_海量存储_分表扩展范围约定
  13. 深入理解docker graph driver - DeviceMapper
  14. jd-gui - 打开jar出现中文乱码问题
  15. Spring关于@required注解
  16. 一个软件系统的兼容性测试,在兼容性测试中,如何判断软件的兼容性?
  17. 电脑黑客用3D打印钥匙解开高安全性能手铐
  18. 常见的HTPP状态码
  19. python可视化小程序-实际利率与黄金价格走势图
  20. 股票量化交易有什么优势?注意哪些风险?

热门文章

  1. Func和Action的介绍及其用法
  2. MySql 应该选择普通索引 还是唯一 索引???
  3. library not found for -lstdc++.6.0.9
  4. Win10系统Win键无法使用
  5. 算法题---最长公共前缀
  6. Mongodb系列- java客户端简单使用(CRUD)
  7. MYSQL 【汇总数据】 【分组数据】 学习记录
  8. [转].net仿传奇机器人配置文件
  9. 2011年中期业绩预增前20家公司
  10. 前端工程师需要懂的前端面试题(c s s方面)总结(二)