Я пытаюсь установить rvm с помощью ansible в бродячем ящике на основе centos.
Я выполняю следующую команду:
vars:
user: "foo"
- name: install rvm
action: command sudo -u $user bash /home/$user/rvm-install.sh stable creates=$home/.rvm
Это в значительной степени работает, НО Ansible считает, что это не удалось.
Возможный вывод:
failed: [127.0.0.1] => {"changed": true, "cmd": ["sudo", "-u", "foo", "bash", "/home/foo/rvm-install.sh", "stable"], "delta": "0:00:21.102322", "end": "2012-10-09 12:33:19.917874", "rc": 1, "start": "2012-10-09 12:32:58.815552"}
stderr: % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1081k 100 1081k 0 0 54170 0 0:00:20 0:00:20 --:--:-- 89264
stdout: Downloading RVM from wayneeseguin branch stable
Installing RVM to /home/foo/.rvm/
RVM PATH line found in /home/foo/.bashrc /home/foo/.zshenv.
RVM sourcing line found in /home/foo/.bash_profile /home/foo/.zprofile.
# RVM: Shell scripts enabling management of multiple ruby environments.
# RTFM: https://rvm.io/
# HELP: http://webchat.freenode.net/?channels=rvm (#rvm on irc.freenode.net)
# Cheatsheet: http://cheat.errtheblog.com/s/rvm/
# Screencast: http://screencasts.org/episodes/how-to-use-rvm
# In case of any issues read output of 'rvm requirements' and/or 'rvm notes'
Installation of RVM in /home/foo/.rvm/ is almost complete:
* To start using RVM you need to run `source /home/foo/.rvm/scripts/rvm`
in all your open shell windows, in rare cases you need to reopen all shell windows.
# root,
#
# Thank you for using RVM!
# I sincerely hope that RVM helps to make your life easier and more enjoyable!!!
#
# ~Wayne
Вот идемпотентный сценарий, который установит RVM, конкретную версию Ruby (установите версию с ruby_version
var) и установите эту версию Ruby по умолчанию:
---
- hosts: all
sudo: yes
vars:
ruby_version: "2.1.3"
rvm_path: "/usr/local/rvm/gems/ruby-{{ ruby_version }}/bin:/usr/local/rvm/gems/ruby-{{ ruby_version }}@global/bin:/usr/local/rvm/rubies/ruby-{{ ruby_version }}/bin:/usr/local/rvm/bin"
tasks:
- name: append rvm path to environment
lineinfile: dest=/etc/environment state=present backrefs=yes regexp='PATH=(["]*)((?!.*?{{rvm_path}}).*?)(["]*)$' line="PATH=\1\2:{{rvm_path}}\3"
- name: ensure necessary packages are installed
yum:
name: "{{ item }}"
state: present
with_items:
- curl
- gnupg2
- name: ensure that GPG key for RVM is installed
command: gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
args:
creates: /root/.gnupg/secring.gpg
- name: ensure that RVM is installed
shell: curl -L get.rvm.io | bash -s stable
args:
creates: /usr/local/rvm
- name: ensure that ruby is installed
command: "rvm install {{ ruby_version }}"
args:
creates: "/usr/local/rvm/gems/ruby-{{ ruby_version }}"
environment:
PATH: "{{ rvm_path }}:{{ ansible_env.PATH }}"
- name: set default version of ruby with rvm
command: "rvm alias create default ruby-{{ ruby_version }}"
args:
creates: /usr/local/rvm/config/alias
environment:
PATH: "{{ rvm_path }}:{{ ansible_env.PATH }}"
Это сработало для меня (Ubuntu):
tasks:
- name: Install RVM
shell: "curl -sSL https://get.rvm.io | bash"
Под обычным пользователем (без полномочий root).
В наши дни я считаю, что рекомендуется использовать Анзибельная роль RVM. Инструкции есть в README этого проекта.
Основываясь на ответе @dynex, вот способ сделать это немного более идемпотентно, проверив папку, которую он обычно создает.
- stat: path=/etc/profile.d/rvm.sh
register: rvm_folder
- name: install rvm
shell: "curl -sSL https://get.rvm.io | bash"
when: rvm_folder.stat.isdir is not defined
Я также пробовал установить RVM с помощью Ansible. К сожалению, RVM плохо работает с неинтерактивными оболочками, потому что это функция сценария оболочки. Вместо этого я установил rbenv (https://github.com/sstephenson/rbenv).
Вот моя суть:
Возможно, потому, что код ответа от скрипта ненулевой?
«rc»: 1
Поскольку rvm плохо работает с неинтерактивными оболочками, если вы все еще хотите использовать rvm с ansible, вам нужно написать свои собственные сценарии, которые вызывают rvm, но начинают с bash -l
(оболочка входа):
- name: install ruby-1.9.3
script: scripts/install-ruby-1.9.3.sh
куда install-ruby-1.9.3.sh
содержит что-то вроде
#!/bin/bash -l
rvm install 1.9.3
Старайтесь, чтобы такие сценарии были небольшими и сосредоточенными только на одной задаче (плюс обработка $?
для основной команды, если есть значение выхода, отличное от 0, которое вы хотите принять). Для второго рубина используйте второй сценарий, который инкапсулирует вторую команду.