第175集:Puppet 基础
核心知识点讲解
1. Puppet 概述
Puppet是一种开源的配置管理工具,用于自动化IT基础设施的配置、部署和管理。它采用客户端-服务器架构,通过声明式语言定义系统配置,确保系统状态的一致性和可重复性。Puppet由Puppet Labs(现为Puppet, Inc.)开发和维护,是企业级自动化运维的重要工具之一。
2. Puppet 的核心优势
- 声明式配置:使用Puppet DSL(领域特定语言)描述系统的期望状态
- 客户端-服务器架构:集中管理配置,支持大规模部署
- 强大的类型系统:提供丰富的资源类型,如文件、服务、包等
- 模块系统:支持代码重用和共享
- 事实收集:自动收集节点信息,用于条件配置
- 报告功能:详细记录配置变更和执行结果
- 生态系统:丰富的模块库和社区支持
3. Puppet 架构
Puppet采用客户端-服务器架构,主要由以下组件组成:
- Puppet Master:服务器端组件,负责存储和管理配置代码,编译catalog(配置目录)
- Puppet Agent:客户端组件,运行在被管理节点上,定期向Master请求配置
- PuppetDB:存储Puppet的状态信息、目录和报告
- Facter:事实收集工具,收集节点的系统信息
- Hiera:键值对配置数据存储,用于分离配置数据和代码
- Module:可重用的配置代码包
- Manifest:包含Puppet代码的文件,定义系统配置
4. Puppet 的安装
4.1 安装 Puppet Master
Ubuntu/Debian 系统:
# 添加 Puppet 仓库
wget https://apt.puppetlabs.com/puppet6-release-bionic.deb
dpkg -i puppet6-release-bionic.deb
apt update
# 安装 Puppet Server
apt install puppetserver -y
# 启动并设置开机自启
systemctl start puppetserver
systemctl enable puppetserverCentOS/RHEL 系统:
# 添加 Puppet 仓库
rpm -Uvh https://yum.puppetlabs.com/puppet6-release-el7.noarch.rpm
# 安装 Puppet Server
yum install puppetserver -y
# 启动并设置开机自启
systemctl start puppetserver
systemctl enable puppetserver4.2 安装 Puppet Agent
Ubuntu/Debian 系统:
# 添加 Puppet 仓库
wget https://apt.puppetlabs.com/puppet6-release-bionic.deb
dpkg -i puppet6-release-bionic.deb
apt update
# 安装 Puppet Agent
apt install puppet-agent -y
# 配置 Puppet Agent
echo "server = puppet-master.example.com" > /etc/puppetlabs/puppet/puppet.conf
# 启动并设置开机自启
systemctl start puppet
systemctl enable puppetCentOS/RHEL 系统:
# 添加 Puppet 仓库
rpm -Uvh https://yum.puppetlabs.com/puppet6-release-el7.noarch.rpm
# 安装 Puppet Agent
yum install puppet-agent -y
# 配置 Puppet Agent
echo "server = puppet-master.example.com" > /etc/puppetlabs/puppet/puppet.conf
# 启动并设置开机自启
systemctl start puppet
systemctl enable puppet5. Puppet 基本概念
5.1 资源(Resource)
资源是Puppet的基本构建块,代表系统中的一个具体对象,如文件、服务、包等。
资源的基本语法:
resource_type { 'title':
attribute1 => value1,
attribute2 => value2,
...
}常用资源类型:
file:管理文件和目录package:管理软件包service:管理系统服务user:管理用户账户group:管理用户组exec:执行命令cron:管理定时任务
5.2 清单(Manifest)
清单是包含Puppet代码的文件,用于定义系统配置。通常以.pp为扩展名。
示例清单:
# 安装并启动 Nginx
package { 'nginx':
ensure => installed,
}
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx'],
}
# 创建网站根目录
file { '/var/www/html':
ensure => directory,
owner => 'www-data',
group => 'www-data',
mode => '0755',
}
# 创建索引文件
file { '/var/www/html/index.html':
ensure => file,
content => '<h1>Hello from Puppet!</h1>',
owner => 'www-data',
group => 'www-data',
mode => '0644',
require => File['/var/www/html'],
}5.3 模块(Module)
模块是可重用的Puppet代码包,遵循特定的目录结构。
模块的目录结构:
module_name/
├── manifests/
│ ├── init.pp # 主清单文件
│ └── other_manifests.pp
├── files/ # 静态文件
├── templates/ # 模板文件(使用ERB语法)
├── lib/ # 自定义函数和类型
├── facts.d/ # 自定义事实
├── hiera/ # Hiera数据
└── metadata.json # 模块元数据5.4 类(Class)
类是Puppet代码的封装单元,用于组织和重用配置逻辑。
类的定义和使用:
# 定义类
class nginx {
package { 'nginx':
ensure => installed,
}
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx'],
}
}
# 使用类
include nginx
# 或者
class { 'nginx': }5.5 事实(Fact)
事实是Facter收集的节点信息,如操作系统类型、IP地址、硬件信息等。
查看事实:
# 在Agent节点上运行
/opt/puppetlabs/bin/facter
# 查看特定事实
/opt/puppetlabs/bin/facter os
/opt/puppetlabs/bin/facter ipaddress在Puppet代码中使用事实:
file { '/etc/motd':
content => "Welcome to ${facts['hostname']} (${facts['os']['family']})",
}6. Puppet 配置管理流程
- 编写配置代码:创建manifests和modules,定义系统的期望状态
- Agent请求配置:Agent定期向Master请求配置(默认每30分钟一次)
- Master编译目录:Master根据Agent的事实信息编译catalog(配置目录)
- Agent应用配置:Agent接收catalog并应用到本地系统
- 报告执行结果:Agent将执行结果报告给Master
- Master存储报告:Master将报告存储到PuppetDB
7. Puppet 命令行工具
7.1 常用命令
# 在Master上运行
# 验证语法
puppet parser validate manifest.pp
# 列出所有节点
puppet node list
# 在Agent上运行
# 手动触发配置更新
puppet agent -t
# 测试模式运行(不实际应用配置)
puppet agent --test --noop
# 查看Agent状态
puppet agent --status7.2 运行模式
- 默认模式:Agent定期向Master请求配置
- 手动模式:使用
puppet agent -t手动触发配置更新 - 主从模式:使用Master和Agent架构
- 单机模式:使用
puppet apply直接应用本地配置
8. Puppet 的配置文件
Puppet的主配置文件为 /etc/puppetlabs/puppet/puppet.conf,可以通过修改此文件来自定义Puppet的行为。
常用配置选项:
[main]
# Puppet 环境
environment = production
# 模块路径
modulepath = /etc/puppetlabs/code/modules:/opt/puppetlabs/puppet/modules
# 事实缓存时间
fact_caching_expiration = 1h
[master]
# Master 主机名
server = puppet-master.example.com
# 证书名称
certname = puppet-master.example.com
# PuppetDB 配置
storeconfigs = true
storeconfigs_backend = puppetdb
[agent]
# Agent 证书名称
certname = agent-node.example.com
# Master 服务器
server = puppet-master.example.com
# 运行间隔(秒)
runsinterval = 1800实用案例分析
案例1:部署 Web 服务器
场景描述:需要在多台服务器上部署和配置 Nginx Web 服务。
解决方案:
- 创建 Puppet 模块结构:
nginx/
├── manifests/
│ ├── init.pp
│ └── vhost.pp
├── files/
│ └── nginx.conf
└── templates/
└── vhost.conf.erb- 编写
init.pp文件:
class nginx {
package { 'nginx':
ensure => installed,
}
file { '/etc/nginx/nginx.conf':
ensure => file,
source => 'puppet:///modules/nginx/nginx.conf',
require => Package['nginx'],
notify => Service['nginx'],
}
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx'],
}
file { '/var/www/html':
ensure => directory,
owner => 'www-data',
group => 'www-data',
mode => '0755',
}
}- 编写
vhost.pp文件:
define nginx::vhost ($port = 80, $docroot = '/var/www/html') {
file { "/etc/nginx/sites-available/${title}":
ensure => file,
content => template('nginx/vhost.conf.erb'),
require => Package['nginx'],
notify => Service['nginx'],
}
file { "/etc/nginx/sites-enabled/${title}":
ensure => link,
target => "/etc/nginx/sites-available/${title}",
require => File["/etc/nginx/sites-available/${title}"],
notify => Service['nginx'],
}
}- 编写
vhost.conf.erb模板文件:
server {
listen <%= @port %>;
server_name <%= @title %>;
root <%= @docroot %>;
location / {
index index.html;
}
}- 在
site.pp中使用模块:
node 'webserver1.example.com' {
include nginx
nginx::vhost { 'example.com':
port => 80,
docroot => '/var/www/html/example.com',
}
}实施效果:
- 批量完成了 Nginx Web 服务的部署和配置
- 确保了所有服务器的配置一致性
- 支持通过模块和定义资源类型实现配置的重用
案例2:管理用户和权限
场景描述:需要在多台服务器上统一管理用户账户和权限。
解决方案:
- 创建 Puppet 模块结构:
users/
└── manifests/
└── init.pp- 编写
init.pp文件:
class users {
# 创建用户组
group { 'admin':
ensure => present,
gid => 1000,
}
group { 'developers':
ensure => present,
gid => 1001,
}
# 创建用户
user { 'alice':
ensure => present,
uid => 2000,
gid => 'admin',
groups => ['sudo'],
home => '/home/alice',
shell => '/bin/bash',
password => '$6$rounds=4096$salt$hash', # 加密后的密码
}
user { 'bob':
ensure => present,
uid => 2001,
gid => 'developers',
home => '/home/bob',
shell => '/bin/bash',
password => '$6$rounds=4096$salt$hash',
}
# 配置 sudo 权限
file { '/etc/sudoers.d/admin':
ensure => file,
content => '%admin ALL=(ALL) NOPASSWD: ALL',
mode => '0440',
}
}- 在
site.pp中使用模块:
node 'server*.example.com' {
include users
}实施效果:
- 批量完成了用户账户和权限的管理
- 确保了所有服务器的用户配置一致性
- 提高了系统安全性和管理效率
课后练习
- 在控制节点上安装 Puppet Master,并在被控制节点上安装 Puppet Agent
- 配置 Puppet Master 和 Agent 之间的通信
- 编写一个 Puppet 模块,实现以下功能:
- 安装并配置 Apache 服务
- 创建网站根目录
- 部署一个简单的静态网站
- 编写一个 Puppet 模块,实现以下功能:
- 管理系统用户和组
- 配置 SSH 访问权限
- 设置 sudo 权限
- 研究 Puppet 的模块系统,了解如何创建和共享模块
总结
本集介绍了Puppet的基本概念、架构组成、安装配置和核心组件,以及Puppet的基本使用方法。Puppet作为一种客户端-服务器架构的配置管理工具,具有强大的类型系统、模块系统和事实收集能力,是实现企业级自动化运维的重要工具。通过本集的学习,你应该能够掌握Puppet的基础知识和基本操作技能,为后续学习Puppet的高级功能和实际应用打下基础。