假设我有一个由Web服务器和数据库组成的应用程序。 如果我ec2部署一个厨师客户端与数据库angular色,我怎么能自动插入这个新的EC2机器的IP到我的networking服务器的configuration?
更普遍的是,如何在发布的时候获取EC2元数据以用于其他食谱的属性?
我知道一个迂回的方法来做到这一点可能是用shell脚本更新DNS服务器,但我只是在这里使用一个厨师的解决scheme感兴趣。
您可以在Web服务器上运行的Chef食谱上使用格式正确的search方法,该方法返回数据库服务器的节点对象。 那么你可以通过节点[“ipaddress”]获得上述IP,如果在EC2上运行时需要公网IP /主机名,node [“cloud”] [“public_hostname”] / node [“cloud”] [“”public_ipv4 “。 例如,在部署数据库服务器之后,使用如下所示的内容:
db_servers = search(:node, 'roles:db-server').map{|n| n.attribute?('cloud') ? n['cloud']['public_ipv4'] : n['ipaddress'] } template "web/config" do [...] variables({ :dbs_ervers => db_servers }) end
Web服务器更新将以asynchronous方式进行,无论何时Chef客户端运行,或者您可以通过手动ssh或knife ssh强制手动运行
厨师在您的云业务stream程和云监控/configuration方面只是一点点。 你可以使用厨师的configuration,没有别的。 这不是许多服务器的协调。
在你的情况下,你需要主进程,启动新的实例启动,实例将被configuration,主进程将更新Web服务器,一旦数据库实例运行。
许多使用厨师的人都犯这个错误。 以上你有正确的解决scheme。 只要明智地使用它。 也使用validation服务器。
您可能希望与Chef一起查看AWS CloudFormation模板。 引导EC2实例并使用CloudFormation启动其他AWS资源,即使用CloudFormation控制AWS。 然后使用Chef来pipe理服务器configuration端。 我相信这部分是安德鲁·史密斯(Andrew Smith)所说的“主过程”的function,也就是你用来控制整个生命周期的单一点。 它完全取代了Andrew的方法中的AWS API脚本。
代码部署也可能是其中的一部分。 厨师可以用来做这个,但我不相信这是最好的方法(除非你做的这么小)。 使用Jenkins和部署系统等代码构build系统。 我们目前使用内部系统,但希望转移到http://octopusdeploy.com/ (因为我们主要是.Net的房子)。 假设某些版本控制系统(如Git)中的代码。
有用的文件:
https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithOpscodeChef.pdf
免责声明:我不是专家。 最近才开始进行我们的部署devise。 但是目前的架构看起来就像上面那样。