前边有写过使用omnibus-ctl 制作软件包的,但是当时没有集成chef,只有一个空壳子,实际上omnibus-ctl 已经内置
了对于chef 的操作(但是我们还需要在添加一个依赖),以下简单说明两者如何进行集成

demo 是一个类似gitlab-ctl 的操作,但是只有一个简单的cookbook,实际上可以自己进行扩展

项目准备

  • 项目初始化
omnibus new gitlab
  • 项目结构

    添加了关于cookbook 操作之后的

├── Berksfile
├── Gemfile
├── README.md
├── config
│ ├── projects
│ │ └── gitlab.rb
│ ├── software
│ │ ├── chef-gem.rb
│ │ ├── chef-zero.rb
│ │ ├── gitlab-cookbooks.rb
│ │ ├── gitlab-ctl.rb
│ │ ├── gitlab-zlib.rb
│ │ └── preparation.rb
│ └── templates
│ └── gitlab-cookbooks
│ └── dna.json.erb
├── files
│ ├── gitlab-cookbooks
│ │ ├── dalong
│ │ │ ├── CHANGELOG.md
│ │ │ ├── Gemfile
│ │ │ ├── Gemfile.lock
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── attributes
│ │ │ │ └── userlogin.rb
│ │ │ ├── chefignore
│ │ │ ├── files
│ │ │ │ └── dalong
│ │ │ ├── kitchen.yml
│ │ │ ├── metadata.rb
│ │ │ ├── recipes
│ │ │ │ ├── dalong.rb
│ │ │ │ ├── default.rb
│ │ │ │ └── userlogin.rb
│ │ │ ├── spec
│ │ │ │ ├── spec_helper.rb
│ │ │ │ └── unit
│ │ │ │ └── recipes
│ │ │ │ ├── dalong_spec.rb
│ │ │ │ ├── default_spec.rb
│ │ │ │ └── userlogin_spec.rb
│ │ │ ├── templates
│ │ │ │ └── userlogin.erb
│ │ │ └── test
│ │ │ └── integration
│ │ │ └── default
│ │ │ ├── dalong_test.rb
│ │ │ ├── default_test.rb
│ │ │ └── userlogin_test.rb
│ │ ├── dna.json
│ │ └── solo.rb
│ └── gitlab-ctl-commands
│ └── config.rb
├── omnibus.rb
└── package-scripts
    └── gitlab
        ├── postinst
        ├── postrm
        ├── preinst
        └── prerm
  • 简单说明
    以上就是一个普通的使用omnibus 创建的包项目,同时添加了omnibus-ctl 对于cookbbok 操作的配置以及集成omnibus-ctl

代码说明

详细代码参考:https://github.com/rongfengliang/omnibus-ctl-demo

  • config/project/gitlab.rb
    主要是关于项目的说明以及依赖的处理
#
# Copyright 2019 YOUR NAME
#
# All Rights Reserved.
#
name "gitlab"
maintainer "rongfengliang"
homepage "https://github.com/rongfengliang"
# Defaults to C:/my on Windows
# and /opt/my on all other platforms
install_dir "#{default_root}/#{name}"
build_version Omnibus::BuildVersion.semver
build_iteration 1
# Creates required build directories
dependency "preparation"
dependency "gitlab-ctl"
dependency 'gitlab-cookbooks'
dependency 'chef-zero'
dependency 'chef-gem'
# my dependencies/components
# dependency "somedep"
exclude "**/.git"
exclude "**/bundler/git"
  • software 定义
    这个分了ctl的以及关于cookbook ,还有就是chef 操作的(omnibus-ctl的命令依赖)
    config/software/gitlab-ctl.rb:
name "gitlab-ctl"
dependency "omnibus-ctl"
source :path => File.expand_path("files/gitlab-ctl-commands", RbConfig::CONFIG['project_root'])
build do
  block do
    open("#{install_dir}/embedded/bin/gitlab-ctl", "w") do |file|
      file.print <<-EOH
#!/bin/bash
# Ruby environment if gitlab-ctl is called from a Ruby script.
for ruby_env_var in RUBYOPT \\
                    BUNDLE_BIN_PATH \\
                    BUNDLE_GEMFILE \\
                    GEM_PATH \\
                    GEM_HOME
do
  unset $ruby_env_var
