在 Autoscaling 预配实例上与厨师一起执行食谱
Posted
技术标签:
【中文标题】在 Autoscaling 预配实例上与厨师一起执行食谱【英文标题】:Executing recipe with chef on Autoscaling provisioned instance 【发布时间】:2017-10-01 08:52:26 【问题描述】:我有一个 terraform
配置的 AWS
结构。我已经为执行配方准备了厨师,但问题是实例没有任何node_name
属性,因为它们是由Terraform
使用AutoScaling Group
和chef 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_configuration
和Autoscaling 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 client
。 JSON
可以包含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 EC2 Autoscaling:定义一个永不终止的主实例
减少 (AWS::AutoScaling::AutoScalingGroup) 中的所需实例是不是会终止实例而不停止它