Как установить Ruby 2 и Ruby Gems на бокс Ubuntu с Ansible

Я хочу предоставить машине Ubuntu Server последнюю версию Ruby и Ruby Gems с помощью Ansible.

Как это сделать?

Ответ 1

Решение №1: Использование APT и Symlinks

Я рекомендую использовать это решение, если будет нормально устанавливать Ruby 2.0 и Ruby Gems глобально (для всех пользователей). Если вы хотите установить другую версию или изолировать ее от других пользователей - см. Решение # 2.

Вот простая игра-версия Ansible, которая установит для вас последние версии Ruby 2.0 и Ruby Gems:

Ubuntu 14.04 (Trusty Tahr)

- name: Latest version of Ruby is installed
  apt: pkg={{ item }} state=latest
  with_items:
    - ruby2.0
    - ruby2.0-dev

- name: Symlink exists for Ruby 2.0
  file: src=/usr/bin/ruby2.0 dest=/usr/local/bin/ruby state=link

- name: Symlink exists for Ruby Gems 2.0
  file: src=/usr/bin/gem2.0 dest=/usr/local/bin/gem state=link

Ubuntu 13.10 (Saucy Salamander)

- name: Latest version of Ruby is installed
  apt: pkg={{ item }} state=latest
  with_items:
    - ruby2.0
    - ruby2.0-dev

- name: Making Ruby 2.0 the default one
  command: update-alternatives --set ruby /usr/bin/ruby2.0

- name: Making Gem 2.0 the default one
  command: update-alternatives --set gem /usr/bin/gem2.0

Предоставляемые проигрыватели должны быть выполнены с sudo: yes по понятным причинам.

Решение №2: Использование RVM

RVM устанавливает рубин и он самоцветов локально для текущего пользователя. Таким образом, это приводит к проблемам в многопользовательской среде. По какой-то причине в моем случае он работал неправильно. Поэтому я рекомендовал бы придерживаться первого решения, если это возможно. Хотя, если вы знаете, что вы делаете, и понимаете, какие сложности здесь возникают, RVM-решение.

Я предлагаю создать простую оболочку script для установки текущей версии Ruby и Ruby Gems с RVM и вызывать ее позже на подготовленной машине.

Здесь Bash script:

#!/usr/bin/env bash

# Checking if RVM is installed
if ! [ -d "~/.rvm" ]; then
    echo "Installing RVM..."
    \curl -sSL https://get.rvm.io | bash -s stable
    source ~/.rvm/scripts/rvm
    echo "source ~/.rvm/scripts/rvm" >> ~/.bashrc
else
    echo "Updating RVM..."
    rvm get stable
fi;

echo -n "RVM version is: "
rvm --version

echo "Installing Ruby..."
rvm install ruby

echo "Making installed Ruby the default one..."
rvm use ruby --default

echo "Installing latest version of Ruby Gems..."
rvm rubygems current

Этот script установит RVM (или обновит его до последней стабильной версии, если он уже установлен), и установит последние стабильные версии Ruby и Ruby Gems.

И вот здесь, чтобы воспроизвести книгу для копирования с помощью script на машину инициализации и вызвать ее:

- file: path=~/provision/ruby state=directory
- copy: src=../../files/ruby/install.sh dest=~/provision/ruby/install.sh mode=775

- name: Latest Ruby is installed
  shell: /usr/bin/env bash ~/provision/ruby/install.sh

Просто разместите script возле загрузочной книги Ansible и обновите пути.

Я надеюсь, что это поможет кому-то.

Ответ 2

В настоящее время есть официальная учебная игра Ruby/RVM: https://github.com/rvm/rvm1-ansible

Для установки: ansible-galaxy install rvm_io.rvm1-ruby -p ROLES_PATH

Пример playbook:

---

- name: Configure servers with ruby support
  hosts: all
  roles:
    - { role: rvm_io.rvm1-ruby, tags: ruby, become: True }