【问题标题】:Create linux environment variable using vagrant provisioner使用 vagrant provisioner 创建 linux 环境变量
【发布时间】:2014-07-11 23:18:39
【问题描述】:

我让 vagrant 运行 Ubuntu 用于开发目的。我使用 shell 脚本配置器来下载/安装我的依赖项并创建一些别名,但是在使用配置器创建环境变量(用于我的项目中的多个标志)方面我遇到了困难。最初我有类似的东西:

export MY_VAR='value'

进入我的配置程序脚本,但后来发现您不能通过正常运行从 shell 脚本中add environment variables。很公平,所以我尝试将 Vagrantfile 的行改为:

config.vm.provision "shell", inline: “source setup.sh"

这并没有解决问题。环境变量仍然不存在。我尝试将导出直接添加为内联:

config.vm.provision "shell", inline: “export MY_VAR='value'"

运气不好。当我 ssh 进入时仍然没有全局环境。有没有办法使用 shell 脚本来设置 bash 环境变量,或者是时候放弃 shell 配置程序并学习厨师了?

【问题讨论】:

    标签: vagrant


    【解决方案1】:

    每次运行vagrant provision 时,确实会在您的.profile(或.bashrc)文件中添加一个export VAR=value,这是我快速添加环境变量的方法

    source ~/.profile && [ -z "$VAR" ] && echo "export VAR=value" >> ~/.profile
    

    细分:

    • source ~/.profile:加载当前的.profile文件
    • [ -z "$VAR"]:检查是否设置了VAR,如果没有:
    • echo "export VAR=value" >> ~/.profile:将导出行添加到.profile

    把它们放在一起:

    我通常将 puphpet 用于我的 vagrant box,所以我倾向于坚持它使用的目录结构,这意味着将我的配置脚本放在 puphpet/shell/*(相对于 Vagrantfile 文件)中。在该文件中,您可以添加任意数量的环境变量:

    #!/usr/bin/env bash
    #Replace .profile with .bashrc if required
    source ~/.profile
    if [ -z "$VAR" ]; then # only checks if VAR is set, regardless of its value
        echo "export VAR=value" >> ~/.profile
    fi
    #other env variables and profile stuff here
    

    如果您想将环境变量设置为特定值,即使它们已设置,您也可以将[ -z "$VAR" ] 替换为此(如 Maks3w 建议的那样):

    if [ -z "$VAR" ] || [ "$VAR" != "value" ]; then
        #same as before
    fi
    

    然后只需将其添加到您的 Vagrantfile 中:

    config.vm.provision "shell", path: "puphpet/shell/your-script.sh"
    

    这应该可以解决问题...

    【讨论】:

    • 我喜欢用 -z 开关代替 grep
    • 我的回答是 100% 完整的 Vagrant wat(没有外部脚本文件)
    • @Maks3w:这也是一个有效的选择。不确定 [ $VAR != "value" ] 位,因为 vbox 的用户可能出于开发原因更改了 env 变量,并且他可能不希望通过配置来更改值
    • 自 1.4 (IIRC) 以来 Vagrant 的提供阶段处于用户需求之下。因此,如果他/她启动配置阶段,那么真的想要重置配置。
    • @Maks3w:不一定。我在工作中使用 vagrant,我们在团队中工作,并且经常发生有人更新 vagrant repo(添加虚拟主机或设置新工具),这需要我们配置这些盒子。我希望配置能够添加新内容,而不会破坏我自己的更改。这完全取决于 OP 恕我直言的特定要求/用例
    【解决方案2】:

    这是我如何让$GOPATH 工作的:

    config.vm.provision "shell", inline: <<-SHELL
      echo -n                              >  /etc/profile.d/gopath.sh
      echo 'export GOPATH=$HOME/go'        >> /etc/profile.d/gopath.sh
      echo 'export PATH=$PATH:$GOPATH/bin' >> /etc/profile.d/gopath.sh
    SHELL
    

    使用单引号和$HOME(而不是~)是必要的——否则我无法让它工作。

    【讨论】:

      【解决方案3】:

      您应该让配置脚本在您的 .profile 中添加一行:

      echo "export VAR=value" >> ~/.profile
      

      登录时,.profile 脚本将被 bash 读取并设置变量。

      【讨论】:

      • 是的,做到了!谢谢。
      • 给其他人的说明,我使用的是 CentOS 7,我必须这样做echo "export VAR=value" &gt;&gt; ~/.bashrc
      • 此修复不遵循“流浪方式”。在 vagrant 中添加此内容将在每条规定 cicle 上添加一个新行
      • @Maks3w:公平的批评,虽然很容易解决(添加了一个显示如何解决的答案)
      • 也许这个答案可以修改为完整,例如,显示整个 config.vm.... 行?
      【解决方案4】:

      我也在寻找同样的东西。我想在 Vagrantfile 中设置http(s)_proxy 环境变量。要求是我可以随时更改这些变量并vagrant reload 应用它们。

      最后,我想出了解决方案:

      config.vm.provision "shell", inline: "> /etc/profile.d/myvars.sh", run: "always"
      config.vm.provision "shell", inline: "echo \"export http_proxy=http://proxy.somedomain.com:3128\" >> /etc/profile.d/myvars.sh", run: "always"
      config.vm.provision "shell", inline: "echo \"export https_proxy=https://proxy.somedomain.com:3128\" >> /etc/profile.d/myvars.sh", run: "always"
      

      0) /etc/profile.d/*.sh 脚本在 bash shell 启动时运行
      1) 从 myvars.sh 中删除所有内容
      2) 设置第一个变量
      3) 设置第二个变量

      由于run: "always",我可以添加/删除变量,并在vagrant reload 之后应用它们。

      【讨论】:

        【解决方案5】:

        这个答案展示了如何添加环境变量,只需使用 Ruby HEREDOC (Here doc) 语法修改VagrantFile

          $install_user_vars = <<SCRIPT
            source ~/.profile
        
            if [ -z "$VAR" ] || [ "$VAR" != "value" ]; then
              echo "export VAR=value" >> ~/.profile
            fi
        
            if [ $(pwd) != "/vagrant" ]; then
              echo "cd /vagrant" >> ~/.profile
            fi
        
        SCRIPT
        
          config.vm.provision "shell", inline: $install_user_vars
        

        注意:关闭SCRIPT必须是他自己行的第一个字符

        【讨论】:

          【解决方案6】:

          在 CentOs7 中,您需要将环境变量放在 /etc/profile.d/ 下 这在我的情况下有效:

          machine.vm.provision 'shell',
            inline: 'sudo su - && echo "export VAR1=test export VAR2=test" > /etc/profile.d/vars.sh'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-11
            • 1970-01-01
            • 2015-09-16
            相关资源
            最近更新 更多