本文共 5103 字,大约阅读时间需要 17 分钟。
Puppet 是一个 IT 基础设施自动化管理工具,能够帮助系统管理员全面管理基础设施的生命周期,包括供应(provisioning)、配置(configuration)、联动(orchestration)及报告(reporting)。
Puppet 的核心功能包括自动化重复任务、快速部署关键应用以及在本地或云端完成主动管理变更和快速扩展架构规模。Puppet 基于 Ruby 语言开发,遵循 Apache 2.0 许可协议。Puppet 通过声明性、基于模型的方法进行 IT 自动化管理:
Puppet 的工作流程包括以下步骤:
Puppet 提供两个使用模型:
安装 Puppet 的方式有多种,例如使用源码安装或通过 yum 安装。以下是使用 yum 安装的示例:
yum install -y puppet
安装完成后,主配置文件位于 /etc/puppet/puppet.conf,主要程序位于 /usr/bin/puppet。
Puppet 从以下三个维度对资源进行抽象:
资源定义通过向资源类型的属性赋值来实现,定义语法如下:
type {'title': attribute1 => value1, attribute2 => value2, ...} 其中,type 必须使用小写字符,title 必须唯一。
资源属性包括:
Namevar:可简称为 name,定义资源名称。Ensure:资源的目标状态,如 present 或 absent。Provider:资源的管理接口。以下是 Puppet 中常用的资源类型及其使用方法:
管理系统用户组,属性包括:
name:组名,可省略,若省略则继承 title 的值。gid:组的 GID。system:是否为系统组。ensure:目标状态。members:组成员用户。示例:
group{'mygrp': name => 'mygrp', ensure => 'present', gid => 2000, members => ['user1', 'user2']} 管理系统用户,属性包括:
name:用户名,可省略。uid:UID。gid:基本组 ID。groups:附加组。comment:注释。home:用户的家目录。shell:默认 shell 类型。system:是否为系统用户。ensure:目标状态。password:加密后的密码。示例:
user{'keerr': ensure => 'present', system => false, comment => 'Test User', shell => '/bin/tcsh', home => '/data/keerr', managehome => true, groups => 'mygrp', uid => 3000} 管理软件包,属性包括:
ensure:目标状态,如 installed、present、latest、absent。name:包名,可省略。provider:安装方式。示例:
package{'nginx': ensure => 'installed', provider => 'yum'} 定义服务状态,属性包括:
ensure:服务的目标状态,如 running 或 stopped。enable:是否开机自动启动。path:服务脚本路径。start、stop、restart:定制启动、关闭、重启命令。示例:
service{'nginx': ensure => 'true', enable => 'true'} 管理文件、目录和符号链接,属性包括:
ensure:目标状态,如 file、directory、absent。path:文件路径。source:源文件路径。content:文件内容。owner:文件属主。group:文件属组。mode:文件权限。示例:
file{'aaa': path => '/data/aaa', source => '/etc/aaa', owner => 'keerr', mode => '611'} 执行外部命令,属性包括:
command:要运行的命令。cwd:命令运行的目录。creates:文件路径,命令只在该文件不存在时执行。user、group:运行命令的用户身份。path:命令执行的搜索路径。onlyif:条件命令正常运行时才执行命令。unless:条件命令非正常运行时才执行命令。示例:
exec{'cmd': command => 'mkdir /data/testdir', path => ['/bin', '/sbin', '/usr/bin', '/usr/sbin']} 定义周期性任务,属性包括:
command:要执行的任务。ensure:目标状态。minute、hour、monthday、month、weekday:任务调度时间。user:执行命令的用户身份。示例:
cron{'timesync': command => '/usr/sbin/ntpdata 172.16.0.1', ensure => 'present', minute => '*/3', user => 'root'} 调试输出,属性包括:
message:记录的信息。name:信息名称。示例:
notify{'redis_conf_modified': message => 'Redis 配置文件已修改', name => 'redis_conf'} Puppet 提供 before、require、notify 和 subscribe 四个参数定义资源之间的依赖关系和通知关系。
示例:
file{'test.txt': path => '/data/test.txt', require => File['test.symlink']} Puppet 变量以 $ 开头,赋值操作符为 =。变量类型包括:
变量的作用域分为 top scope、node scope 和 class scope,优先级为 top scope > node scope > class scope。
Puppet 支持 if、case 和 selector 语句。
if $operatingsystem == 'CentOS' { if $operatingsystemmajrelease == '7' { $db_pkg = 'mariadb-server' } else { $db_pkg = 'mysql-server' } package{"$db_pkg": ensure => installed}} case $osfamily { "RedHat": { $webserver = 'httpd' } /(i-mx:debian)/: { $webserver = 'apache2' } default: { $webserver = 'httpd' }} $pkgname = $operatingsystem ? { '/(i-mx:ubuntu|debian)': 'apache2', '/(i-mx:redhat|fedora|centos)': 'httpd', default: 'httpd'} 类是 Puppet 中的模块,用于定义一组通用目标的资源,可在全局范围内调用。类可以继承,并包含子类。
class NAME { # 定义类的语法} class instpkg($pkg) { package{"$pkg": ensure => installed}} class redis::master inherits redis { file{'/etc/redis.conf': source => '/root/manifests/file/redis-master.conf', owner => 'redis', group => 'root', mode => '0640' } Service['redis'] { subscribe => File['/etc/redis.conf'] }} 模块是 Puppet 的扩展机制,常用于存放 manifest 文件和相关资源。模块的命名规范如下:
modules/├── MODULE_NAME/│ ├── manifests/│ │ └── init.pp│ ├── files/│ │ └── FILE_NAME│ ├── templates/│ │ └── TEMPLATE_NAME.erb│ ├── lib/│ └── spec/
示例:定义一个 Redis 主从模块。
class redis::master { package{'redis': ensure => installed} service{'redis': ensure => running}} /etc/hosts 中有解析记录。chronyd.service 实现时间同步。通过以上步骤,可以实现 Redis 主从架构的自动化管理。
转载地址:http://uzafk.baihongyu.com/