如何使用 Vagrant 配置来安装包而无需下载?

如何使用 Vagrant 配置来安装包而无需下载?

我将 Vagrant 盒子用于多种目的,在大多数情况下,我可以下载的准备好的盒子完全足够了。然而,有时我需要在盒子上安装一个或几个额外的软件包 - 用于日常活动,而不是一次性使用。

例如,我的 Mac 上有一个 Vagrant 盒子(Mac 主机上的 Linux 来宾),我主要希望能够轻松访问内置 Linux 文档(man页面、info页面等)。但是,我使用的盒子没有man我第一次安装时安装的软件包vagrant up

如果我只是手动安装该软件包,它只会持续到下一个vagrant destroy.如果我使用vagrant halt它,我会在我的系统上建立一些缺陷,这违背了使用vagrantVirtual Box 的初衷。

我知道一般的答案是 vagrant 配置,它可以像带有单个命令的脚本一样简单sudo yum install man。 (虽然实际上我什至不知道具体该怎么做。)但是,我宁愿下载这些包,而不是每次启动 vagrant box 时下载 man 包和所有依赖项一次,将它们存储在我的主机系统上,并每次我将它们加载到虚拟机中vagrant up

我已经sudo yum install man --downloadonly在来宾上运行,以获取我需要的包,并将sudo cp -r /var/cache/yum/x86_64/6/base/packages/ /vagrant/包文件放在我的主机上。

所以我的问题实际上是双重的:

  1. 用于以下用途的 vagrant 配置语法是什么:(a) 调用脚本(与 Vagrantfile 存储在同一目录中),或 (b) 如果可能,在 Vagrantfile 中嵌入单个命令(例如sudo yum install man)?

  2. 如何提供yum从本地目录安装软件包所需的选项标志 ( /vagrant)从同一本地目录而不是从在线存储库安装任何所需的依赖项?

答案1

例如,我的 Mac 上有一个 Vagrant 盒子(Mac 主机上的 Linux 客户机)

知道这是哪个发行版会很有趣...鉴于您正在尝试使用yum我想这是一些 RH/CentOS/.. 的东西?

我主要希望能够轻松访问内置的 Linux 文档(手册页、信息页等)。但是,当我第一次 vagrant up 时,我使用的盒子没有安装 man 包。

我不知道有哪个发行版是man默认安装的。

如果我是你,我会使用 ATLAS 上的官方盒子之一,我会想到 Debian:https://vagrantcloud.com/debian/

回复问题1

将其添加到您的 vagrantfile 中:

$script = <<SCRIPT
echo I am provisioning...
date > /etc/vagrant_provisioned_at
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: $script
end

示例取自 http://docs.vagrantup.com/v2/provisioning/shell.html#inline-scripts

这将执行顶部的脚本,从而创建/etc/vagrant_provisioned_at

进一步适应你的问题:

$script = <<SCRIPT
yum install man
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: $script
end

配置脚本作为 UID0 运行,因此不需要sudo.

回复问题2

我是 Debian 用户,因此对 RedHat 是文盲;-)

恕我直言,这将是rpm -hiv <filename>i=安装,h=哈希标记,v=详细)。

相关联机帮助页

答案2

我刚刚再次遇到这个用例;我在这里简单记录一下我的处理方式。

我想下载(但不安装)Git 和 PostgreSQL,然后在 vagrant 配置过程中安装它们。

我在新的虚拟机中使用以下命令来下载具有所有依赖项的软件包(在 之后sudo mkdir /vagrant/packages):

sudo yumdownloader --destdir=/vagrant/packages/ --resolve -y git postgresql

这个命令的技巧是,它下载的东西太多了。下一步是建立我所使用的 RPM实际上安装所需的。我通过尝试做到了这一点:

sudo yum install /vagrant/packages/git-1.7.1-4.el6_7.1.x86_64.rpm /vagrant/packages/postgresql-8.4.20-6.el6.x86_64.rpm

在确认提示时按“否”,因为我可以看到它正在计划下载依赖项。我获取了列出的依赖项并将它们添加到我的命令中:

sudo yum install /vagrant/packages/git-1.7.1-4.el6_7.1.x86_64.rpm /vagrant/packages/postgresql-8.4.20-6.el6.x86_64.rpm /vagrant/packages/perl-* /vagrant/packages/postgresql-libs-8.4.20-6.el6.x86_64.rpm

这不需要下载任何东西就可以成功工作,所以我然后运行:

cd /vagrant/packages/
mkdir save
mv /vagrant/packages/git-1.7.1-4.el6_7.1.x86_64.rpm /vagrant/packages/postgresql-8.4.20-6.el6.x86_64.rpm /vagrant/packages/perl-* /vagrant/packages/postgresql-libs-8.4.20-6.el6.x86_64.rpm save/
rm *.rpm
mv save/* .
rmdir save

结果:“packages”目录仅有的新鲜 Vagrant 镜像中实际需要的依赖项。

然后将 shell 配置命令添加到 my Vagrantfile

  config.vm.provision "shell", inline: <<-SHELL
    yum install -C -y /vagrant/packages/*
  SHELL

...我已经安装了 Git 和 PostgreSQL,并且可以在任何之后使用vagrant up,即使vagrant destroy已运行。

相关内容