Come installare specifici pacchetti Ubuntu, con la versione esatta?

Voglio configurare una nuova macchina virtuale con alcuni pacchetti specificati (nome e versione) forniti.

Ad esempio apache2 nella versione 2.2.20-1ubuntu1 con tutte le dipendenze. Anche se c’è una nuova versione di questo pacchetto sui server, questa dovrebbe essere installata.

La soluzione deve funzionare / scalare con più (n) “setup”. Un’altra macchina virtuale potrebbe necessitare di una versione precedente di apache2.

Attualmente conosco alcune possibilità che installano i pacchetti esatti, ma non scalano così bene:

  1. Copia tutto il necessario *.deb su ogni macchina virtuale manualmente e inserisci: dpkg -i … -> Potrebbe funzionare, ma è molto incline agli errori. (Script manuali ecc.)
  2. Creare e utilizzare un nuovo repository Ubuntu per ogni configurazione. -> Non funziona perché avrei bisogno di n repository.
  3. Configurare la macchina una volta e copiare la VM / creare un’istantanea. -> Non funziona perché avrei bisogno di memorizzare n VM.

Il mio problema potrebbe essere etichettato come gestione delle patch, ma non voglio aggiornare i miei pacchetti alla versione corrente. Il mio objective è installare vecchi pacchetti.

È ansible utilizzare apt-get per installare una versione specifica del pacchetto a lungo come in un archivio di cui apt conosce. Dalla pagina di manuale di apt-get :

Una versione specifica di un pacchetto può essere selezionata per l’installazione seguendo il nome del pacchetto con un uguale e la versione del pacchetto da selezionare. Questo farà sì che quella versione sia localizzata e selezionata per l’installazione. In alternativa è ansible selezionare una distribuzione specifica seguendo il nome del pacchetto con una barra e la versione della distribuzione o il nome di archivio (stabile, congelato, instabile).

Ad esempio, potresti fare:

 sudo apt-get install apache2=2.2.20-1ubuntu1 

Nota che in questo caso potresti aver bisogno di fare una risoluzione delle dipendenze, ma se ci sono dei problemi apt-get ti dirà che cosa li sta causando. Sul mio sistema 11.10 dovrei fare quanto segue per farlo funzionare:

 sudo apt-get install apache2=2.2.20-1ubuntu1 \ apache2.2-common=2.2.20-1ubuntu1 \ apache2.2-bin=2.2.20-1ubuntu1 \ apache2-mpm-worker=2.2.20-1ubuntu1 

Per verificare quali versioni sono disponibili, puoi verificare tramite:

 sudo apt-cache madison ^apache2 

Se non funziona, si consiglia di eseguire sudo apt-get update prima di aggiornare l’elenco dei pacchetti.

Quindi copia la versione o utilizza la seguente syntax:

 sudo apt-get install apache2=2.2\* 

Per verificare quale versione hai installato, esegui:

 dpkg -l 'apache2*' | grep ^i 

Espanderò le risposte precedenti con altri comodi comandi di versioning nella famiglia apt . Per vedere quali versioni sono disponibili, eseguire la apt-cache policy :

 # apt-cache policy apache2 apache2: Installed: (none) Candidate: 2.4.7-1ubuntu4.5 Version table: 2.4.10-1ubuntu1.1~ubuntu14.04.1 0 100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages 2.4.7-1ubuntu4.5 0 500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages 2.4.7-1ubuntu4 0 500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages 

Quindi, come già detto, installa una versione specifica con apt-get :

 # apt-get install apache2=2.4.7-1ubuntu4.5 ... 

Ora puoi vedere quale versione hai installato eseguendo nuovamente la apt-cache policy :

 # apt-cache policy apache2 apache2: Installed: 2.4.7-1ubuntu4.5 Candidate: 2.4.7-1ubuntu4.5 Version table: 2.4.10-1ubuntu1.1~ubuntu14.04.1 0 100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages *** 2.4.7-1ubuntu4.5 0 500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages 100 /var/lib/dpkg/status 2.4.7-1ubuntu4 0 500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages 

Se non vuoi che le versioni più recenti siano installate sugli aggiornamenti, pin il pacchetto con apt-mark :

 # apt-mark hold apache2 apache2 set on hold. 

Supponiamo che una nuova versione di apache2 sia aggiunta all’indice del pacchetto e che la tua macchina sia sincronizzata con apt-get update . Lo vedrai quando eseguirai apt-get upgrade :

 # apt-get upgrade Reading package lists... Done Building dependency tree Reading state information... Done Calculating upgrade... Done The following packages have been kept back: apache2 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded. 

In pratica, questo non è ansible perché le vecchie versioni non sono conservate nell’archivio, quindi a meno che non si abbia una copia della vecchia versione che gira da qualche parte, non è ansible installarla. Dovresti chiederti perché vuoi installare una versione precedente in primo luogo. In una versione stabile, il motivo principale per cui viene rilasciata una nuova versione è correggere una vulnerabilità della sicurezza e non si desidera eseguire un server vulnerabile?