【问题标题】:execute commands as user after Vagrant provisioning在 Vagrant 配置后以用户身份执行命令
【发布时间】:2014-04-28 03:50:40
【问题描述】:

在初始配置后,有些命令必须以普通用户身份运行。我以为我可以使用单独的 shell 脚本和命令 su --login -c <command> vagrant 来做到这一点,但它没有从 .bashrc 获取用户的路径或其他环境设置。

例如:

#!/usr/bin/env bash
su --login -c "rbenv install 2.0.0-p353" vagrant
su --login -c "rbenv global 2.0.0-p353" vagrant
su --login -c "gem update --system" vagrant
su --login -c "yes | gem update" vagrant
su --login -c "gem install rdoc" vagrant
su --login -c "gem install rails pg" vagrant

有没有办法做到这一点?也许必须使用另一个配置工具(如 Puppet 或 Chef)来完成?我曾想过创建另一个以 .bashrc 为源的 shell 脚本,使用 :file 配置器将其复制到盒子中并执行类似的命令,但这似乎有点像 hack。

这样做的正确方法是什么?

【问题讨论】:

  • su -p 将保留环境变量 - 这有帮助吗?
  • @Vince 我认为在您的问题中提及有关使用 Ruby 安装构建 Vagrant 框的问题将是完美的,添加 Ruby 标记并在问题标题上附加 Ruby 安装 像这样 => 执行 Ruby 安装在 Vagrant 配置期间以用户身份执行命令

标签: shell vagrant


【解决方案1】:

您应该可以使用Vagrant Shell provisioner 来执行此操作,例如

Vagrant.configure("2") do |config|
  $script = <<-SCRIPT
  rbenv install 2.0.0-p353
  rbenv global 2.0.0-p353
  gem update --system
  yes | gem update
  gem install rdoc
  gem install rails pg
  SCRIPT

  config.vm.provision "shell", inline: $script, privileged: false
end

关键是要指定privileged: false,这样它将使用默认用户而不是root

【讨论】:

  • 有没有办法以非默认用户身份执行此操作?
【解决方案2】:

我想记录一个解决方案,以解决 shell 配置程序必须以非 root 用户身份运行命令的情况在登录 shell 中

将您的配置命令放入 shell 脚本(例如“bootstrap.sh”):

#! /bin/bash

rbenv install 2.0.0-p353
rbenv global 2.0.0-p353
gem update --system
yes | gem update
gem install rdoc
gem install rails pg

然后在你的 Vagrantfile 中:

Vagrant.configure(2) do |config|

  $script = "/bin/bash --login /vagrant/bootstrap.sh"
  config.vm.provision :shell, privileged: false, inline: $script

end

您应该将/vagrant/bootstrap.sh 路径替换为您的配置脚本的正确路径在 vagrant 机器中

我专门使用这个解决方案来让 rvm 命令在使用 Vagrant 进行配置时工作。

【讨论】:

    【解决方案3】:

    有时您希望混合使用特权命令和非特权命令。如果您的情况需要这样做,请使用 runuser。

    runuser -l vagrant -c 'command'

    【讨论】:

    • 我试图安装 nvm 作为 Vagrantfile 的一部分。默认脚本会为 root 而不是vagrant 用户安装它。无需编写 shell 脚本就可以解决问题。
    【解决方案4】:

    我试过 @jabclab@evanhsu 答案都不适用于我

    安装rbenv 并在 Vagrant Provisioning 过程中使用它。

    在使用rbenv 命令之前使用下一个命令

    export PATH="$HOME/.rbenv/bin:$PATH"
    export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
    eval "$(rbenv init -)"
    

    Bootstrap.sh 文件

    #!/usr/bin/env bash
    
    sudo apt-get update
    echo "========================= install dependencies for install rbenv ==========================="
    sudo apt-get install -y autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
    echo "========================= install rbenv =========================================="
    git clone https://github.com/rbenv/rbenv.git ~/.rbenv
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >>  ~/.bashrc
    echo 'eval "$(rbenv init -)"' >>  ~/.bashrc
    echo "========================= install ruby build plugin for rbenv ======================="
    git clone https://github.com/rbenv/ruby-build.git  ~/.rbenv/plugins/ruby-build
    echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
    echo "========================= install ruby v2.5.0 =========================================="
    export PATH="$HOME/.rbenv/bin:$PATH"
    export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
    eval "$(rbenv init -)"
    rbenv install 2.5.0
    rbenv global 2.5.0
    ruby -v
    gem -v
    echo "========================= install bundler dependencies manager for ruby ====================="
    gem install bundler
    rbenv rehash
    
    

    然后VagrantFile 文件将包含 vagrant 配置行

    deploy_config.vm.provision :shell, privileged: false, path: "bootstrap.sh"
    

    我的答案来自Gits by @creisor

    answers of this question vagrant 配置过程中使用rbenv 命令的另一种方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      相关资源
      最近更新 更多