在 Autoscaling 预配实例上与 chef 一起执行食谱
Executing recipe with chef on Autoscaling provisioned instance
我有一个 terraform
配置的 AWS
结构。我已经为菜谱执行准备了厨师,但问题是实例没有任何 node_name
属性,因为它们是由 Terraform
使用 AutoScaling Group
和 chef client
提供的 chef client
user_data
脚本。节点名称由 chef
生成,我需要在每个实例上最初执行一些安装。我尝试创建 base
角色并使用所需的操作将其更新到服务器。更新成功,但实例上没有开始安装。有什么方法可以 运行 命令或为每个新到达的实例分配角色吗?
我能想到的解决方案有两种:
- 在aws_instance
的user_data属性中添加要加载到EC2s的脚本
例如:
resource "aws_instance" "foo" {
ami = "ami-408c7f28"
instance_type = "t1.micro"
user_data = "**your script**"
}
- 从您自己的自定义 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 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
将是比使用该服务更好的选择。感谢您的回答!
我有一个 terraform
配置的 AWS
结构。我已经为菜谱执行准备了厨师,但问题是实例没有任何 node_name
属性,因为它们是由 Terraform
使用 AutoScaling Group
和 chef client
提供的 chef client
user_data
脚本。节点名称由 chef
生成,我需要在每个实例上最初执行一些安装。我尝试创建 base
角色并使用所需的操作将其更新到服务器。更新成功,但实例上没有开始安装。有什么方法可以 运行 命令或为每个新到达的实例分配角色吗?
我能想到的解决方案有两种:
- 在aws_instance 的user_data属性中添加要加载到EC2s的脚本
例如:
resource "aws_instance" "foo" {
ami = "ami-408c7f28"
instance_type = "t1.micro"
user_data = "**your script**"
}
- 从您自己的自定义 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 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
将是比使用该服务更好的选择。感谢您的回答!