2013-11-09 3 views
7

Вот часть моего сборника пьес отвечает за загрузку и строительного рубин из источника:анзибль: определить, когда команда не должен работать (здание рубин от источника)

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 

Последняя задача (настройка сделайте и make install) запускается при каждом обеспечении.

Я могу проверить, установлен ли рубин с правильной версией с ruby -v. Как я могу определить в своем плейбуке, что это условие для запуска этого шага?

Кроме того, есть ли способ сделать это условием для всего списка задач, а не только для последнего?

ответ

13

Вы можете использовать параметр задачи register, чтобы сохранить результаты ruby -v в переменной, а затем использовать параметр задачи when для условного выполнения задач.

Ваш пример будет выглядеть примерно так:

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 

Вы также можете перемещать задачи в отдельный файл (например, install_ruby_from_source.yaml), а затем условно включить файл:

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

И что, если рубин вообще не установлен? – kovpack

0

Вот что я использую, чтобы сохранить условное в переменной, поэтому он может быть использован в любом месте:

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