如何与Vagrant shell配置脚本进行交互?

时间:2013-01-18 18:05:38

标签: heroku vagrant

我有一个shell配置脚本,它调用一个需要用户输入的命令 - 但是当我运行vagrant provision时,该过程在脚本中的那个点挂起,因为命令在等待我的输入,但是无处可去。有没有办法解决这个问题 - 即强制脚本以某种交互模式运行?

具体是我创建一个干净的Ubuntu VM,然后调用Heroku CLI来下载数据库备份(这在我的配置脚本中):

curl -o /tmp/db.backup `heroku pgbackups:url -a myapp`

但是,因为这是一个干净的VM,因此这是我第一次运行Heroku CLI命令,系统会提示我输入我的登录凭据。因为脚本是由Vagrant管理的,所以没有连接交互式shell,因此脚本就会挂起。

2 个答案:

答案 0 :(得分:4)

如果要将临时输入或变量传递给Vagrant脚本,可以让它们通过将它们放在同一行上作为该命令的临时环境变量输入其凭据:

username=x password=x vagrant provision

并从Vagrantfile中以

的形式访问它们
$u = ENV['username']
$p = ENV['password']

然后你可以将它们作为参数传递给你的bash脚本:

config.vm.provision "shell" do |s|
    s.inline: "echo username: $1, password: $2"
    s.args: [$u, $p]
end

您可以在vm中安装类似expect的内容来处理将这些变量传递给curl命令。

答案 1 :(得分:2)

我假设您不想在纯文本中硬编码您的凭据,因此试图强制使用交互模式。 事情就像我在vagrant provision doc(http://docs.vagrantup.com/v1/docs/provisioners/shell.html)中看不到这样的选项一样,你需要在你的脚本中嵌入身份验证。 您是否考虑过使用诸如获取令牌之类的东西并使用heroku REST Api而不是CLI? https://devcenter.heroku.com/articles/authentication