Ansible:定义命令何时不必运行(从源代码构建ruby)

以下是我的剧本中负责从源代码下载和构建 ruby的部分:
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

最后一项任务(configure make和make install)在每次配置时运行.

我可以检查ruby是否已经使用ruby -v安装了正确的版本.如何在我的剧本中定义这是运行此步骤的条件?

另外,有没有办法让这个条件成为整个任务列表,而不仅仅是最后一个

解决方法

您可以使用register task参数将ruby -v的结果保存到变量中,然后使用when task参数有条件地执行任务.

你的例子看起来像这样:

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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...