第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 puppetserver

CentOS/RHEL 系统

# 添加 Puppet 仓库
rpm -Uvh https://yum.puppetlabs.com/puppet6-release-el7.noarch.rpm

# 安装 Puppet Server
yum install puppetserver -y

# 启动并设置开机自启
systemctl start puppetserver
systemctl enable puppetserver

4.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 puppet

CentOS/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 puppet

5. 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 配置管理流程

  1. 编写配置代码:创建manifests和modules,定义系统的期望状态
  2. Agent请求配置:Agent定期向Master请求配置(默认每30分钟一次)
  3. Master编译目录:Master根据Agent的事实信息编译catalog(配置目录)
  4. Agent应用配置:Agent接收catalog并应用到本地系统
  5. 报告执行结果:Agent将执行结果报告给Master
  6. 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 --status

7.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 服务。

解决方案

  1. 创建 Puppet 模块结构:
nginx/
├── manifests/
│   ├── init.pp
│   └── vhost.pp
├── files/
│   └── nginx.conf
└── templates/
    └── vhost.conf.erb
  1. 编写 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',
  }
}
  1. 编写 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'],
  }
}
  1. 编写 vhost.conf.erb 模板文件:
server {
  listen <%= @port %>;
  server_name <%= @title %>;
  root <%= @docroot %>;
  
  location / {
    index index.html;
  }
}
  1. site.pp 中使用模块:
node 'webserver1.example.com' {
  include nginx
  
  nginx::vhost { 'example.com':
    port => 80,
    docroot => '/var/www/html/example.com',
  }
}

实施效果

  • 批量完成了 Nginx Web 服务的部署和配置
  • 确保了所有服务器的配置一致性
  • 支持通过模块和定义资源类型实现配置的重用

案例2:管理用户和权限

场景描述:需要在多台服务器上统一管理用户账户和权限。

解决方案

  1. 创建 Puppet 模块结构:
users/
└── manifests/
    └── init.pp
  1. 编写 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',
  }
}
  1. site.pp 中使用模块:
node 'server*.example.com' {
  include users
}

实施效果

  • 批量完成了用户账户和权限的管理
  • 确保了所有服务器的用户配置一致性
  • 提高了系统安全性和管理效率

课后练习

  1. 在控制节点上安装 Puppet Master,并在被控制节点上安装 Puppet Agent
  2. 配置 Puppet Master 和 Agent 之间的通信
  3. 编写一个 Puppet 模块,实现以下功能:
    • 安装并配置 Apache 服务
    • 创建网站根目录
    • 部署一个简单的静态网站
  4. 编写一个 Puppet 模块,实现以下功能:
    • 管理系统用户和组
    • 配置 SSH 访问权限
    • 设置 sudo 权限
  5. 研究 Puppet 的模块系统,了解如何创建和共享模块

总结

本集介绍了Puppet的基本概念、架构组成、安装配置和核心组件,以及Puppet的基本使用方法。Puppet作为一种客户端-服务器架构的配置管理工具,具有强大的类型系统、模块系统和事实收集能力,是实现企业级自动化运维的重要工具。通过本集的学习,你应该能够掌握Puppet的基础知识和基本操作技能,为后续学习Puppet的高级功能和实际应用打下基础。

« 上一篇 Ansible Playbook 下一篇 » Chef 基础