2013-11-09 4 views
7

Hier ist der Abschnitt meines Textbuch für das Herunterladen und Gebäude Rubin von der Quelle:ansible: definieren, wenn ein Befehl nicht ausgeführt hat (Gebäude Rubin von der Quelle)

vars: 
    ruby_version: '2.0.0-p247' 
    ruby_url: 'ftp://ftp.ruby-lang.org//pub/ruby/2.0/ruby-{{ ruby_version }}.tar.gz' 

    tasks: 

    - name: Ensure ruby dependencies are installed 
    apt: pkg=$item state=installed update-cache=yes 
    sudo: yes 
    with_items: 
     - build-essential 
     - git-core 
     - libreadline6-dev 
     - libyaml-dev 
     - libsqlite3-dev 
     - sqlite3 
     - libgdbm-dev 
     - libncurses5-dev 
     - libtool 
     - bison 
     - libffi-dev 
     - libdigest-hmac-perl 
     - unzip 
     - zlib1g 
     - zlib1g-dev 

    - name: Ensure the ruby source is downloaded 
    get_url: url=$ruby_url dest=/home/vagrant/ruby-{{ ruby_version }}.tar 

    - name: Ensure the ruby source is extracted 
    command: tar -zxf /home/vagrant/ruby-$ruby_version.tar creates=/home/vagrant/ruby-{{ ruby_version }} 

    - name: Ensure ruby is installed 
    command: $item chdir=/home/vagrant/ruby-$ruby_version 
    with_items: 
     - ./configure 
     - make 
     - sudo make install 

Die letzte Aufgabe (konfigurieren make und make install) wird bei jedem Provisioning ausgeführt.

Ich kann überprüfen, ob Ruby bereits mit der richtigen Version mit ruby -v installiert ist. Wie kann ich in meinem Playbook definieren, dass dies eine Bedingung ist, um diesen Schritt auszuführen?

Gibt es auch eine Möglichkeit, dies zu einer Bedingung für die gesamte Aufgabenliste zu machen, und nicht nur die letzte?

Antwort

13

Sie können den Task-Parameter register verwenden, um die Ergebnisse von ruby -v in einer Variablen zu speichern, und dann den Task-Parameter when verwenden, um Tasks bedingt auszuführen.

Ihr Beispiel würde dann wie folgt aussehen:

vars: 
    ruby_version: '2.0.0-p247' 
    ruby_url: 'ftp://ftp.ruby-lang.org//pub/ruby/2.0/ruby-{{ ruby_version }}.tar.gz' 

    tasks: 

    - name: get currently installed ruby version 
    command: ruby -v 
    register: result 
    ignore_errors: True 

    - name: Ensure ruby dependencies are installed 
    apt: pkg={{ item }} state=installed update-cache=yes 
    sudo: yes 
    with_items: 
     - build-essential 
     - git-core 
     - libreadline6-dev 
     - libyaml-dev 
     - libsqlite3-dev 
     - sqlite3 
     - libgdbm-dev 
     - libncurses5-dev 
     - libtool 
     - bison 
     - libffi-dev 
     - libdigest-hmac-perl 
     - unzip 
     - zlib1g 
     - zlib1g-dev 
    when: result.rc !=0 or result.stdout.split()[1] != ruby_version 

    - name: Ensure the ruby source is downloaded 
    get_url: url={{ ruby_url }} dest=/home/vagrant/ruby-{{ ruby_version }}.tar 
    when: result.rc !=0 or result.stdout.split()[1] != ruby_version 

    - name: Ensure the ruby source is extracted 
    command: tar -zxf /home/vagrant/ruby-{{ ruby_version }}.tar creates=/home/vagrant/ruby-{{ ruby_version }} 
    when: result.rc !=0 or result.stdout.split()[1] != ruby_version 

    - name: Ensure ruby is installed 
    command: $item chdir=/home/vagrant/ruby-{{ ruby_version }} 
    with_items: 
     - ./configure 
     - make 
     - sudo make install 
    when: result.rc !=0 or result.stdout.split()[1] != ruby_version 

Sie auch die Aufgaben in einer separaten Datei bewegen kann (zB install_ruby_from_source.yaml), und dann sind bedingt die Datei:

vars: 
    ruby_version: '2.0.0-p247' 
    ruby_url: 'ftp://ftp.ruby-lang.org//pub/ruby/2.0/ruby-{{ ruby_version }}.tar.gz' 

    tasks: 

    - name: get currently installed ruby version 
    command: ruby -v 
    register: result 
    ignore_errors: True 

    - include: /path/to/install_ruby_from_source.yaml 
    when: result.rc !=0 or result.stdout.split()[1] != ruby_version 
+1

Und Was, wenn Rubin überhaupt nicht installiert ist? – kovpack

0

Hier ist, was ich bin mit dem bedingten in einer variablen zu halten, damit es überall eingesetzt werden kann:

vars: 
    touch_file: /opt/setup.touch 
tasks: 
- stat: path={{touch_file}} 
    register: touch 
- set_fact: once_a_day="{{(touch.stat.exists == false) or ((ansible_date_time.epoch|int - touch.stat.atime|int) > (3600 * 24))}}" 
- debug: msg="once_a_day={{once_a_day}}" 

- include: include/setup.yml 
    when: once_a_day 
Verwandte Themen