【问题标题】:Updating path in Vagrant using shell provisioning使用 shell 配置更新 Vagrant 中的路径
【发布时间】:2014-02-10 21:00:52
【问题描述】:

我正在使用 Vagrant 来部署一个虚拟机,其中包含几个使用 shell 配置的已安装包。其中一个软件包需要更新路径才能正确使用,而我无法做到。

这些是我的 Vagrantfile 的内容:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"

#config.vm.network "forwarded_port", guest: 8888, host: 8888

config.ssh.forward_agent = true
config.vm.provision "shell", path: "provision.sh" 

end

这些是我尝试过的以下事情:

  1. 使用以下命令(附加在文件末尾)创建单独的 .bashrc 和 .profile 文件并将它们复制到主目录:

    export PATH="/usr/local/x86_64/bin:$PATH"
    
  2. 尝试写入.profile文件:

    echo 'export PATH="/usr/local/x86_64/bin:$PATH"' >> .profile
    
  3. 只需在配置期间尝试导出 PATH(即作为 provision.sh 中的一行代码):

    export PATH="/usr/local/x86_64/bin:$PATH"
    

vagrant up 命令完成后,该命令确实启用vagrant ssh 之后的路径更改。

【问题讨论】:

    标签: ruby linux ubuntu vagrant provisioning


    【解决方案1】:

    基于此post 将以下内容添加到provision.sh 文件中解决了问题:

    echo PATH $PATH
    [ -f ~/.profile ] || touch ~/.profile
    [ -f ~/.bash_profile ] || touch ~/.bash_profile
    grep 'PATH=/usr/local/x86_64/bin' ~/.profile || echo 'export PATH=/usr/local/x86_64/bin:$PATH' | tee -a ~/.profile
    grep 'PATH=/usr/local/x86_64/bin' ~/.bash_profile || echo 'export PATH=/usr/local/x86_64/bin:$PATH' | tee -a ~/.bash_profile
    . ~/.profile
    . ~/.bash_profile
    echo PATH $PATH
    

    这适用于精确的 64 框,所有命令都应该是一行。

    【讨论】:

    • 我有一个非常相似的问题。但在我的情况下,我必须将您的脚本用作流浪用户,而不是 root。由于 vagrant 在提供期间默认为 root,因此我必须添加特权标志:config.vm.provision :shell, path: 'android_update.sh', priviliged: false。 PS:可以使用多个shell脚本提供者。
    【解决方案2】:

    使用 Ex/vi 编辑器的示例:

    ex +'$s@$@\rexport PATH=/var/lib/vendor/bin:$PATH@' -cwq /etc/bash.bashrc
    

    附加:

    export PATH=/var/lib/vendor/bin:$PATH
    

    进入全局/etc/bash.bashrc 文件(因此它可供所有使用bash shell 的用户使用,或使用/etc/profile 用于所有Bourne shell)。

    或者简单地使用cat,例如:

    cat >> ~/.bashrc <<EOF
    export PATH=~/.composer/vendor/bin:\$PATH
    EOF
    

    如果您需要立即访问新工具,则需要source 文件。

    如果您使用composer,您可以考虑通过在composer.json 中指定要求来安装二进制文件,请参阅一些examples here,因此在这种情况下,您不必担心配置 PATH 变量。


    如果您使用的是Ansible playbooks,您可以尝试使用Files Modules,并在 yml 文件中使用以下规则:

    - name: Update bashrc to add new PATH entry:
        dest=/home/vagrant/.bashrc
        line="export PATH='/usr/local/x86_64/bin:$PATH'"
        regexp="^export PATH"
        owner=vagrant
        state=present
        insertafter=EOF
        create=True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多