zoukankan      html  css  js  c++  java
  • Vagrant 手册之 Provisioning

    原文地址

    虽然 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
  • 相关阅读:
    SSH免密登录
    要不要学AI
    俞军产品方法论-笔记
    数据产品经理:实战进阶-笔记
    java代码中引用了scala类,Maven打包编译时爆出找不到scala类的异常
    Flink unable to generate a JAAS configuration file
    开始学习首席AI架构师
    flink checkpoinnt失败
    程序员的三种发展方向
    每日站会
  • 原文地址:https://www.cnblogs.com/kika/p/10851611.html
Copyright © 2011-2022 走看看