在 Autoscaling 预配实例上与厨师一起执行食谱

Posted

技术标签:

【中文标题】在 Autoscaling 预配实例上与厨师一起执行食谱【英文标题】:Executing recipe with chef on Autoscaling provisioned instance 【发布时间】:2017-10-01 08:52:26 【问题描述】:

我有一个 terraform 配置的 AWS 结构。我已经为执行配方准备了厨师,但问题是实例没有任何node_name 属性,因为它们是由Terraform 使用AutoScaling Groupchef client 安装的user_data 脚​​本提供的。节点名称由chef 生成,我最初需要在每个实例上执行一些安装。我尝试创建 base 角色并使用所需的操作将其更新到服务器。更新成功,但没有在实例上启动安装。有什么方法可以运行命令或为每个新到达的实例分配角色?

【问题讨论】:

【参考方案1】:

我能想到两种解决方案:

    在aws_instance 的user_data 属性中添加要加载到EC2 的脚本

例如:

resource "aws_instance" "foo" 
  ami           = "ami-408c7f28"
  instance_type = "t1.micro"
  user_data = "**your script**"

    从您自己的自定义 AMI 启动它们。

【讨论】:

选项1的问题是我不使用aws_instance资源。实例是由launch_configurationAutoscaling Group 创建的,所以我不能使用provisioner 或绑定特定实例中的角色。【参考方案2】:

您必须将预置烘焙到 AMI 和 LaunchConfig 中的初始化脚本的混合中。 https://github.com/coderanger/octan_demo/blob/master/tf/octan_cluster/main.tf#L156-L167 和 https://github.com/coderanger/octan_demo/blob/master/tf/octan_cluster/bootstrap.tpl 是使用 chef-solo 的示例(好吧,本地模式,因为 solo 尚不支持策略,但这是另一回事)但它应该给你一个想法。您将有一个类似的脚本来安装 Chef、创建配置、下载验证密钥(可能使用 IAM 角色从 S3 下载),然后启动第一个 chef-client 运行。 https://github.com/coderanger/brix/blob/master/packer/client-bootstrap.sh 是很久以前为 chef-client 展示的另一个示例,在这种情况下,它基于 CloudFormation 数据生成配置,并且 Chef 安装 + 验证密钥被烘焙到 AMI 中。

【讨论】:

【参考方案3】:

感谢您的回答。自定义 AMI 不是一种选择,所以我不得不研究一种不同的方法。原来您可以跳过chef-service-manager 部分并直接致电chef client。重点是您可以将JSON 文件作为参数分配给chef clientJSON 可以包含runlist 和/或role,即使它是由Autoscaling group 创建的,也可以分配给新实例。因为我已经在使用user_data,所以我只是在脚本中添加了JSON 创建并分配了在Chef Server 中已经具有runlist 的所需角色。这两个答案都帮助我到达那里。现在在每个新实例上,通过user_data,我创建一个带有角色的JSON,最后我运行chef client -f role_config.json,然后我调用服务创建chef-service-manager。这只是一个补丁,因为最好的选择不是将其创建为服务,而是使用scheduled task 并每次调用json,因为如果为同一实例再次调用它,它将被忽略未来的处决。同样从我在Chef 文档中读到的内容来看,scheduled task 将是比使用该服务更好的选择。感谢您的回答!

【讨论】:

以上是关于在 Autoscaling 预配实例上与厨师一起执行食谱的主要内容,如果未能解决你的问题,请参考以下文章

与多个可用区一起使用时,Auto Scaling 如何“放置”实例?

AWS 是不是支持 RDS 实例的 Autoscaling

AWS EC2 Autoscaling:定义一个永不终止的主实例

减少 (AWS::AutoScaling::AutoScalingGroup) 中的所需实例是不是会终止实例而不停止它

如何在 Amazon EC2 上配置基于内存的 Auto Scaling?

AWS AutoScaling 是不是有可能在计费时间界限之前从不终止实例?