Skip to content

Instantly share code, notes, and snippets.

@sairez
Last active August 29, 2015 14:15
Show Gist options
  • Save sairez/c6549e1035e75b4c026e to your computer and use it in GitHub Desktop.
Save sairez/c6549e1035e75b4c026e to your computer and use it in GitHub Desktop.
Ansible role to install a specific ruby version from source
just set ruby_full_version (e.g. 2.1.5, 2.1.0-rc1)
(defaults)
---
ruby_major_version: "{{ruby_full_version | regex_replace('^([0-9]\\.[0-9])(.*)$', '\\\\1')}}"
ruby_minor_version: "{{ruby_full_version | regex_replace('^([0-9]\\.[0-9]\\.[0-9])(.*)$', '\\\\1')}}"
ruby_patch_version: "{{ruby_full_version | regex_replace('^[0-9]\\.[0-9]\\.[0-9](.*)$', '\\\\1') }}"
ruby_minor_tarball_name: "ruby-{{ruby_minor_version}}"
ruby_patch_tarball_name: "ruby-{{ruby_minor_version}}-{{ruby_patch_version}}"
ruby_dest_tarball_name: "{{ruby_full_version}}"
ruby_options: "--with-readline-dir=/usr/lib/x86_64-linux-gnu/libreadline.so"
(tasks)
---
- name: Ruby | make sure ruby version to install is greater than 1.9.3
fail: msg='you cannot install a version of ruby older than 1.9.3'
when: ruby_full_version | version_compare('1.9.3', '<')
- name: Ruby | checking installed version of ruby
shell: /usr/bin/test "$(ruby -v | awk '{print $2}' 2> /dev/null)" = {{ruby_full_version}}
register: wanted_version_installed
ignore_errors: True
- name: Ruby | install requirements
apt: name='{{item}}' force='yes' install_recommends='no' state='latest' update_cache='yes'
with_items:
- 'git-core'
- 'curl'
- 'zlib1g-dev'
- 'build-essential'
- 'libssl-dev'
- 'libreadline-dev'
- 'libyaml-dev'
- 'libsqlite3-dev'
- 'sqlite3'
- 'libxml2-dev'
- 'libxslt1-dev'
- 'libcurl4-openssl-dev'
- 'python-software-properties'
- 'python-httplib2'
when: wanted_version_installed.rc == 1
- name: Ruby | check if patch version exists for download
uri: url="http://ftp.ruby-lang.org/pub/ruby/{{ruby_major_version}}/{{ruby_patch_tarball_name}}.tar.gz"
method='GET'
follow_redirects='none'
return_content='no'
when: wanted_version_installed.rc == 1
register: patch_version
ignore_errors: True
- name: Ruby | check for minor version if patch version doesn't exist
uri: url="http://ftp.ruby-lang.org/pub/ruby/{{ruby_major_version}}/{{ruby_minor_tarball_name}}.tar.gz"
method='GET'
follow_redirects='none'
return_content='no'
register: minor_version
when: wanted_version_installed.rc == 1 and patch_version.status == 404
- name: Ruby | set download tarball
set_fact: ruby_download_tarball_name="{{ruby_patch_tarball_name}}"
when: wanted_version_installed.rc == 1 and minor_version is defined and minor_version.skipped == true
- name: Ruby | set download tarball
set_fact: ruby_download_tarball_name="{{ruby_minor_tarball_name}}"
when: wanted_version_installed.rc == 1 and minor_version is defined and minor_version.status == 200
- name: Ruby | grab correct ruby source
get_url: url="http://ftp.ruby-lang.org/pub/ruby/{{ruby_major_version}}/{{ruby_download_tarball_name}}.tar.gz"
dest='{{work_dir}}/{{ruby_download_tarball_name}}.tar.gz'
when: wanted_version_installed.rc == 1 and ruby_download_tarball_name is defined
- name: Ruby | unpack ruby source
unarchive: src='{{work_dir}}/{{ruby_download_tarball_name}}.tar.gz'
dest='{{work_dir}}'
copy='no'
when: wanted_version_installed.rc == 1 and ruby_download_tarball_name is defined
- name: Ruby | configure and compile ruby source
shell: './configure {{ruby_options}} && make && make install chdir={{work_dir}}/{{ruby_download_tarball_name}}'
when: wanted_version_installed.rc == 1 and ruby_download_tarball_name is defined
- name: Ruby | get ruby version
shell: "ruby -v | awk '{print $2}'"
register: ruby_installed_version
- name: Ruby | print version
debug: msg="{{ruby_installed_version.stdout}}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment