Chef infra 如何使用chef将git repo部署到chef节点?

Chef infra 如何使用chef将git repo部署到chef节点?,chef-infra,chef-recipe,Chef Infra,Chef Recipe,简单管理git repo部署到chef节点的标准/最佳/灵活方式是什么?基本上我有一个git repo(开发人员将代码签入其中)。以下是我计划执行的一系列步骤: 1) jenkins服务器完成代码测试后,应该通过调用节点上的chef客户端来启动部署 2) 从git repo中提取代码(服务脚本)并保存到某个地方(在jenkins服务器本身上?) 3) 调用chef客户端时,应执行以下操作: a) 终止其上正在运行的现有服务 b) 从远程位置下载tar文件 c) 安装依赖项(apt get等) d

简单管理git repo部署到chef节点的标准/最佳/灵活方式是什么?基本上我有一个git repo(开发人员将代码签入其中)。以下是我计划执行的一系列步骤:

1) jenkins服务器完成代码测试后,应该通过调用节点上的chef客户端来启动部署

2) 从git repo中提取代码(服务脚本)并保存到某个地方(在jenkins服务器本身上?)

3) 调用chef客户端时,应执行以下操作:

a) 终止其上正在运行的现有服务

b) 从远程位置下载tar文件

c) 安装依赖项(apt get等)

d) 可能需要更新几个配置文件(模板资源?)

e) 将焦油提取到所需位置

f) 启动服务


我想大致了解一下什么样的厨师资源可以用来实现上述目标?在我的例子中,每个节点上只运行一个服务。

一般来说,我会这样做(未测试的代码仅作为展示):

使用资源下载和解包tar文件

属性文件:

default['my_app']['tarball'] = "url of the tarball created by jenkins"
default['my_app']['checksum'] = "sha256sum of your tarfile"
default['my_app']['dependencies']['apache2'] = '2.4.3'
default['my_app']['dependencies']['libXXXX'] = '1.0.0'
配方文件:

service 'my_service' do
  action :enable,:start
end

ark 'whatever' do
  action :put
  url node['my_app']['tarball']
  checksum node['my_app']['checksum']
  path "/where/to/extract"
  notifies :restart, "service[my_service]"
end 

# Loop over the dependencies to create a package resource for each
node['my_app']['dependencies'].each do |package_name,package_version|
  package package_name do
    version package_version
  end
end

template "/where/to/extract/app/etc/config.file" do
  source "config.file.erb"
  variables({
    "var1" => "value1",
    "var2" => "value2"
  })
  notifies :restart, "service[my_service]"
end
如果其中一个部件在运行期间发生移动,则使用该通知将重新启动服务。如果运行chef而不进行更改,则该通知应该是幂等的,并且永远不会执行任何操作

在jenkins跑步后将所有这些链接起来可能会很棘手,因为你必须更新你的烹饪书的一部分价值

校验和应该在每次构建之后更新,依赖项可能必须更新,等等

所有这些更新都可以通过不同的方式实现,我个人倾向于使用与应用程序相同的版本号更新cookbook(以保持简单的回滚方式),但属性也可以通过json文件传递给客户端(品味问题)


进一步的猜测太多了。

一般来说,我会这样做(未经测试的代码仅作为展示):

使用资源下载和解包tar文件

属性文件:

default['my_app']['tarball'] = "url of the tarball created by jenkins"
default['my_app']['checksum'] = "sha256sum of your tarfile"
default['my_app']['dependencies']['apache2'] = '2.4.3'
default['my_app']['dependencies']['libXXXX'] = '1.0.0'
配方文件:

service 'my_service' do
  action :enable,:start
end

ark 'whatever' do
  action :put
  url node['my_app']['tarball']
  checksum node['my_app']['checksum']
  path "/where/to/extract"
  notifies :restart, "service[my_service]"
end 

# Loop over the dependencies to create a package resource for each
node['my_app']['dependencies'].each do |package_name,package_version|
  package package_name do
    version package_version
  end
end

template "/where/to/extract/app/etc/config.file" do
  source "config.file.erb"
  variables({
    "var1" => "value1",
    "var2" => "value2"
  })
  notifies :restart, "service[my_service]"
end
如果其中一个部件在运行期间发生移动,则使用该通知将重新启动服务。如果运行chef而不进行更改,则该通知应该是幂等的,并且永远不会执行任何操作

在jenkins跑步后将所有这些链接起来可能会很棘手,因为你必须更新你的烹饪书的一部分价值

校验和应该在每次构建之后更新,依赖项可能必须更新,等等

所有这些更新都可以通过不同的方式实现,我个人倾向于使用与应用程序相同的版本号更新cookbook(以保持简单的回滚方式),但属性也可以通过json文件传递给客户端(品味问题)


再进一步猜测就太多了。

非常感谢Tensibai给出的详细答案。持续集成和部署的一般模型是什么?那么基本上一旦jenkins测试了构建,流程就停止了?之后,人类将调用一个脚本,在所有节点上运行chef客户端?有很多可能的方法,您可以从jenkins在节点上启动强制运行(刀搜索和通过ssh或winrm远程执行的组合),您可以等待下一次计划的chef运行(这里每30分钟一次),您可以使用推送作业功能。。。哪一个是最好的真的很适合我。谢谢。还有一件事,你写的上面的代码是“ruby”还是某种形式的ruby?DSL?我很难理解这些代码。我只是在irb(ruby)控制台中键入了“default['my_app']['dependencies']['apache2']='2.4.3',它抛出了一个错误。1) 您是如何了解默认['my_app']['dependencies']中的“each”方法的。我指的是如何将上述代码(服务、ark、模板等)转换为标准ruby。我认为服务应该是像Chef::service这样的模块吗?是的,它是Chef recipe DSL中ruby的混合。在属性文件中,default是在默认级别(搜索属性优先级)向节点对象(主要是散列)添加条目的方法。由于它是一个散列,我知道我可以迭代它来创建chef资源(您是对的,它被转换为内部的一个实例)。有用的资源非常有用,非常感谢Tensibai的详细回答。持续集成和部署的一般模型是什么?那么基本上一旦jenkins测试了构建,流程就停止了?之后,人类将调用一个脚本,在所有节点上运行chef客户端?有很多可能的方法,您可以从jenkins在节点上启动强制运行(刀搜索和通过ssh或winrm远程执行的组合),您可以等待下一次计划的chef运行(这里每30分钟一次),您可以使用推送作业功能。。。哪一个是最好的真的很适合我。谢谢。还有一件事,你写的上面的代码是“ruby”还是某种形式的ruby?DSL?我很难理解这些代码。我只是在irb(ruby)控制台中键入了“default['my_app']['dependencies']['apache2']='2.4.3',它抛出了一个错误。1) 您是如何了解默认['my_app']['dependencies']中的“each”方法的。我指的是如何将上述代码(服务、ark、模板等)转换为标准ruby。我认为服务应该是像Chef::service这样的模块吗?是的,它是Chef recipe DSL中ruby的混合。在属性文件中,default是在默认级别(搜索属性优先级)向节点对象(主要是散列)添加条目的方法。由于它是一个散列,我知道我可以迭代它来创建chef资源(您是对的,它被转换为内部的一个实例)。有用的资源是和