使用vagrant provisioner创建linux环境变量

时间:2014-07-11 23:18:40

标签: 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 shell配置器上学习并学习厨师?

6 个答案:

答案 0 :(得分:32)

您应该让配置脚本为.profile添加一行:

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

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

答案 1 :(得分:17)

每次运行export VAR=value时,看到已接受的答案确实会为您的.profile(或.bashrc)文件添加vagrant provision,这就是我如何添加环境变量很快

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

故障:

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

全部放在一起:

我通常使用puphpet作为我的流浪盒,所以我倾向于坚持使用它的目录结构,这意味着我的配置脚本放在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"

应该这样做......

答案 2 :(得分: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必须是他自己行中的第一个字符

答案 3 :(得分:5)

以下是我$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(而不是~)是必要的 - 否则无法使其工作。

答案 4 :(得分:0)

我一直在找同样的事情。我想在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 :(得分:0)

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

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