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