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

Executing recipe with chef on Autoscaling provisioned instance

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

我能想到的解决方案有两种:

  1. aws_instance
  2. user_data属性中添加要加载到EC2s的脚本

例如:

resource "aws_instance" "foo" {
  ami           = "ami-408c7f28"
  instance_type = "t1.micro"
  user_data = "**your script**"
}
  1. 从您自己的自定义 AMI 启动它们。

您必须在 LaunchConfig 中将配置烘焙到 AMI 和初始化脚本的混合体中。 https://github.com/coderanger/octan_demo/blob/master/tf/octan_cluster/main.tf#L156-L167 and https://github.com/coderanger/octan_demo/blob/master/tf/octan_cluster/bootstrap.tpl is an example using chef-solo (well, local mode because solo doesn't yet support policies but that's a different story) but it should give you an idea. You would have a similar script that installs Chef, creates the config, downloads the validation key (probably from S3 using IAM roles), and then kicks off the first chef-client run. https://github.com/coderanger/brix/blob/master/packer/client-bootstrap.sh 是很久以前为 chef-client 展示的另一个示例,在这种情况下,它基于 CloudFormation 数据生成配置,并且将 Chef 安装 + 验证密钥烘焙到 AMI 中。

感谢您的回答。自定义 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 将是比使用该服务更好的选择。感谢您的回答!