2017-05-03 84 views
1

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

回答

0

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

2

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

  1. 添加要加载在USER_DATA的EC2s脚本aws_instance

例如属性:

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

选项1的问题是我不使用'aws_instance'资源。实例由'launch_configuration'和'Autoscaling Group'创建,所以我不能使用'provisioner'或绑定特定实例中的角色。 – Nephilimrising

1

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