Eu peguei um Amazon Linux AMI (baseado no CentOS) e instalei o RVM (1.10.3) nele de forma multi-usuário (veja {1} abaixo). Eu usei isso para instalar o ruby 1.9.3-p125, o rubygems 1.8.17 e o bundler 1.1 como os requisitos da linha de base para a maioria das coisas pelas quais eu vou estar usando as instâncias.
Capturei essa instância para uma AMI e estou agora a lançá-la via CloudFormation, com alguns comandos CloudFormation :: Init. Uma delas é usar s3cmd para extrair uma gema privada do S3, e a próxima, a que falhar, é instalar essa gema. Ele falha com uma mensagem de erro
2012-03-15 16:53:20,201 [ERROR] Command 20_install_gems (/usr/local/rvm/rubies/ruby-1.9.3-p125/bin/gem install ./*.gem) failed
2012-03-15 16:53:20,202 [DEBUG] Command 20_install_gems output: /usr/local/rvm/rubies/ruby-1.9.3-p125/bin/gem:12:in 'require': no such file to load -- rubygems (LoadError)
from /usr/local/rvm/rubies/ruby-1.9.3-p125/bin/gem:12
Agora, isso acontece durante a execução do cfn-init - eu assumo, mas ainda não verifiquei, que o cfn-init está sendo executado com um ambiente diferente daquele do usuário ec2 (não há outros usuários na instância ).
Se eu executar gem install mygem.gem
em uma sessão interativa, isso funciona bem.
Então, minha pergunta, realmente, é o que devo fazer para que isso funcione para cfn-init
? Eu configurei corretamente o rvm como multiusuário?
Confirmei que o cfn-init está sendo executado como usuário root, com seu ambiente restrito. Como devo usar o /etc/profile.d/rvm.sh
nas sessões da raiz?
{1} Minhas etapas de instalação do rvm semi-automáticas (executadas em sessões interativas como usuário ec2):
sudo bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
sudo gpasswd -a ec2-user rvm
# iconv-devel is baked into centos' glibc
sudo yum install -y autoconf automake bison bzip2 gcc-c++ git libffi-devel libtool libxml2-devel libxslt-devel libyaml-devel make openssl-devel patch readline readline-devel zlib zlib-devel
source /etc/profile.d/rvm.sh
rvm list known
# in a new session:
rvm install ruby-1.9.3-p125
rvm use 1.9.3 --default
gem update --system
# gems required by public_web-awareness
gem install aws-sdk bundler cocaine sinatra
echo -e "gem: --no-ri --no-rdoc\n" > /home/ec2-user/.gemrc
# delete unnecessary documentation files
rm -rf 'gem env gemdir'/doc
sudo -s
sudo echo -e "gem: --no-ri --no-rdoc\n" > /etc/skel/.gemrc
sudo echo -e "gem: --no-ri --no-rdoc\n" > /etc/gemrc
# ctrl + d out of the sudo session
Algumas informações do ambiente:
[ec2-user@ip ~]$ echo $PATH
/usr/local/rvm/gems/ruby-1.9.3-p125/bin:/usr/local/rvm/gems/ruby-1.9.3-p125@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p125/bin:/usr/local/rvm/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin
[ec2-user@ip ~]$ echo $GEM_HOME
/usr/local/rvm/gems/ruby-1.9.3-p125
[ec2-user@ip ~]$ echo $GEM_PATH
/usr/local/rvm/gems/ruby-1.9.3-p125:/usr/local/rvm/gems/ruby-1.9.3-p125@global
[ec2-user@ip ~]$ echo $BUNDLE_PATH
[ec2-user@ip ~]$ gem list
*** LOCAL GEMS ***
aws-sdk (1.3.6)
bundler (1.1.0)
cocaine (0.2.1)
httparty (0.8.1)
json (1.6.5)
multi_json (1.1.0)
multi_xml (0.4.1)
nokogiri (1.5.1, 1.5.0)
rack (1.4.1)
rack-protection (1.2.0)
rake (0.9.2)
sinatra (1.3.2)
tilt (1.3.3)
uuidtools (2.1.2)
yamler (0.1.0)