使用Vagrant provisioner创建Linux环境变量

31
我是一位有用的助手,可以为您翻译文本。

我已经使用Vagrant运行Ubuntu进行开发。我使用了一个shell脚本提供程序来下载/安装我的依赖项并创建一些别名,但在使用提供程序创建环境变量方面遇到了困难(这些变量用于项目中的几个标志)。最初我有这样的东西:

export MY_VAR='value'

我将我的供应商脚本添加进去,但后来发现你无法通过正常运行shell脚本来添加环境变量。好吧,于是我尝试将Vagrantfile的代码改为:

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

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

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

没有运气。当我通过ssh登录时,仍然没有全局环境。有没有办法使用shell脚本设置bash环境变量,或者是放弃shell提供程序并学习chef的时候了?

6个回答

34

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

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

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


好的,搞定了!谢谢。 - MBrizzle
3
给其他人的提示,我正在使用CentOS 7,我不得不执行以下命令: echo "export VAR=value" >> ~/.bashrc - Eric B
21
这个修复方案不符合“vagrant方式”。将其直接添加到vagrant中,将在每次执行配置过程时都添加一个新行。 - Maks3w
@Maks3w:公正的批评,不过很容易解决(添加了一个答案显示如何解决) - Elias Van Ootegem
2
也许可以修改这个答案,使其更完整,例如,显示整个config.vm...行? - jpw

20

既然被接受的答案确实在每次运行 vagrant provision 时将 export VAR=value 添加到您的 .profile(或 .bashrc)文件中,那么这里是我如何快速添加环境变量的方法。

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

分解:

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

将它们整合在一起:

通常我使用puphpet来创建我的vagrant boxes,所以我喜欢使用它所使用的目录结构,这意味着将我的provisioning脚本放在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

如果你想将环境变量设置为特定值,即使它们已经被设置了,你可以用这个(正如Maks3w建议的)替换[ -z "$VAR" ]

如果想将环境变量设置为固定值,即使它们已经设置过,可以使用以下方法替换 [ -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。 - Maks3w
我已经用100%完整的Vagrant wat(没有外部脚本文件)给出了答案。 - Maks3w
自Vagrant 1.4版以来,供应阶段已经是用户需求。因此,如果他/她启动了供应阶段,则真正想重置配置。 - Maks3w
@Maks3w:不一定。我在工作中使用vagrant,我们是团队合作,经常会有人更新vagrant repo(添加虚拟主机或设置新工具),这就需要我们进行盒子的配置。我希望配置可以“添加”新内容,而不会破坏我自己的更改。在我看来,这完全取决于OP的特定要求/用例。 - Elias Van Ootegem
比批准的答案更好用。 - iaforek
显示剩余2条评论

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

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 标签必须作为其自己一行中的第一个字符。

1
我是一名有用的助手,可以为您翻译文本。

我正在寻找同样的东西。我想在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后应用它们。


0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接