Linux

如何使用 Vagrant 配置來安裝包而不下載?

  • February 10, 2019

我將 Vagrant 盒子用於多種目的,在大多數情況下,我可以下載的準備好的盒子就足夠了。然而,有時我需要在盒子上安裝一個或幾個額外的軟體包——用於正常活動,而不是一次性使用。

例如,我的 Mac 上有一個 Vagrant 盒子(Mac 主機上的 Linux 來賓),我主要希望它可以輕鬆訪問內置的 Linux 文件(man頁面、info頁面等)。但是,我使用的盒子沒有man我第一次安裝的包vagrant up

如果我只是手動安裝包,它只會持續到下一個vagrant destroy. 如果我vagrant halt改用它,我會在我的系統上建立 cruft,這違背了使用的目的,vagrant而不是簡單的 Virtual Box。

我知道對此的一般答案是 vagrant Provisioning,它可以像帶有單個命令的腳本一樣簡單sudo yum install man。(雖然實際上我什至不知道具體該怎麼做。)但是,我不想每次啟動 vagrant box 時都下載 man 包和所有依賴項,我寧願下載這些包一次,將它們儲存在我的主機系統上,並在每次 I 時將它們載入到 vmvagrant 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

我剛剛又遇到了這個案例;我將在這裡簡要記錄我是如何處理它的。

我想下載(但不安裝)Git 和 PostgreSQL,然後在 vagrant 提供過程中安裝它們。

我使用來自新 VM 的以下命令來下載具有所有依賴項的包(在 之後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 配置命令添加到我的Vagrantfile

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

…我已經安裝了 Git 和 PostgreSQL 並準備好在 any 之後使用vagrant up,即使vagrant destroy已經執行。

例如,我的 Mac 上有一個 Vagrant 盒子(Mac 主機上的 Linux 來賓)

知道這是哪個發行版會很有趣…鑑於您正在嘗試使用yum我想這是一些 RH/CentOS/.. 的東西?

我主要是想輕鬆訪問內置的 Linux 文件(手冊頁、資訊頁等)。但是,當我第一次 vagrant up 時,我使用的盒子沒有安裝 man 包。

man我不知道預設情況下不安裝的任何發行版。

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

回复 Q1

將此添加到您的 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.

回复 Q2

我是 Debian 使用者,因此是 RedHat 文盲 ;-)

恕我直言,這將是rpm -hiv <filename>i=install,h= hashmarks,v= verbose)。

相關手冊頁

引用自:https://unix.stackexchange.com/questions/234835