Chef bootstrap ec2——在另一个 chef 客户端的配置中使用生成的 IP

Chef bootstrap ec2——在另一个 chef 客户端的配置中使用生成的 IP

假设我有一个由 Web 服务器和数据库组成的应用程序。如果我使用 ec2 部署具有 DB 角色的 chef 客户端,如何自动将这台新 ec2 机器的 IP 插入到我的 Web 服务器的配置中?

更概括地说,如何在启动时获取 EC2 元数据以用于其他食谱的属性?

我知道一种迂回的方法可能是用 shell 脚本更新 dns 服务器,但我对这里仅使用 chef 的解决方案感兴趣。

答案1

search您可以在运行的 Chef 食谱中使用正确格式的方法网络服务器返回 DB 服务器的节点对象。然后,您可以通过 node["ipaddress"] 获取上述 IP,或者,如果您在 EC2 上运行时需要公共 IP/主机名,则可以使用 node["cloud"]["public_hostname"]/node["cloud"]["public_ipv4"]。例如,在部署 DB 服务器后,使用类似以下内容:

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 服务器更新将在 Chef 客户端运行时异步进行,或者您可以通过手动sshknife ssh

答案2

Chef 只​​是您云编排和云监控/配置中的一小部分。您可以使用 Chef 进行配置,而不能用于其他任何用途。它不用于协调许多服务器。

在您的情况下,您需要主进程来启动新的实例,实例将被配置,并且主进程将在数据库实例运行后更新 Web 服务器。

许多使用 Chef 的人都会犯这个错误。上面有正确的解决方案。只要明智地使用它。也要使用身份验证服务器。

答案3

您可能希望结合使用 AWS CloudFormation 模板和 Chef。使用 CloudFormation 引导 EC2 实例并启动其他 AWS 资源,即使用 CloudFormation 控制 AWS。然后使用 Chef 管理服务器配置端。我相信这部分是 Andrew Smith 所说的“主进程”的功能,即您用来控制整个生命周期的单点。它绝对取代了 Andrew 方法中的 AWS API 脚本。

代码部署可能也是其中的一部分。Chef 可以用于此,但我不认为这是最好的方法(除非你做的是这么小的事情)。使用代码构建系统(如 Jenkins)和部署系统。我们目前使用内部系统,但希望转向http://octopusdeploy.com/(因为我们主要是一家 .Net 公司)。假设代码位于某个版本控制系统中,例如 Git。

有用的文件:

https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithOpscodeChef.pdf

免责声明:我不是专家。最近才开始着手进行我们的部署设计。但目前的架构看起来与上图类似。

相关内容