【问题标题】:Vagrant - Provisioning script not changing directoryVagrant - 配置脚本不更改目录
【发布时间】:2019-06-13 15:52:06
【问题描述】:

新手,请帮忙!

流浪文件

Vagrant.configure("2") do |config|
  config.vm.box = "laravel/homestead"
  config.vm.provision "shell", path: "vm-setup/provision.sh"
end

vm-setup/provision.sh

# Update apt-get
apt-get -y update

# Install tree
apt-get install tree

# Create .bash_aliases
sudo echo 'alias cls="clear"' >> ~/.bash_aliases

sudo chsh -s $(which zsh) vagrant

cd /vagrant

provision.sh 文件运行良好。当我运行“vagrant provision”时,它会更新 apt-get,安装树,甚至将 shell 更改为 ZSH。

但是sudo echo 'alias cls="clear"' >> ~/.bash_aliasescd /vagrant 行不起作用,不知道为什么。当我vagrant ssh 进入机器时,我被带到根目录(/home/vagrant)。我想从/vagrant 文件夹开始。

【问题讨论】:

    标签: shell vagrant provisioning


    【解决方案1】:

    Vagrant's shell provisioner 默认以privileged = true 运行:

    privileged (boolean) - 指定是否执行 shell 脚本 是否作为特权用户(sudo)。默认情况下这是“真”。

    当您执行vagrant ssh 时,您以vagrant 用户身份登录VM。

    这就是为什么:

    1.

    # Create .bash_aliases
    sudo echo 'alias cls="clear"' >> ~/.bash_aliases
    

    它写信给root's ~/.bash_aliases,它确实存在:

    root@vagrant:~# id
    uid=0(root) gid=0(root) groups=0(root)
    root@vagrant:~# cat .bash_aliases 
    alias cls="clear"
    

    解决方案:写入vagrant's主文件夹:

    # Create .bash_aliases
    echo 'alias cls="clear"' >> /home/vagrant/.bash_aliases
    chown vagrant:vagrant /home/vagrant/.bash_aliases
    

    2.

    cd /vagrant
    

    这意味着配置脚本中的文件夹已更改,没有其他内容。

    解决方案:将此语句添加到vagrant's .bash_aliases 以及:

    echo 'cd vagrant' >> /home/vagrant/.bash_aliases
    

    你的最终vm-setup/provision.sh 是:

    # Update apt-get
    apt-get -y update
    
    # Install tree
    apt-get install tree
    
    # Create .bash_aliases
    echo 'alias cls="clear"' >> /home/vagrant/.bash_aliases
    echo 'cd /vagrant' >> /home/vagrant/.bash_aliases
    chown vagrant:vagrant /home/vagrant/.bash_aliases
    
    chsh -s $(which zsh) vagrant
    

    【讨论】:

    • 你是最棒的!它的工作原理和很棒的解释!
    【解决方案2】:

    即使不是这样,只是为了完成:

    在尝试使用 Vagrant 作为设置脚本的测试工具时,我曾多次挣扎,现在我意识到了根本原因:

    使用这个 Vagrantfile 语句:

    config.vm.provision "shell", path: "myScript.sh"
    

    myScript.sh 内联到虚拟机标准输入。这很好,因为您不需要从虚拟机内部(通常通过/vagrant 路径)访问实际脚本。

    ...但它的缺点是任何相对路径都无法正常工作。

    当然:我们可以根据/vagrant将其调整为绝对路径。但这需要修改我们正在尝试测试的脚本。

    所以在这种情况下(在我看来,无论如何我们都不会禁用/vagrant 共享),将“inline:”选项与“machine-internal”路径一起使用是一个更好的解决方案:

    config.vm.provision "shell", inline: "/vagrant/myScript.sh"
    

    ...这将内联此语句而不是文件的内容和相对路径(甚至“基于脚本路径”的路径,例如$(dirname "${0}")/relative/path)将正常工作。

    此外,如果您要测试的设置脚本旨在由非特权用户执行(例如,如果它要设置一些用户配置,我们希望在 vagrant ssh -with vagrant 之后立即工作user-) 添加privileged: false 选项也是一个好主意,@Nickolay 指出:

    config.vm.provision "shell", inline: "/vagrant/myScript.sh", privileged: false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 2015-07-22
      • 2014-04-12
      • 1970-01-01
      • 2023-03-16
      • 2017-11-27
      相关资源
      最近更新 更多