使用 Puppet 和 ubuntu 服务器进行 cloudformation 引导

使用 Puppet 和 ubuntu 服务器进行 cloudformation 引导

我查看了 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 的任何人都有帮助。

相关内容