【问题标题】:Site Deployment with Chef but without full Node setup [closed]使用 Chef 进行站点部署但没有完整的节点设置 [关闭]
【发布时间】:2014-01-08 23:15:49
【问题描述】:

我们使用 Chef (Chef-Solo) 创建我们的托管站点节点,这非常棒。

我们使用 Knife Solo 以 JSON 文件的形式跟踪我们的节点。我们的节点配置(json 文件)本身被检入到 git 存储库中。我们的节点设置文件和服务器(节点)本身之间存在一对一的关系。

一些节点为一个客户端托管多个站点,如果有一个轻量级的解决方案,只为其中一个站点运行 chef 进程的部署部分,而不是运行整个 Chef 节点设置过程,那就太好了。

我意识到这可能是以一种不打算使用的方式使用 chef。我得到了 Chef 的“拉”方法,它是幂等的,它是如何用于配置管理的,以及这种类型的事情如何超出人们通常会做的范围。简而言之...我想利用 Chef deploy 资源来部署站点,但不会在特定服务器上部署所有站点。

另外,我熟悉 Capistrano 以及它如何或多或少地完成我想做的事情......如果我能提供帮助,我只是不想在我们的 DevOps 工作流程中引入另一个框架。看起来似乎 Chef 的部署方式与 Capistrano 非常相似,我希望有一种方法可以像这样利用 Chef。

谢谢

【问题讨论】:

  • 我相信这更适合服务器故障。
  • 不,我不同意。 Chef 非常注重代码和编程

标签: chef-infra chef-solo knife knife-solo


【解决方案1】:

我唯一的想法是chef-apply

【讨论】:

  • 谢谢,我会评估是否有办法利用它。我以前没有听说过厨师申请,它可能比我前进的方向更容易。我想问题是它是否可以与厨师独奏设置一起使用。似乎没有太多文档。
【解决方案2】:

您可以使用多个厨师食谱 - 一个客户站点的一份食谱。并在本食谱中部署站点。

【讨论】:

  • 但是对于一个厨师来说,他不能跳过一些食谱。
  • 你不需要跳过一些食谱。您必须将只需要的说明书添加到服务器或此服务器的角色。示例:我想要引导“nginx-app1”服务器 - 我为 app1 创建说明书,并创建角色 (app1-server),其中包括 nginx 和 app1 说明书,然后 - 使用角色 app1-server 引导服务器
【解决方案3】:

因此,经过广泛的研发后,我确定了我的选择。以下是选项,也是我最终选择的选项。

  • chef-apply
    • 这是 chef v11 中引入的方便实用程序,可让您快速运行食谱。主要用于测试。
    • 这方面的不足之处在于,要真正使配方可重用,您需要有某种形式的参数。此实用程序似乎不支持这一点。
  • 当我使用knife-solo 时,我为本地管理的每个“节点”(以及在 git 存储库中)都有一个 json 文件。对于那些不熟悉的人..knife-solo 使用与您正在连接和设置的主机(节点)的名称匹配的 json 文件。我可以为我的主机名管理一些别名,而不是选择一个 json 文件,该文件只部署站点而没有其他任何内容。
    • 这需要设置仅用于部署站点的配方。根据您设置食谱和食谱的方式,您可能已经将站点部署逻辑与其自己的食谱隔离。如果没有,您可以进行重构。
    • 这需要广泛使用 ssh config 文件。而且真的不是很灵活或直观。如果您预计您可能不是唯一使用此设置的人,则尤其需要担心。
    • 这个复杂了。
  • 走出刀单的领域,可以直接在服务器上运行chef-solo。这仍然需要一个 JSON 文件来指定参数/参数,以及要运行的配方。
    • 在服务器上运行 chef-solo -c solo.rb -p deploy.json 是一种只运行 deploy.json 文件中定义的 Chef 服务器设置过程的子集的快速方法。

把它们放在一起

使用原版 chef-solo 可执行文件的最大问题是必须通过 JSON 文件指定参数(有 discussion 关于如何在 CLI 上指定 JSON 内联,但没有'似乎不起作用,至少可靠)。

简而言之,应该有一个标准的服务器设置 JSON 文件(如果需要,可以由刀单独管理),其中包含所有服务器设置。然后有一个小的 json 文件每个站点 在仅部署该站点的主机上。

我所做的是使用主厨服务器设置配置来创建每个站点所需的 json 文件。我的主厨进程已经知道服务器上的每个站点,因为它需要部署站点代码、设置数据库和配置 apache 等。因此,除此之外,它还会创建一个指示运行的 json 文件列表和一些其他属性,指示要部署哪个站点。

我使用 .erb 文件来创建站点部署 json 文件。例如:

{
 "custom_cookbook": {
    "deployroot": "<%= @deployroot %>",
    <% if @git_revision -%>
    "git_revision": "<%= @git_revision %>",
    <% end -%>
    <% if @settings_file -%>
    "settings-file": "<%= @settings_file %>",
    <% end -%>
    "git_repository_url": "<%= @git_repository_url %>"
  },
  "run_list": [
    "recipe[custom_cookbook::deploy]"
  ]
}

一旦这些 json 文件就位,使用 chef 部署站点只需运行上面指定的 chef-solo 命令,并使用 -j 参数指定由 master/primary chef 进程创建的自定义站点特定 json 文件。

我们通过Jenkins (more info on how I use jenkins) 启动部署,尽管这可以使用任何可以通过 SSH 访问该站点的方式来完成。

希望这会有所帮助。

【讨论】:

  • 听起来很有趣!很高兴看到您找到了解决问题的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 2019-06-14
  • 2012-06-03
  • 2020-03-16
相关资源
最近更新 更多