2013-10-01 7 views
10

Non c'è un modulo per l'installazione direttamente pacchetti .deb. Quando devi eseguire dpkg come comando, contrassegna sempre l'attività di installazione come modificata. Avrei qualche problema a configurarlo correttamente, quindi sto postando qui come un blocco note pubblico.Come si fa a evitare un'attività di installazione dpkg per notificare uno stato cambiato quando viene eseguito per la seconda volta?

Qui è il compito da installare con dpkg:

- name: Install old python 
    command: dpkg -i {{ temp_dir }}/{{ item }} 
    with_items: 
    - python2.4-minimal_2.4.6-6+precise1_i386.deb 
    - python2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb 
    - libpython2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb 
    - python2.4-dev_2.4.6-6+{{ ubuntu_release }}1_i386.deb 

I file caricati in cui {{temp_dir}} in un altro compito.

risposta

8

In Ansible 1.6 (e versioni successive), il modulo apt ha un'opzione deb:

- apt: deb=/tmp/mypackage.deb 
13

La risposta qui sotto funziona ancora, ma le versioni più recenti ansible hanno la apt module. La risposta di Mariusz Sawicki è la preferita ora. L'ho contrassegnato come la risposta accettata.

Funzionerà solo con Ansible versione 1.3, in cui è stata aggiunta changed_when parametro. È un po 'goffo, forse qualcuno può migliorare la soluzione. Non ho trovato la documentazione di questo oggetto "registro".

- name: Install old python 
    command: dpkg --skip-same-version -i {{ temp_dir }}/{{ item }} 
    register: dpkg_result 
    changed_when: "dpkg_result.stdout.startswith('Selecting')" 
    with_items: 
    - python2.4-minimal_2.4.6-6+precise1_i386.deb 
    - python2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb 
    - libpython2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb 
    - python2.4-dev_2.4.6-6+{{ ubuntu_release }}1_i386.deb 

Qui è possibile eseguire lo stesso compito e sarà sufficiente installare la prima volta. Dopo la prima volta, i pacchetti non verranno installati.

C'erano due modifiche. Uno è il parametro --skip-same-version per impedire a dpkg di reinstallare il software. L'altro è il registro e gli attributi changed_when. La prima volta che viene eseguito dpkg, viene stampato per stdout una stringa che inizia con "Selezione" e viene notificata una modifica. Più tardi avrà un output diverso. Ho provato una condizione più leggibile, ma non sono riuscito a farlo funzionare con una condizione più sofisticato che utilizza "non" o le ricerche per una stringa.

+6

trucchetto! Preferisco comunque controllare STDERR: 'changed_when:" 'già installato' non in dpkg_result.stderr "' – tokarev

+2

Dai documenti Ansible: [Override del risultato modificato] (http://docs.ansible.com/playbooks_error_handling.html # overriding-the-changed-result) – user272735

+0

Dato che with_items, with_dict ecc. non funzionano quando si utilizza il parametro 1.6+ di deb, questo è il modo migliore per eseguire il loop su più file .deb locali da installare. – senorsmile

2

Si potrebbe utilizzare il modulo apt con dpkg_options parametro:

- name: Install old python 
    apt: deb={{ temp_dir }}/{{ item }} dpkg_options="skip-same-version" 
    register: dpkg_result 
    changed_when: dpkg_result.stderr.find("already installed") == -1 
    with_items: 
    - python2.4-minimal_2.4.6-6+precise1_i386.deb 
    - python2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb 
    - libpython2.4_2.4.6-6+{{ ubuntu_release }}1_i386.deb 
    - python2.4-dev_2.4.6-6+{{ ubuntu_release }}1_i386.deb 
+0

Ho cambiato la risposta accettata a questo poiché il nuovo modulo apt si prende cura del problema. – neves

Problemi correlati