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:
*.deb
su ogni macchina virtuale manualmente e inserisci: dpkg -i
… -> Potrebbe funzionare, ma è molto incline agli errori. (Script manuali ecc.) 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?