从CloudFormation :: Init调用多用户rvm gem安装失败

我采用了Amazon Linux AMI(基于CentOS),并以多用户方式安装了RVM(1.10.3)(请参阅下面的{1})。 我用它来安装ruby1.9.3-p125,rubygems 1.8.17和bundler 1.1作为我将要使用的实例的基本要求。

我已经将该实例捕获到AMI,现在通过CloudFormation和一些CloudFormation :: Init命令启动它。 其中之一是使用s3cmd从S3下拉一个私人gem,下一个失败的gem是安装gem。 它失败并显示一条错误消息

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 

现在,在cfn-init执行过程中发生这种情况 – 我假设,但还没有检查,cfn-init正在运行一个不同于ec2-user(实例上没有其他用户)的环境。

如果我在交互式会话中运行gem install mygem.gem ,那么工作正常。

所以,我的问题是,我该怎么做才能使cfn-init ? 我是否正确设置了多用户的rvm?

我已经确认cfn-init是以root用户身份运行的,在他受限制的环境下运行。 我应该如何将/etc/profile.d/rvm.sh编入根用户的会话?

{1}我的半自动rvm安装步骤(以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 

一些环境信息:

 [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) 

所以答案在于,在CloudFormation :: Init中, /opt/aws/bin/cfn-init是由root用户在精简的环境中运行,并使用/bin/sh作为shell而不是/bin/bash 。 在过去十年左右,我大多是一个Windows的家伙,我起初没有意识到(记住!)。

我尝试了各种各样的东西,但工作的东西是从ScoutApp的博客改编的 :更改CloudFormation :: Init元数据commandsbash -l -c '和后缀'作为前缀(例如, gem install foo变成了bash -l -c 'gem install foo'