Como usar o provisionamento do Vagrant para instalar um pacote sem download?

2

O título diz tudo.

Estou usando caixas Vagrant para várias finalidades e, na maioria dos casos, as caixas preparadas que posso baixar são totalmente suficientes. No entanto, às vezes preciso de um ou alguns pacotes adicionais instalados na caixa - para atividades regulares, não para uso único.

Por exemplo, eu tenho uma caixa Vagrant no meu Mac (convidado Linux no host Mac) que eu quero principalmente para acesso fácil à documentação interna do Linux ( man pages, info pages, etc.). a caixa que estou usando não tem o pacote man instalado quando eu primeiro vagrant up .

Se eu instalar o pacote manualmente, ele só durará até o próximo vagrant destroy . Se eu usar o vagrant halt , eu vou criar um lixo no meu sistema, o que anula o propósito de usar vagrant ao invés de simplesmente uma Virtual Box.

Eu sei que a resposta geral para isso é o provisionamento vagrant, e pode ser tão simples quanto um script com um único comando sudo yum install man . (Embora na verdade eu nem sei especificamente como fazer isso.) No entanto, ao invés de baixar o pacote man e todas as dependências toda vez que eu inicio a caixa vagrant, eu prefiro baixar esses pacotes uma vez , armazená-los no meu sistema host, e carregá-los na vm cada vez que eu vagrant up .

Já executei sudo yum install man --downloadonly no guest, para obter os pacotes de que preciso e sudo cp -r /var/cache/yum/x86_64/6/base/packages/ /vagrant/ para colocar os arquivos do pacote no meu host.

Então, minha pergunta é bem dupla:

  1. Qual é a sintaxe de provisionamento do vagrant usada para: (a) chamar um script (para ser armazenado no mesmo diretório que o Vagrantfile), ou (b) se possível, incorporar um único comando no Vagrantfile ( como sudo yum install man )?

  2. Como posso fornecer yum os flags de opção necessários para instalar um pacote de um diretório local ( /vagrant ) e para instalar as dependências necessárias do mesmo diretório local em vez de de um repositório on-line?

Em combinação, esses dois dados responderão à pergunta do título. Obrigado por ler até aqui! :)

    
por Wildcard 08.10.2015 / 20:44

2 respostas

0

Acabei de encontrar este caso de uso novamente; Eu farei um registro sucinto aqui de como eu lidei com isso.

Eu queria baixar (mas não instalar) o Git e o PostgreSQL, e depois instalá-los durante o processo de provisão do vagrant.

Eu usei o seguinte comando de uma VM nova para baixar os pacotes com todas as dependências (após sudo mkdir /vagrant/packages ):

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

O truque desse comando é que ele faz downloads demais. O próximo passo foi estabelecer os RPMs que eu realmente precisava para a instalação. Eu fiz isso tentando:

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

E pressionando "Não" no prompt de confirmação, porque pude ver que estava planejando fazer o download das dependências. Eu peguei as dependências listadas e as adicionei ao meu comando:

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

Isso funcionaria com sucesso sem baixar nada, então eu corri:

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

Resultado: Um diretório "packages" com somente as dependências realmente necessárias da nova imagem do Vagrant.

Em seguida, adicione o comando shell provisioning ao meu Vagrantfile :

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

... Eu tenho o Git eo PostgreSQL instalados e prontos para uso depois de qualquer vagrant up , mesmo se vagrant destroy foi executado.

    
por 26.09.2016 / 11:40
1

For example, I have a Vagrant box on my Mac (Linux guest on Mac host)

Seria interessante saber qual distribuição é essa ... Dado que você está tentando usar yum , imagino que isso seja alguma coisa de RH / CentOS / ..?

which I primarily want for easy access to built-in Linux documentation (man pages, info pages, etc.) However, the box I am using doesn't have the man package installed when I first vagrant up.

Eu não conheço nenhuma distribuição que não instale man por padrão.

Se eu fosse você, usaria uma das caixas oficiais no ATLAS, o Debian vem à mente: link

Responder a Q1

Adicione isto ao seu arquivo vagrant:

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

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

Exemplo retirado de link

Isso executaria o script no topo, resultando na criação de /etc/vagrant_provisioned_at

Mais adaptado à sua pergunta:

$script = <<SCRIPT
yum install man
SCRIPT

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

O script de provisionamento é executado como UID0, portanto, não é necessário usar sudo .

Responder a Q2

Sou um usuário Debian e, como tal, analfabeto da RedHat; -)

IMHO, isso seria rpm -hiv <filename> ( i = instalar, h = hashmarks, v = detalhado).

Página de manual relacionada

    
por 09.10.2015 / 13:14