Chef 自动化运维:开始“烹饪”
在 Chef Workstation 上创建了一个 cookbook 之后,我们执行以下命令来进行测试:
chef-client --local-mode --override-runlist first_cookbook
这将在本机执行 cookbook,现在来将 first_cookbook 分发到节点上。
上传 cookbook
Chef Workstation 进行 cookbook 的编写测试之后,需要将其上传到 Chef Server 才能分发到各个节点,执行以下命令将 cookbook 上传:
knife cookbook upload first_cookbook
上传之后来查看服务器的 cookbook 列表,列出 cookbook:
first_cookbook 0.1.0
可以看到 cookbook 已经成功上传,现在在服务器配置节点的运行。
服务器前台管理
在 Chef Server 安装搭建好之后,默认不提供图形界面的前台管理功能,若要使用前台管理我们的 cookbook 以及节点信息,需要安装 Chef Server 的前台界面。执行安装:
chef-server-ctl install chef-manage
重新配置:
随后配置:
chef-manage-ctl reconfigure
管理 Run List
打开前台,默认启用 ssl,所以开放了 Chef Server 的 443 端口。
打开 https://192.168.221.89,可以看到登陆页面,使用管理员登陆。登陆后可以看到节点信息:
{% imgurl chef-tutorial-3/chef-server-manage-1.png %}
然后来编辑节点,配置节点的 Run List:
找到节点配置:
{% imgurl chef-tutorial-3/chef-server-manage-2.png %}
配置 Run List:
{% imgurl chef-tutorial-3/chef-server-manage-3.png %}
将我们的 cookbook 从 Avaliable Recipes 拖到 Current Run List 内。
在 Chef Workstation 中执行命令:
knife ssh chef-client.geekrainy.local 'chef-client' -m -x root -P passowrd
可以看到输出:
[root@chef-dk chef-repo]# knife ssh chef-client.geekrainy.local 'chef-client' -m -x root -P 940911
chef-client.geekrainy.local Starting Chef Client, version 13.6.4
chef-client.geekrainy.local resolving cookbooks for run list: ["first_cookbook"]
chef-client.geekrainy.local Synchronizing Cookbooks:
chef-client.geekrainy.local - first_cookbook (0.1.0)
chef-client.geekrainy.local Installing Cookbook Gems:
chef-client.geekrainy.local Compiling Cookbooks...
chef-client.geekrainy.local Converging 7 resources
chef-client.geekrainy.local Recipe: first_cookbook::default
chef-client.geekrainy.local * file[/root/test.txt] action create
chef-client.geekrainy.local - create new file /root/test.txt
chef-client.geekrainy.local - update content in file /root/test.txt from none to 48a12b
chef-client.geekrainy.local --- /root/test.txt 2017-12-27 17:33:34.259758283 +0800
chef-client.geekrainy.local +++ /root/.chef-test20171227-8105-1u3f11.txt 2017-12-27 17:33:34.258758279 +0800
chef-client.geekrainy.local @@ -1 +1,2 @@
chef-client.geekrainy.local +This file was created by Chef!
chef-client.geekrainy.local - restore selinux security context
chef-client.geekrainy.local * yum_package[pcre-devel] action install
chef-client.geekrainy.local - install version 8.32-17.el7 of package pcre-devel
chef-client.geekrainy.local * yum_package[openssl] action install (up to date)
chef-client.geekrainy.local * yum_package[openssl-devel] action install
chef-client.geekrainy.local - install version 1.0.2k-8.el7 of package openssl-devel
chef-client.geekrainy.local * cookbook_file[/etc/init.d/nginx] action create
chef-client.geekrainy.local - create new file /etc/init.d/nginx
chef-client.geekrainy.local - update content in file /etc/init.d/nginx from none to 0bc460
chef-client.geekrainy.local --- /etc/init.d/nginx 2017-12-27 17:35:32.489219470 +0800
chef-client.geekrainy.local +++ /etc/init.d/.chef-nginx20171227-8105-19448uh 2017-12-27 17:35:32.488219466 +0800
chef-client.geekrainy.local @@ -1 +1,56 @@
chef-client.geekrainy.local +#!/bin/bash
chef-client.geekrainy.local +#chkconfig: 345 86 16
chef-client.geekrainy.local +start(){
chef-client.geekrainy.local +if [ -f /var/lock/subsys/tengine.lock ];then
chef-client.geekrainy.local + echo "Tengine is already running: [ FAILED ]"
chef-client.geekrainy.local +else
chef-client.geekrainy.local + if /usr/local/nginx/sbin/nginx ;then
chef-client.geekrainy.local + echo "Starting tengine: [ OK ]"
chef-client.geekrainy.local + touch /var/lock/subsys/tengine.lock
chef-client.geekrainy.local + else
chef-client.geekrainy.local + echo "Starting tengine: [ FAILED ]"
chef-client.geekrainy.local + fi
chef-client.geekrainy.local +fi
chef-client.geekrainy.local +}
chef-client.geekrainy.local +stop(){
chef-client.geekrainy.local +if [ -f /var/lock/subsys/tengine.lock ];then
chef-client.geekrainy.local + if /usr/local/nginx/sbin/nginx -s quit ;then
chef-client.geekrainy.local + echo "Stopping tengine: [ OK ]"
chef-client.geekrainy.local + rm -rf /var/lock/subsys/tengine.lock
chef-client.geekrainy.local + else
chef-client.geekrainy.local + echo "Stopping tengine: [ FAILED ]"
chef-client.geekrainy.local + fi
chef-client.geekrainy.local +else
chef-client.geekrainy.local + echo "Tengine not runing: [ FAILED ]"
chef-client.geekrainy.local +fi
chef-client.geekrainy.local +}
chef-client.geekrainy.local +reload(){
chef-client.geekrainy.local +if /usr/local/nginx/sbin/nginx -s reload ;then
chef-client.geekrainy.local + echo "Reload tengine: [ OK ]"
chef-client.geekrainy.local +else
chef-client.geekrainy.local + echo "Reload tengine: [ FAILED ]"
chef-client.geekrainy.local +fi
chef-client.geekrainy.local +}
chef-client.geekrainy.local +case $1 in
chef-client.geekrainy.local +"start")
chef-client.geekrainy.local + start
chef-client.geekrainy.local +;;
chef-client.geekrainy.local +"stop")
chef-client.geekrainy.local + stop
chef-client.geekrainy.local +;;
chef-client.geekrainy.local +"restart")
chef-client.geekrainy.local + stop
chef-client.geekrainy.local + sleep 1
chef-client.geekrainy.local + start
chef-client.geekrainy.local +;;
chef-client.geekrainy.local +"reload")
chef-client.geekrainy.local + reload
chef-client.geekrainy.local +;;
chef-client.geekrainy.local +"status")
chef-client.geekrainy.local + s=`pidof -s nginx`
chef-client.geekrainy.local + [ "$s" ] && echo "Tengine(nginx) pid $s running!!" || echo "Tengine(nginx) not runging!"
chef-client.geekrainy.local +;;
chef-client.geekrainy.local +*)
chef-client.geekrainy.local +echo "usage: $0 start|stop|restart|reload|status"
chef-client.geekrainy.local +esac
chef-client.geekrainy.local - change mode from '' to '0755'
chef-client.geekrainy.local - change owner from '' to 'root'
chef-client.geekrainy.local - change group from '' to 'root'
chef-client.geekrainy.local - restore selinux security context
chef-client.geekrainy.local * script[install_tengine] action run
chef-client.geekrainy.local - execute "bash" "/tmp/chef-script20171227-8105-irvw5g"
chef-client.geekrainy.local * service[nginx] action start
chef-client.geekrainy.local - start service service[nginx]
chef-client.geekrainy.local
chef-client.geekrainy.local Running handlers:
chef-client.geekrainy.local Running handlers complete
chef-client.geekrainy.local Chef Client finished, 6/7 resources updated in 03 minutes 21 seconds
执行完成即可创建成功,在 Chef Client 中执行验证:
service nginx status
看到输出:
Tengine(nginx) pid 23776 running!!
证明已经部署成功。
命令行运行
除了在 Chef Server 前台管理外,还可在 Chef Workstation 内使用命令行来管理 Run List。
查看 Node 的状态:
[root@chef-dk chef-repo]# knife node show chef-client.geekrainy.local
Node Name: chef-client.geekrainy.local
Environment: _default
FQDN: chef-client.geekrainy.local
IP: 192.168.221.91
Run List:
Roles:
Recipes: first_cookbook, first_cookbook::default
Platform: centos 7.3.1611
Tags:
这里看到 Run List 为空,接下来将我们的 cookbook 添加到 Run List,我们定义了默认的 Recipes: default,因而添加 cookbook 实际上执行的就是 cookbook 中的 default recipes。
[root@chef-dk chef-repo]# knife node run_list add chef-client.geekrainy.local recipe[first_cookbook]
chef-client.geekrainy.local:
run_list: recipe[first_cookbook]
再次查看状态:
[root@chef-dk chef-repo]# knife node show chef-client.geekrainy.local
Node Name: chef-client.geekrainy.local
Environment: _default
FQDN: chef-client.geekrainy.local
IP: 192.168.221.91
Run List: recipe[first_cookbook]
Roles:
Recipes: first_cookbook, first_cookbook::default
Platform: centos 7.3.1611
Tags:
就成功添加了一个 Run List。
编辑 node 配置文件
通过编辑 node 配置文件,也可以编辑 Run List。
knife node edit chef-client.geekrainy.local
执行后可能报错:
ERROR: You must set your EDITOR environment variable or configure your editor via knife.rb
配置环境变量可以解决:
export "EDITOR=vim"
再次执行后可以编辑 JSON 格式的节点信息:
{
"name": "chef-client.geekrainy.local",
"chef_environment": "_default",
"normal": {
"tags": [
]
},
"policy_name": null,
"policy_group": null,
"run_list": [
"recipe[first_cookbook]"
]
}
关于 Knife 和 Run List 的更多信息可以参考:
扩展
上文介绍了通过 Chef Server 的前台界面和命令行对节点的 Run List 进行管理,并且可以成功执行我们的 “烹饪”操作,但这两种方法都有不便之处。用前台界面管理虽然直观但管理更多节点时效率低,命令行也显得繁琐并且容易进行误操作。在执行 kinfe bootstrap
的过程中,也可以用编辑好的 json 文件进行节点的初始化:
knife bootstrap localhost -p 2200 -N ubuntu-12.04 -r 'role[group1]' --ssh-user vagrant --sudo --bootstrap-vault-file sea-power-bootstrap-vault-file.json
上述为官网示例,在 json 中去定义和编辑,是一种较为可靠的定义节点的方式。
到这里,就简单的完成了从构建节点,到创建 cookbook,到测试发布的过程。然而,这里的示例存在很多不足,不具有较强的普适性,扩展和管理都很不便。接下来将配置一个较为完善的 cookbook,来探索一些较为优雅的实践方式。
-EOF-
Chef 自动化运维:开始“烹饪”的更多相关文章
- Chef 自动化运维:初探 cookbook
cookbook 概述 Chef 意为"厨房",我们要做"菜",自然需要有"菜谱".事实上在 Chef 中分发到各服务器节点的不是" ...
- Chef 自动化运维:Chef 的安装
安装准备 准备三台服务器,分别用作 Chef Server.Chef DK.Chef Client 的安装使用. 在三台服务器中,添加以下 hosts: vim /etc/hosts 192.168. ...
- linux自动化运维工具Ansible saltstack Puppet、Chef、Fabric之间的对比
发现分布式是一个发展的趋势,无论是大型网站的负载均衡架构还是大数据框架部署,以及云存储计算系统搭建都离不开多台服务器的连续部署和环境搭建. 当我们的基础架构是分散式或者基于云的,并且我们经常需要处理在 ...
- 自动化运维工具Ansible详细部署 (转载)
自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...
- 自动化运维工具之ansible
自动化运维工具之ansible 一,ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...
- 七天学会 SALT STACK 自动化运维 (1)
七天学会 SALT STACK 自动化运维 (1) 简单理解 SALTSTACK 安装与配置 基本的使用方法 结束语 引用资源 简单理解 SALT STACK 笔者是初次接触 自动化运维 这一技术领域 ...
- 自动化运维工具Ansible详细部署
本文来源:http://sofar.blog.51cto.com/353572/1579894/ 前言 一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方 ...
- Ansible_自动化运维《Ansible之初识-1》
1.Ansible简介 1.1 Ansible介绍 Ansible 是一个简单的自动化运维管理工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...
- 自动化运维工具——ansible详解(一)
ansible 简介 ansible 是什么? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统 ...
随机推荐
- tensorflow 从入门到摔掉肋骨 教程二
构造你自己的第一个神经网络 通过手势的图片识别图片比划的数字:1) 现在用1080张64*64的图片作为训练集2) 用120张图片作为测试集 定义初始化值 def load_dataset(): ...
- SDRAM操作(FPGA实现)
对SDRAM基本概念的介绍以及芯片手册说明,请参考上一篇文章SDRAM操作说明. 1. 说明 如图所示为状态机的简化图示,过程大概可以描述为:SDRAM(IS42S16320D)上电初始化完成后,进入 ...
- Web攻击技术
Web攻击技术 1.针对Web的攻击技术 1.1.在客户端即可篡改请求 在Web应用中,从浏览器那接收到的Http的全部内容,都可以在客户端自由地变更.篡改,所以Web应用可能会接收到与预期数据不相同 ...
- CVE-2017-11882漏洞 Msf利用复现
中午时候收到了推送的漏洞预警,在网上搜索相关信息看到很多大牛已经开发出生成doc文档的脚本和msf的poc,本文记录CVE-2017-11882 漏洞在 Msf下的利用. 0x00 漏洞简介 2017 ...
- AIO5打印样式函数说明
函数名称 描述 _RM_Column 返回当前栏目数. _RM_Line 返回数据行数(从分组的起始位置开始) _RM_LineThough 返回数据行数(从报表的起始位置开始) _RM_Page 返 ...
- 调试利器:SSH隧道
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本文作者:ivweb 吴浩麟 原文出处:IVWEB社区 未经同意,禁止转载 在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需 ...
- 静态频繁子图挖掘算法用于动态网络——gSpan算法研究
摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的 ...
- Java精选笔试题
合抱之木,生于毫末:九层之台,起于垒土:千里之行:始于足下.赶快测测你的Java基础知识掌握的如何? 1,下列说法正确的是() A.一个文件里可以同时存在两个public修饰的类 B.构造函数可以被重 ...
- IDisposeable,Close
一.资源分类 资源分为托管资源和非托管资源. 非托管资源:所有的windows内核对象(句柄)都是非托管资源,如stream,数据库连接,GDI+和COM对象等,这些资源不受CLR管理. 托管资源:由 ...
- [Docker网络]模拟一台交换机的拓扑
[Docker网络]模拟一台交换机的拓扑 本例主要对Docker网络进行实际运用. 背景介绍 一台虚拟机如何模拟成一台多端口交换机分别连接多台虚拟机? bridge网桥技术 实验准备 docker d ...