我查看了 Puppet Master Cloudformation 模板,并了解到它使用的是内置于 Amazon Linux AMI 中的 CloudInit。但是,我想使用现有的 Ubuntu 11.10 服务器映像,并仍然将服务器引导为 Puppet Master。阅读 CloudFormation 和 BootStrapping 文档后,似乎这是可行的,但在服务器上或创建堆栈时没有生成足够的日志。除了创建自定义 AMI 之外,有没有办法使用现有 AMI 来做到这一点?
答案1
由于我无法获取元数据资源来使用 apt 安装和配置包,因此我决定采用自定义脚本路线(请参阅:https://s3.amazonaws.com/cloudformation-examples/BoostrappingApplicationsWithAWSCloudFormation.pdf)。
自定义 bash 脚本负责安装工作,以引导 Puppet Master 实例。我需要它采用 JSON 格式,因此我使用了以下方便的 Ruby 脚本http://allanfeid.com/content/using-amazons-cloudformation-cloud-init-chef-and-fog-automate-infrastructure:
#!/usr/bin/ruby
require 'rubygems'
require 'json'
if ARGV.size != 1
puts "Usage: #{$0} <file>"
exit 1
end
def escape(string)
parse = JSON.parse({ 'json' => string }.to_json)
parse['json']
end
data = ''
File.open(ARGV[0]) {|f| data << f.read}
p escape(data)
# ./json_encode.rb combined-userdata.txt
目前应该可以,但最终如果能使用 cfn-init MetaData 和 apt 按照预期管理引导过程就更好了。例如,对于我来说,使用 apt 仍然无法实现这一点:
"Resources": {
"MyInstance": {
"Type": "AWS::EC2::Instance",
"Metadata" : {
"AWS::CloudFormation::Init" : {
"config" : {
"sources" : {
:
},
"packages" : {
:
}
"files" : {
:
}
"services" : {
:
}
}
}
},
"Properties": {
:
}
}
}
更新
更简单的解决方案是使用 Ubuntu CloudInit (https://help.ubuntu.com/community/CloudInit) 并让其为您安装软件包。我的 EC2 Puppet Client 实例模板现在如下所示:
"webserver" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"KeyName" : { "Ref" : "KeyName" },
"ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]},
"InstanceType": { "Ref" : "InstanceType" },
"SecurityGroups" : [ { "Ref" : "PuppetGroup" }, { "Ref" : "WebServerGroup" } ],
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#cloud-config","\n",
"packages:","\n",
"- ruby","\n",
"- ruby-dev","\n",
"- rubygems","\n",
"- puppet","\n",
"- vim-puppet","\n",
"- puppet-el","\n",
"puppet:","\n",
"conf:","\n",
"agent:","\n",
"server: ",,"\n",
"runcmd:","\n"
]]}}
}
}
这基本上就是 CloudConfig 引导过程,减去使其工作的 runcmd 魔法。我仍在尝试弄清楚如何将我的 puppet 清单传到 puppet master 并分配给节点,但这应该对使用 Ubuntu UEC AMI 的任何人都有帮助。