done
#{install_dir}/embedded/bin/omnibus-ctl gitlab #{install_dir}/embedded/service/omnibus-ctl $@
       EOH
    end
  end
  command "chmod 755 #{install_dir}/embedded/bin/gitlab-ctl"
  # additional omnibus-ctl commands
  sync "#{project_dir}/", "#{install_dir}/embedded/service/omnibus-ctl/"
end

config/software/gitlab-cookbooks.rb:

#
# Copyright:: Copyright (c) 2012 Opscode, Inc.
# Copyright:: Copyright (c) 2014 GitLab.com
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
name 'gitlab-cookbooks'
license 'Apache-2.0'
source path: File.expand_path('files/gitlab-cookbooks', Omnibus::Config.project_root)
build do
  cookbook_name = 'dalong::default'
  command "mkdir -p #{install_dir}/embedded/cookbooks"
  sync './', "#{install_dir}/embedded/cookbooks/"
  erb dest: "#{install_dir}/embedded/cookbooks/dna.json",
      source: 'dna.json.erb',
      mode: 0644,
      vars: { master_cookbook: cookbook_name }
end
 

config/software/chef-gem.rb:

#
# Copyright 2012-2014 Chef Software, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
name 'chef-gem'
# The version here should be in agreement with /Gemfile.lock so that our rspec
# testing stays consistent with the package contents.
default_version '14.13.11'
license 'Apache-2.0'
license_file 'LICENSE'
skip_transitive_dependency_licensing true
dependency 'ruby'
dependency 'rubygems'
dependency 'libffi'
dependency 'rb-readline'
build do
  env = with_standard_compiler_flags(with_embedded_path)
  gem 'install chef' \
      " --version '#{version}'" \
      " --bindir '#{install_dir}/embedded/bin'" \
      ' --no-document', env: env
end

config/software/chef-zero.rb(chef-client 实际上就是调用的这个,所以是一个比较重要的)

#
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
name 'chef-zero'
# The version here should be in agreement with /Gemfile.lock so that our rspec
# testing stays consistent with the package contents.
default_version '14.0.12'
license 'Apache-2.0'
license_file 'LICENSE'
skip_transitive_dependency_licensing true
dependency 'ruby'
dependency 'rubygems'
build do
  env = with_standard_compiler_flags(with_embedded_path)
  gem 'install chef-zero' \
      " --version '#{version}'" \
      " --bindir '#{install_dir}/embedded/bin'" \
      ' --no-document', env: env
end
  • cookbook
    编写了一个简单的cookbook,可以在执行reconfigure 的时候自动生成需要的文件
    files/gitlab-cookbooks 目录,实际上就是一个简单的chef cookbook 项目,核心是
    使用chef-client local 模式的配置solo.rb 以及dns.json(实际是用模版生成的)
    solo.rb:
CURRENT_PATH = File.expand_path(File.dirname(__FILE__))
TIME = Time.now.to_i
LOG_PATH = '/var/log/gitlab/reconfigure'.freeze
Dir.exist?(LOG_PATH) || FileUtils.mkdir_p(LOG_PATH)
file_cache_path "#{CURRENT_PATH}/cache"
cookbook_path CURRENT_PATH
cache_path "#{CURRENT_PATH}/cache"
verbose_logging false
# Log to the reconfigure log
log_location "#{LOG_PATH}/#{TIME}.log"
log_level :info

dns.json:

