第176集:Chef 基础
核心知识点讲解
1. Chef 概述
Chef是一种开源的配置管理工具,用于自动化IT基础设施的配置、部署和管理。它采用客户端-服务器架构,使用Ruby语言编写配置代码,通过声明式的方式定义系统配置,确保系统状态的一致性和可重复性。Chef由Chef Software, Inc.开发和维护,是企业级自动化运维的重要工具之一。
2. Chef 的核心优势
- 基于Ruby:使用Ruby语言编写配置代码,灵活性高,表达能力强
- 客户端-服务器架构:集中管理配置,支持大规模部署
- 资源驱动:通过资源定义系统状态,支持丰富的资源类型
- ** cookbook 系统**:模块化的代码组织方式,支持代码重用和共享
- Ohai:自动收集节点信息,用于条件配置
- 强大的社区:丰富的cookbook库和社区支持
- 可扩展性:支持自定义资源和插件
3. Chef 架构
Chef采用客户端-服务器架构,主要由以下组件组成:
- Chef Server:服务器端组件,负责存储和管理配置代码,处理客户端请求
- Chef Workstation:工作站,用于开发和测试配置代码,上传cookbook到Server
- Chef Client:客户端组件,运行在被管理节点上,执行配置代码
- Cookbook:包含配置代码的包,遵循特定的目录结构
- Recipe:包含具体配置逻辑的Ruby代码文件
- Resource:定义系统状态的基本单元
- Attribute:配置数据,用于自定义cookbook行为
- Ohai:事实收集工具,收集节点的系统信息
- Role:定义节点的角色和配置
- Environment:定义环境相关的配置
4. Chef 的安装
4.1 安装 Chef Workstation
Chef Workstation 是开发和测试 Chef 配置代码的环境,包含了所有必要的工具。
Ubuntu/Debian 系统:
# 下载 Chef Workstation 安装包
wget https://packages.chef.io/files/stable/chef-workstation/20.10.161/ubuntu/20.04/chef-workstation_20.10.161-1_amd64.deb
# 安装 Chef Workstation
dpkg -i chef-workstation_20.10.161-1_amd64.debCentOS/RHEL 系统:
# 下载 Chef Workstation 安装包
wget https://packages.chef.io/files/stable/chef-workstation/20.10.161/el/7/chef-workstation-20.10.161-1.el7.x86_64.rpm
# 安装 Chef Workstation
yum localinstall chef-workstation-20.10.161-1.el7.x86_64.rpm -y4.2 安装 Chef Client
Ubuntu/Debian 系统:
# 下载 Chef Client 安装包
wget https://packages.chef.io/files/stable/chef/17.10.0/ubuntu/20.04/chef_17.10.0-1_amd64.deb
# 安装 Chef Client
dpkg -i chef_17.10.0-1_amd64.debCentOS/RHEL 系统:
# 下载 Chef Client 安装包
wget https://packages.chef.io/files/stable/chef/17.10.0/el/7/chef-17.10.0-1.el7.x86_64.rpm
# 安装 Chef Client
yum localinstall chef-17.10.0-1.el7.x86_64.rpm -y4.3 配置 Chef Server
Chef Server 是 Chef 架构的核心组件,用于存储和管理配置代码。由于 Chef Server 的安装和配置较为复杂,建议使用 Chef Automate 或托管的 Chef Server 服务。
5. Chef 基本概念
5.1 资源(Resource)
资源是 Chef 的基本构建块,代表系统中的一个具体对象,如文件、服务、包等。
资源的基本语法:
resource_type 'name' do
attribute1 'value1'
attribute2 'value2'
action :action_name
end常用资源类型:
package:管理软件包service:管理系统服务file:管理文件directory:管理目录user:管理用户账户group:管理用户组execute:执行命令cron:管理定时任务
5.2 食谱(Recipe)
食谱是包含 Chef 代码的 Ruby 文件,用于定义系统配置。
示例食谱:
# 安装并启动 Nginx
package 'nginx' do
action :install
end
service 'nginx' do
action [:enable, :start]
end
# 创建网站根目录
directory '/var/www/html' do
owner 'www-data'
group 'www-data'
mode '0755'
action :create
end
# 创建索引文件
file '/var/www/html/index.html' do
content '<h1>Hello from Chef!</h1>'
owner 'www-data'
group 'www-data'
mode '0644'
action :create
end5.3 cookbook(食谱集)
cookbook 是包含配置代码的包,遵循特定的目录结构。
cookbook 的目录结构:
cookbook_name/
├── recipes/
│ ├── default.rb # 默认食谱
│ └── other_recipe.rb
├── attributes/
│ └── default.rb # 属性定义
├── files/
│ └── default/ # 静态文件
├── templates/
│ └── default/ # 模板文件(使用ERB语法)
├── resources/ # 自定义资源
├── providers/ # 自定义资源提供者
├── libraries/ # 自定义函数
├── definitions/ # 定义资源
├── attributes/ # 属性
├── metadata.rb # 元数据
└── README.md # 文档5.4 属性(Attribute)
属性是配置数据,用于自定义 cookbook 行为。
属性的定义和使用:
attributes/default.rb:
default['nginx']['version'] = '1.18.0'
default['nginx']['port'] = 80
default['nginx']['docroot'] = '/var/www/html'recipes/default.rb:
package 'nginx' do
version node['nginx']['version']
action :install
end
template '/etc/nginx/sites-available/default' do
source 'default.erb'
variables(
port: node['nginx']['port'],
docroot: node['nginx']['docroot']
)
action :create
notifies :restart, 'service[nginx]'
end5.5 模板(Template)
模板是使用 ERB 语法的文件,用于生成配置文件。
templates/default/default.erb:
server {
listen <%= @port %>;
server_name localhost;
root <%= @docroot %>;
location / {
index index.html;
}
}5.6 角色(Role)
角色用于定义节点的角色和配置。
角色的定义:
name 'webserver'
description 'Web server role'
run_list [
'recipe[nginx]',
'recipe[php]'
]
default_attributes({
'nginx' => {
'port' => 80
},
'php' => {
'version' => '7.4'
}
})5.7 环境(Environment)
环境用于定义环境相关的配置。
环境的定义:
name 'production'
description 'Production environment'
default_attributes({
'nginx' => {
'port' => 80
}
})
override_attributes({
'php' => {
'version' => '7.4'
}
})6. Chef 工作流程
- 开发 cookbook:在 Workstation 上创建和测试 cookbook
- 上传 cookbook:将 cookbook 上传到 Chef Server
- 配置节点:将节点注册到 Chef Server,分配角色和环境
- 运行 Chef Client:在节点上运行 Chef Client,执行配置代码
- 收集报告:Chef Client 向 Chef Server 报告执行结果
7. Chef 命令行工具
7.1 常用命令
# 初始化 Chef 仓库
chef generate repo my-chef-repo
# 生成 cookbook
chef generate cookbook my-cookbook
# 生成食谱
chef generate recipe my-cookbook my-recipe
# 生成模板
chef generate template my-cookbook my-template
# 上传 cookbook 到 Server
knife cookbook upload my-cookbook
# 列出可用的 cookbook
knife cookbook list
# 注册节点
knife bootstrap node.example.com --ssh-user root --ssh-password 'password' --run-list 'recipe[my-cookbook]'
# 查看节点信息
knife node show node.example.com
# 在节点上运行 Chef Client
chef-client
# 测试模式运行(不实际应用配置)
chef-client --why-run7.2 运行模式
- 默认模式:Chef Client 执行完整的配置流程
- 测试模式:使用
--why-run选项,显示将要执行的操作但不实际执行 - 本地模式:使用
--local-mode选项,不依赖 Chef Server,直接执行配置代码
8. Chef 的配置文件
Chef 的配置文件为 ~/.chef/config.rb,用于配置 Chef 命令行工具的行为。
常用配置选项:
# Chef Server URL
chef_server_url 'https://chef-server.example.com/organizations/myorg'
# 客户端名称
node_name 'workstation'
# 客户端密钥
client_key '/path/to/client.pem'
# Cookbook 路径
cookbook_path ['/path/to/cookbooks']
# 环境路径
environment_path '/path/to/environments'
# 角色路径
role_path '/path/to/roles'实用案例分析
案例1:部署 Web 服务器
场景描述:需要在多台服务器上部署和配置 Nginx Web 服务。
解决方案:
- 生成 Nginx cookbook:
chef generate cookbook nginx- 编写默认食谱
recipes/default.rb:
package 'nginx' do
action :install
end
directory node['nginx']['docroot'] do
owner 'www-data'
group 'www-data'
mode '0755'
recursive true
action :create
end
template '/etc/nginx/sites-available/default' do
source 'default.erb'
variables(
port: node['nginx']['port'],
docroot: node['nginx']['docroot']
)
action :create
notifies :restart, 'service[nginx]'
end
service 'nginx' do
action [:enable, :start]
end- 编写属性文件
attributes/default.rb:
default['nginx']['port'] = 80
default['nginx']['docroot'] = '/var/www/html'- 编写模板文件
templates/default/default.erb:
server {
listen <%= @port %>;
server_name localhost;
root <%= @docroot %>;
location / {
index index.html;
}
}- 上传 cookbook 到 Chef Server:
knife cookbook upload nginx- 引导节点并运行 cookbook:
knife bootstrap webserver1.example.com --ssh-user root --ssh-password 'password' --run-list 'recipe[nginx]'实施效果:
- 批量完成了 Nginx Web 服务的部署和配置
- 确保了所有服务器的配置一致性
- 支持通过属性和模板实现配置的自定义
案例2:管理数据库服务器
场景描述:需要在多台服务器上部署和配置 MySQL 数据库服务。
解决方案:
- 生成 MySQL cookbook:
chef generate cookbook mysql- 编写默认食谱
recipes/default.rb:
package 'mysql-server' do
action :install
end
service 'mysql' do
action [:enable, :start]
end
# 设置 MySQL root 密码
execute 'set mysql root password' do
command "mysqladmin -u root password '#{node['mysql']['root_password']}'"
not_if "mysql -u root -p'#{node['mysql']['root_password']}' -e 'SELECT 1'"
action :run
end
# 创建数据库
execute 'create database' do
command "mysql -u root -p'#{node['mysql']['root_password']}' -e 'CREATE DATABASE IF NOT EXISTS #{node['mysql']['database']}'"
action :run
end
# 创建用户
execute 'create user' do
command "mysql -u root -p'#{node['mysql']['root_password']}' -e 'CREATE USER IF NOT EXISTS #{node['mysql']['user']}@'%' IDENTIFIED BY '#{node['mysql']['password']}'""
action :run
end
# 授予权限
execute 'grant privileges' do
command "mysql -u root -p'#{node['mysql']['root_password']}' -e 'GRANT ALL PRIVILEGES ON #{node['mysql']['database']}.* TO #{node['mysql']['user']}@'%'""
action :run
end- 编写属性文件
attributes/default.rb:
default['mysql']['root_password'] = 'your_root_password'
default['mysql']['database'] = 'mydatabase'
default['mysql']['user'] = 'myuser'
default['mysql']['password'] = 'mypassword'- 上传 cookbook 到 Chef Server:
knife cookbook upload mysql- 引导节点并运行 cookbook:
knife bootstrap dbserver1.example.com --ssh-user root --ssh-password 'password' --run-list 'recipe[mysql]'实施效果:
- 批量完成了 MySQL 数据库服务的部署和配置
- 确保了所有数据库服务器的配置一致性
- 支持通过属性实现配置的自定义
课后练习
- 安装 Chef Workstation,并配置 Chef 命令行工具
- 生成一个自定义的 cookbook,实现以下功能:
- 安装并配置 Apache 服务
- 创建网站根目录
- 部署一个简单的静态网站
- 编写一个模板文件,用于生成 Apache 虚拟主机配置
- 使用属性来自定义 cookbook 的行为
- 研究 Chef 的常用资源类型,了解它们的功能和使用方法
总结
本集介绍了Chef的基本概念、架构组成、安装配置和核心组件,以及Chef的基本使用方法。Chef作为一种基于Ruby的配置管理工具,具有灵活性高、表达能力强的特点,是实现企业级自动化运维的重要工具。通过本集的学习,你应该能够掌握Chef的基础知识和基本操作技能,为后续学习Chef的高级功能和实际应用打下基础。