2015-02-26 5 views
7

Sto cercando di eseguire una serie di attività se manca un pacchetto apt specifico.Ansible Do Task Se manca il pacchetto Apt

ad esempio: do

se grafite di carbonio non è installato:

- apt: name=debconf-utils state=present 
- shell: echo 'graphite-carbon/postrm_remove_databases boolean false' | debconf-set-selections 
- apt: name=debconf-utils state=absent 

un altro esempio:

se statsd NON è installata fare:

- file: path=/tmp/build state=directory 
- shell: cd /tmp/build ; git clone https://github.com/etsy/statsd.git ; cd statsd ; dpkg-buildpackage 
- shell: dpkg -i /tmp/build/statsd*.deb 

Come sarebbe Inizio a rompere questo?

Sto pensando che forse posso fare un -shell: dpkg -l|grep <package name> e catturare il codice di ritorno in qualche modo.

+0

Non si dovrebbe usare così tanto il modulo 'shell'. I tuoi libri di gioco non sono idempotenti. Invece di eseguire il comando debconf, dovresti usare il suo modulo corretto come mostrato qui http://docs.ansible.com/debconf_module.html – Mxx

+0

@mxx Grazie. Informazioni molto utili –

+0

Passare semplicemente all'utilizzo di un modulo che fa la stessa cosa non rende il tuo playbook idempotente; le due cose non sono correlate. Potrebbe essere una buona idea usare un modulo se ne è disponibile uno, ma questa logica è sbagliata. –

risposta

2

Penso che tu sia sulla strada giusta con il dpkg | grep, solo che il codice di ritorno sarà 0 in ogni caso. Ma puoi semplicemente controllare l'output.

- shell: dpkg-query -l '<package name>' 
    register: dpkg_result 

- do_something: 
    when: dpkg_result.stdout != "" 
6

Sembra che la mia soluzione funzioni.

Questo è un esempio di come l'ho lavorato:

- shell: dpkg-query -W 'statsd' 
    ignore_errors: True 
    register: is_statd 

- name: create build dir 
    file: path=/tmp/build state=directory 
    when: is_statd|failed 

- name: install dev packages for statd build 
    apt: name={{ item }} 
    with_items: 
    - git 
    - devscripts 
    - debhelper 
    when: is_statd|failed 

- shell: cd /tmp/build ; git clone https://github.com/etsy/statsd.git ; cd statsd ; dpkg-buildpackage 
    when: is_statd|failed 

.... 

Ecco un altro esempio:

- name: test if create_superuser.sh exists 
    stat: path=/tmp/create_superuser.sh 
    ignore_errors: True 
    register: f 

- name: create graphite superuser 
    command: /tmp/create_superuser.sh 
    when: f.stat.exists == True 

... e uno più

- stat: path=/tmp/build 
    ignore_errors: True 
    register: build_dir 

- name: destroy build dir 
    shell: rm -fvR /tmp/build 
    when: build_dir.stat.isdir is defined and build_dir.stat.isdir 
1

Sono un po 'tardi a questa festa, ma ecco un altro esempio che utilizza i codici di uscita: assicurati di abbinare esplicitamente il testo di stato desiderato nei risultati di dpkg-query :

- name: Check if SystemD is installed 
    command: dpkg-query -s systemd | grep 'install ok installed' 
    register: dpkg_check 
    tags: ntp 

- name: Update repositories cache & install SystemD if it is not installed 
    apt: 
    name: systemd 
    update_cache: yes 
    when: dpkg_check.rc == 1 
    tags: ntp 
Problemi correlati