{
    "run_list": [ "recipe[dalong::default]" ]

构建&&运行效果

  • 构建
bundle install --binstubs
bin/omnibus build gitlab
  • 生成的rpm 包
├── gitlab-0.0.0+20190706121815-1.el7.x86_64.rpm
├── gitlab-0.0.0+20190706121815-1.el7.x86_64.rpm.metadata.json
└── version-manifest.json
  • 安装rpm 包
yum install gitlab-0.0.0+20190706121815-1.el7.x86_64.rpm
已加载插件:fastestmirror
正在检查 gitlab-0.0.0+20190706121815-1.el7.x86_64.rpm: gitlab-0.0.0+20190706121815-1.el7.x86_64
gitlab-0.0.0+20190706121815-1.el7.x86_64.rpm 将被安装
正在解决依赖关系
--> 正在检查事务
---> 软件包 gitlab.x86_64.0.0.0.0+20190706121815-1.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
=======================================================================================================================
 Package 架构 版本 源 大小
=======================================================================================================================
正在安装:
 gitlab x86_64 0.0.0+20190706121815-1.el7 /gitlab-0.0.0+20190706121815-1.el7.x86_64 82 M
事务概要
=======================================================================================================================
安装 1 软件包
总计:82 M
安装大小:82 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
You're about to install gitlab!
  正在安装 : gitlab-0.0.0+20190706121815-1.el7.x86_64 1/1
Thank you for installing gitlab! please run gitlab-ctl reconfigure
  验证中 : gitlab-0.0.0+20190706121815-1.el7.x86_64 1/1
已安装:
  gitlab.x86_64 0:0.0.0+20190706121815-1.el7
完毕!
 
 
  • 配置path
    因为是测试,就没有配置使用软连接配置gitlab-ctl,临时方法
export PATH=$PATH:/opt/gitlab/embedded/bin/
  • 运行reconfigure
gitlab-ctl reconfigure

效果

gitlab-ctl reconfigure
[2019-07-06T20:52:31+08:00] INFO: Started chef-zero at chefzero://localhost:1 with repository at /opt/gitlab/embedded
  One version per cookbook
Starting Chef Client, version 14.13.11
[2019-07-06T20:52:31+08:00] INFO: *** Chef 14.13.11 ***
[2019-07-06T20:52:31+08:00] INFO: Platform: x86_64-linux
[2019-07-06T20:52:31+08:00] INFO: Chef-client pid: 28331
[2019-07-06T20:52:31+08:00] INFO: The plugin path /etc/chef/ohai/plugins does not exist. Skipping...
[2019-07-06T20:52:35+08:00] INFO: Setting the run_list to ["recipe[dalong::default]"] from CLI options
[2019-07-06T20:52:35+08:00] INFO: Run List is [recipe[dalong::default]]
[2019-07-06T20:52:35+08:00] INFO: Run List expands to [dalong::default]
[2019-07-06T20:52:35+08:00] INFO: Starting Chef Run for dalong
[2019-07-06T20:52:35+08:00] INFO: Running start handlers
[2019-07-06T20:52:35+08:00] INFO: Start handlers complete.
resolving cookbooks for run list: ["dalong::default"]
[2019-07-06T20:52:35+08:00] INFO: Loading cookbooks [dalong@0.1.0]
Synchronizing Cookbooks:
  - dalong (0.1.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 2 resources
Recipe: dalong::default
  * cookbook_file[/opt/dalongdemo] action create (up to date)
  * template[/opt/userinfo] action create[2019-07-06T20:52:35+08:00] INFO: template[/opt/userinfo] backed up to /opt/gitlab/embedded/cookbooks/cache/backup/opt/userinfo.chef-20190706205235.478792
[2019-07-06T20:52:35+08:00] INFO: template[/opt/userinfo] updated file contents /opt/userinfo
    - update content in file /opt/userinfo from 1c0757 to 5899a9
    --- /opt/userinfo 2019-07-06 20:19:37.413578996 +0800
    +++ /opt/.chef-userinfo20190706-28331-7hw6nj 2019-07-06 20:52:35.476613088 +0800
    @@ -1,4 +1,4 @@
    -user demo 2019-07-06 20:19:37 +0800
    +user demo 2019-07-06 20:52:35 +0800
     config info dalong
[2019-07-06T20:52:35+08:00] INFO: Chef Run complete in 0.237688022 seconds
Running handlers:
[2019-07-06T20:52:35+08:00] INFO: Running report handlers
Running handlers complete
[2019-07-06T20:52:35+08:00] INFO: Report handlers complete
Chef Client finished, 1/2 resources updated in 03 seconds
gitlab Reconfigured!

说明

以上就是一个简单的学习,测试,实际上我们将两者集成起来,可以方便的进行软件配置管理

参考资料

https://github.com/rongfengliang/omnibus-ctl-demo
https://www.cnblogs.com/rongfengliang/p/11114158.html
https://github.com/chef/omnibus
https://github.com/chef/omnibus-ctl
https://github.com/chef/omnibus-software
https://github.com/gitlabhq/omnibus-gitlab
https://docs.chef.io/ctl_chef_client.html

集成omnibus-ctl+ chef 制作一个可配置的软件包的更多相关文章

  1. 使用React制作一个可配置的页面生成器[0]

    背景 上班两年多,终于来到一家互联网公司,告别之前的朝九晚六的腐败生活,开始了11116的码农之旅. 因为公司做的是直播相关的业务,所以伴随着直播,不定期的就会有运营活动-.- 但是这类活动留给码农的 ...

  2. Swift 制作一个新闻通知中心插件1

    使用 Swift 制作一个新闻通知中心插件(1) 随着 iOS 8 的发布,苹果为开发者们开放了很多新的 API,而在这些开放的接口中 通知中心插件 无疑是最显眼的一个.通知中心就不用过多介绍了,相信 ...

  3. springboot2.x基础教程:动手制作一个starter包

    上一篇博客介绍了springboot自动装配的原理.springboot本身有丰富的spring-boot-starter-xx集成组件,这一篇趁热打铁加深理解,我们利用springboot自动装配的 ...

  4. 制作一个简洁的jquery插件

    原文:http://mp.weixin.qq.com/s?__biz=MzAxMzgwNDU3Mg==&mid=401571467&idx=1&sn=08cb00963e6ef ...

  5. iOS自定义控件教程:制作一个可重用的旋钮

    当你的APP需要一些新功能时,自定义UI控件会十分有用,尤其是这些自定义控件可以在其他APP里面很好的重用.Colin Eberhart写过一篇很棒的介绍自定义UI控件的教程.这个教程涉及的是一个继承 ...

  6. 用WebCollector制作一个爬取《知乎》并进行问题精准抽取的爬虫(JAVA)

    简单介绍: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API.仅仅需少量代码就可以实现一个功能强大的爬虫. 怎样将WebCollector导入项目请 ...

  7. 实例学习SSIS(一)--制作一个简单的ETL包

    原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SS ...

  8. ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork 制作一个添加新闻功能

    本文将交大伙怎么集成ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork来制作一个新闻系统 先上截图: 添加页面如下: 下面来看代码部分 列表页如下: @ ...

  9. 老李分享:持续集成学好jenkins之Git和Maven配置

    老李分享:持续集成学好jenkins之Git和Maven配置   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

随机推荐

  1. 2019 年在 Raspberry Pi 「树莓派」上运行的 10 个操作系统推荐

    原文:2019 年在 Raspberry Pi 「树莓派」上运行的 10 个操作系统推荐 image Raspberry Pi** 是一款基于 ARM 的单板计算机,默认运行一款称为 Raspbian ...

  2. EF CodeFirst Dome学习

    创建ConsoleDome控制台应用程序 从NuGet包管理器安装EntityFramework 创建DbContextDome类并继承DbContext public class DbContext ...

  3. 在Windows中运行Linux bash命令的几种方法

    如果你正在课程中正在学习 shell 脚本,那么需要使用 Linux 命令来练习命令和脚本. 你的学校实验室可能安装了 Linux,但是你自己没有安装了 Linux 的笔记本电脑,而是像其他人一样的 ...

  4. 英语DYAMAUND钻石DYAMAUND单词

    dyamaund and the English words dyamaund The Vertu of the Dyamaund": Gemstones, Knowledge and Va ...

  5. SocksCap代理

    所有Windows应用都可以使用Socks代理上网,即使不支持Socks代理的应用也可以用Socks代理上网 配置代理 点击"添加",代理类型可以修改, 支持代理测试 运行程序 点 ...

  6. Ubuntu 系统装机指南

    1.vim设置 2.git配置 3.系统性能监视器:Ubuntu安装系统监视器 4.编译环境安装:sudo apt-get install build-essential

  7. 【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行速度的比较

    [知识点整理]Oracle中NOLOGGING.APPEND.ARCHIVE和PARALLEL下,REDO.UNDO和执行速度的比较 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 ...

  8. VS调试 DataTable (转载)

    调试的时候遇到一个问题:不知道怎么在自动窗口或者添加监视那里查看DataSet或者DataTable的具体的值.度娘了一下很多都是添加DataTable.Rows[][]监视,但是一行一列地看还是有点 ...

  9. tomcat将控制台输出定向到特定的文件中,并且一天一个文件

    在bin目录的start.bat中,编辑: call "%EXECUTABLE%" start %CMD_LINE_ARGS% 改成: call "%EXECUTABLE ...

  10. 肖哥HCNP-正式篇笔记

    21.网工学习环境准备. 一. 关掉所有杀毒软件及管家如阿健. 二. 安装环回网卡 (一定要先安装.) 1. 计算机设备管理 2. 在右侧最上端计算机名上方右键,点击过时硬件. 3. 下一步.手动选择 ...