基础原理介绍

puppet是一个IT基础设施自动化管理工具它能够帮助系统管理员管理基础设施的整个生命周期供应provisioning与cobbler中不一样这里是保证软件包安装的、配置configuration、联动orchestration及报告reporting。也就是说它可以帮助系统管理员更加方便的完成多台服务器的安装升级软件包、管理配置文件、系统服务、cron任务、添加新的配置、修复错误等重复工作和快速部署关键性的应用以及在本地或云端完成自主管理变更和快速扩展架构规模等。

puppet的工作模型puppet通过声明性、基于模型的方法进行IT自动化管理

  • 定义通过puppet的声明性配置语言定义基础设置配置的目标状态
  • 模拟强制应用改变的配置之前先进行模拟性的应用
  • 强制自动、强制应用部署达成目标状态纠正任何偏离的配置
  • 报告报告当下状态及目标状态的不同以及达成目标状态所进行的任何强制性改变

puppet的抽象模型三种模型

  • 配置语言层有自己独立的配置语言;
  • 事务层用来管理各资源之间有依赖关系的资源应用时彼此之间谁先谁后等联动的
  • 资源抽象层用来定义管理的资源对象的并且将每一个应该定义的资源属性抽象出来而且提供了基本的实例化接口。

puppet从以下三个维度来对资源完成抽象

  • 相似的资源被抽象成同一种资源类型如程序包资源、用户资源及服务资源等
  • 将资源属性或状态的描述与其实现方式剥离开来如仅说明安装一个程序包而不用关心其具体是通过yum、pkgadd、ports、或者其他方式实现
  • 仅描述资源的目标状态也即期望其实现的结果而不是其具体过程如“确定nginx运行起来”而不是具体描述为“运行nginx命令将其启动起来”这三个也被称作puppet的资源抽象层。

模块中包含类、文件、模板、使用样例模块是通用的调用时只能调用其中的类所以也就是说每个模块就是导入一大堆的类以及部分类所依赖的外部文件。

资源定义说明和应用

定义

puppet的代码主要就是由这些资源和资源的属性构成. 每个资源都包含有类型、标题和一些其他属性的列表。

这是一个典型的resource资源的结构

1
2
3
type {'title':   
attribute => value,
}
  1. type定义资源的类型使用花括号标起来它是有规定的并不是自己随便写的在puppet的官方文档中有所有的可用type。
  2. title定义标题标题可以使用单引号或双引号标记起来不同的title表示不同的资源。
  3. attribute定义参数属性每一个参数都有一个值是用来告诉puppet怎样去配置资源的。
  4. 属性和值得结构attribute => ‘value’。
  5. 每一个属性键值对后面都要有一个逗号最后一个键值对后面可以使用逗号也可以不使用。
  6. 如果一个资源只有一个属性它可以被声明成一行像这样:file { “/etc/group”: owner =>”root” }
  7. 多个资源可以被配置在一个资源类型里面如
1
2
3
4
5
6
7
file {
"/etc/passwd":
ensure => present;
"/etc/group" :
owner => "root",
group => "root";
}

应用

查看常见资源类型

1
puppet describe -l

查看资源的定义格式

1
puppet describe user

Puppet定义通知

资源的定义样例

1
2
3
notify {'notice':
message => "hell puppet",
}

Puppet安装软件

资源的定义样例

1
2
3
4
package { 'nginx':
name => nginx, # 可省略
ensure => present,
}

Puppet定义服务启动服务

资源的定义样例

1
2
3
4
service { 'nginx':
ensure => running,
enable => true,
}

定义资源间依赖关系

在编辑puppet时往往会引用不同资源

before => 资源引用 #后面的资源引用之前当前资源必须存在

require => 资源引用 #后面的资源定义过当前资源才可启用

资源的定义样例

1
2
3
4
5
6
7
8
package { 'nginx':
ensure => present,
}
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx']
}

Puppet定义组

资源的定义样例

1
2
3
4
5
group {'chronos':
name => 'chronos',
ensure => 'present',
gid => 1001,
}

Puppet定义用户

资源的定义样例

1
2
3
4
5
6
7
8
9
10
user {'chronos':
name => "chronos"
gid => 1001,
uid => 1001,
groups => ['root'],
home => '/home/chronos',
managehome => true,
ensure => present,
password => '$1$c7d1a18e$Z2NuEe3zPmaJ4hh7z3xOg.',
}

后续完善中