foreman 中使用的是 fog-aws 0.13.x 来完成AWS管理。

通过 Foreman-ec2 你可以将AWS EC2定义为一个计算资源(Compute Resource),随即用于创建新的EC2实例,这一切很流畅,如果你使用AWS International的话。然而如果使用AWS CN(http://www.amazonaws.com.cn/),当你安装了foreman-ec2插件之后,试图新增计算资源的话,fog-aws的这个早期版本只会在非AWSCN中试图验证你的AWSCN Token,结果当然是悲剧的:“

AWS was not able to validate the provided access credentials

”。

fog-aws的新版本已经解决了这个问题。然而更新foreman捆绑的版本不是真的好主意。

我们这里的策略是直接修改fog-aws 0.13的源代码,针对中国区进行一点强制性的硬编码从而解决新增计算资源时的连接测试问题。

具体来说,ssh登录到foreman主机上,在 /var/share/foreman/vendor/ruby/2.0.0/gems/ 下定位到 fog-aws-0.13.0 的 gem 以及源代码,然后修改 <fog-aws>/lib/fog/aws.rb 源文件:

我们的策略最终发生变化,不去修改 fog-aws-0.13.0 的源代码,取而代之的是修改 foreman 本身的实现。定位到 /usr/share/foreman/app/models/compute_resources/foreman/model/ec2.rb,修改这个文件的第119行,其原文为:

@client ||= ::Fog::Compute.new(:provider => "AWS", :aws_access_key_id => user, :aws_secret_access_key => password, :region => region)
修改后整个函数看起来像这样:
 def client
     #@client ||= ::Fog::Compute.new(:provider => "AWS", :aws_access_key_id => user, :aws_secret_access_key => password, :region => region)
     @client ||= ::Fog::Compute.new(:provider => "AWS", :aws_access_key_id => user, :aws_secret_access_key => password, :region => "cn-north-1", :host => 'ec2.cn-north-1.amazonaws.com.cn')
 end

注意到我们去掉了 :region => region 并修改为 :region => "cn-north-1", :host => 'ec2.cn-north-1.amazonaws.com.cn')

保存上述修改之后,重启 foreman(由于foreman已经拒绝了服务自身的重启的可能性,因此用reboot来应用上面的修改动作)。

现在重新登录foreman主机的WEB界面,并新增计算资源,填写我们的AWSCN Token后进行连接测试,顺利通过,且中国区的region也填写到了最后的框框里了。

现在,你可以列举出你的AWS CN中的所有实例了,当定义完整后,这些实例也会与恰当的Provisional Template相挂钩。