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

    原文地址

    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
  • 相关阅读:
    数据库索引的作用和优势缺点
    Python 新浪微博元素 (Word, Screen Name)词汇多样性
    解决Myeclipse在port占用,导致tomcat无法启动。(Linux)
    linux命名管道通信过程
    Lua环境搭建之使用EditPlus搭建Lua开发环境
    详解LUA开发工具及其环境配置
    UltraEdit配置python和lua环境
    Lua学习笔记
    Linux 安装ibus极点五笔输入法备忘录
    win2k/xp查看当前进程
  • 原文地址:https://www.cnblogs.com/kika/p/10851613.html
Copyright © 2011-2022 走看看