在autscaling组中提供ec2,其中包含ansible unsing云形成堆栈

时间:2016-04-07 08:37:59

标签: amazon-ec2 ansible amazon-cloudformation autoscaling

我创建了自动缩放组,它启动了具有ELB的EC2。我的问题是如何使用ansible配置这些EC2实例? 在我使用CNAME之前,但现在我无法获得实例dns。如果我错了,请纠正我。

我应该使用动态库存还是有其他选择?

我的云形成模板如下:

```

{
  "AWSTemplateFormatVersion" : "2010-09-09",
 "Description" : "Template create autoscaling group",
  "Parameters": {
   "devKeyPair": {
  "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
  "Type": "AWS::EC2::KeyPair::KeyName",
  "Default" : "dev-key"

}
},
"Resources" : {
"LaunchConfig" : {
"Type" : "AWS::AutoScaling::LaunchConfiguration",
"Properties" : {
  "KeyName" : { "Ref": "devKeyPair" },
  "ImageId" : "ami-1effc703",
   "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
  "#!/bin/bash\n", "\n", "    echo 'Installing Git'\n","    yum --nogpgcheck -y install wget\n""] ]}},
  "InstanceType" : "t2.small",
  "BlockDeviceMappings" : [
     {
       "DeviceName" : "/dev/sda1",
       "Ebs" : { 
          "VolumeSize" : "10", 
          "VolumeType" : "gp2", 
          "DeleteOnTermination" : "true"
          } 
     }
  ]
 }
 },
"BackendGroup" : {
  "Type" : "AWS::AutoScaling::AutoScalingGroup",
  "Properties" : {
    "AvailabilityZones" : ["eu-central-1a"],
  "MinSize" : "1",
  "MaxSize" : "1",
  "LaunchConfigurationName" : { "Ref" : "LaunchConfig" },
  "LoadBalancerNames" : [ { "Ref" : "ElasticLoadBalancer" } ],
  "Tags": [
    {
        "ResourceType": "auto-scaling-group",
        "ResourceId": "bas-auto",
        "Value": "bas-dev",
        "Key": "Name",
        "PropagateAtLaunch" : "true"
    }
]
  }
},

"ElasticLoadBalancer": {
  "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
  "Properties": {
  "AvailabilityZones": ["eu-central-1a"],
    "Listeners": [ {
      "LoadBalancerPort": "80",
      "InstancePort": "80",
      "Protocol": "HTTP"
    } ]
  }
},
"BackendDNS" : {
  "Type" : "AWS::Route53::RecordSetGroup",
  "Properties" : {
    "HostedZoneName" : "example.com.",
    "Comment" : "Targered to Bas instance",
    "RecordSets" : [{
      "Name" : "bas-dev.example.com.",
      "Type" : "CNAME",
      "TTL" : "300",
      "ResourceRecords" :  [
        {
            "Fn::GetAtt": [ "ElasticLoadBalancer", "DNSName" ]
        }
      ]
    }]
  }
},
}
}

```

3 个答案:

答案 0 :(得分:0)

另一种解决方案是在启动新实例之前配置您的VM 。即确保已经配置了启动ASG实例的映像。 一种方法是使用packer.io之类的东西来创建一个使用Ansible作为您的配置器的新AMI。然后,您只需将此新AMI ID传递到LaunchConfiguration的ImageId属性即可。

另一种方法可能涉及使用User Data来“回家”并告诉您实例已获取的公共IP地址。

答案 1 :(得分:0)

对我来说最好的解决方案是使用免费许可证安装Ansible Tower,使用user_data:properties ansible就有一个例子。 https://www.ansible.com/blog/autoscaling-infrastructures

但是必须构建第一个基本映像,因为如果不这样做会延长所有配置时间延迟。

答案 2 :(得分:0)

您可以将Opswork与Cloudformation一起使用,以便在将新实例添加到Autoscaling组时运行Ansible。

虽然Opswork使用Chef,但您可以使用此自定义食谱https://github.com/deepakagg/ansible-opsworks来运行所需的剧本。