天天看点

自动化运维工具Puppet

一、概述

1.1 puppet的概念

Puppet是一款使用GPLV2X协议授权的开源管理配置工具,用Ruby语言开发。其既可以通过客户端–服务器的方式运行,也可以独立运行。Puppet可以为系统管理员提供方便、快捷的系统自动化管理。对于系统管理员来说通过Puppet配置管理系统,底层的操作系统的发行版本是透明的,Puppet通过(Provider又称提供者)属性来完成软件的配置与安装,管理员不必关心操作系统的种类与发行版本,

Puppet还可以提供一个强大的框架来完成系统管理功能,在框架的基础上系统管理员可以通过Puppet语言来描述系统的一些事务,如安装软件、初始化系统、启动、删除服务、推送配置文件和差异化配置管理服务器等。同时系统管理员和系统管理员之间可以分享用Puppet语言描述好的事务,从而减少重复劳动,提高工作效率。

1.2 puppet工作模型

<a href="https://s5.51cto.com/wyfs02/M02/08/BE/wKiom1nms4LxCDbDAACIPWq0UQA631.png" target="_blank"></a>

a.部署调度

puppet master在一台服务器以守护进程方式运行,同时也包含客户端各节点的配置信息,puppet agent 在与master的通信过程中,通过标准的SSL协议进行加密和验证,验证通过后,agent从masteer上读取响应节点信息应用在本地。

b.配置语言和资源抽象

puppet使用描述性语言来定义配置项,在puppet中将配置项被称为resource,当Agent连接Master时,Master并不知道Agent的操作系统型号和版本。Agent通过Facter工具收集系统相关信息,并通过SSL协议将Agent的信息传递给Master。Master根据Agent收集到的相关信息,通过资源的提供者来为Agent服务。比如Package资源收到Agent的信息后,会识别Agent的系统型号版本,并通过资源提供者(如yum aptitude pkgadd apt-get等)匹配,为Agent服务。

c.事物层

Puppet事务层其实就是它的解析引擎。Puppet事务层配置每一台主机的过程包括:

解析和配置编译。

将编译好的配置同步到Agent。

在Agent上应用配置。

向Master报告运行结果。

首先Puppet会创建一个图表来表示所有资源的关系和上下游执行顺序,以及和Agent的关系。然后

Puppet将按照资源之间的关系和上下游顺序依次执行。

接着Puppet为每一个Agent获取相应的资源,并把它们编译成“目录”,然后将目录依次分发到各

主机,并通过Agent来应用它们,最后应用结果以报告形式反馈给Master。

1.3 puppet的细节和原理

<a href="https://s2.51cto.com/wyfs02/M00/08/BE/wKiom1nmuADTVFYZAAQlAlbERaQ464.png" target="_blank"></a>

Puppet采用了非常简单的C/S架构,所有数据的交互都通过SSL进行,以保证安全。

1.客户端Puppetd向Master发起认证请求,或使用带签名的证书。

2.Master告诉Client你是合法的。

3. 客户端Puppetd调用Facter,Facter探测出主机的一些变量,例如主机名、内存大小、IP地址

等。Puppetd将这些信息通过SSL连接发送到服务器端。

4. 服务器端的Puppet Master检测客户端的主机名,然后找到manifest对应的node配置,并对该

部分内容进行解析。Facter送过来的信息可以作为变量处 理,node牵涉到的代码才解析,其他

没牵涉的代码不解析。解析分为几个阶段,首先是语法检查,如果语法错误就报错;如果语法

没错,就继续解析,解析的结 果生成一个中间的“伪代码”(catelog),然后把伪代码发给客

户端。

5. 客户端接收到“伪代码”,并且执行。

6. 客户端在执行时判断有没有File文件,如果有,则向fileserver发起请求。

7. 客户端判断有没有配置Report,如果已配置,则把执行结果发送给服务器。

8. 服务器端把客户端的执行结果写入日志,并发送给报告系统。

二、安装部署

主机清单

主机名

IP地址

系统

puppet-master

172.20.4.50

CentOS release 6.9 (Final)

puppet-1

172.20.4.51

puppet-2

172.20.4.52

2.1 初始化环境:

1

2

3

4

<code>yum </code><code>install</code> <code>ntpdate -y &amp;&amp; ntpdate time1.aliyun.com                    </code><code>#同步时间</code>

<code>service iptables stop                                                 </code><code>#关闭iptables</code>

<code>sed</code> <code>-i </code><code>"s/SELINUX=enforcing/SELINUX=disabled/"</code>  <code>/etc/selinux/config</code>   <code>#关闭selinux</code>

<code>setenforce 0</code>

5

6

<code>设置主机直接可以通过主机名相关访问,在三台主机修改</code><code>/etc/hosts</code><code>文件</code>

<code>127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4</code>

<code>::1         localhost localhost.localdomain localhost6 localhost6.localdomain6</code>

<code>172.20.4.50  puppet-server</code>

<code>172.20.4.51  puppet-1</code>

<code>172.20.4.52  puppet-2</code>

2.2 master端安装配置

<code>rpm -ivh </code>

<code>yum </code><code>install</code> <code>-y puppet-server facter puppet</code>

编辑/etc/puppet/puppet.conf

7

8

9

10

11

<code>[main]</code>

<code>logdir = </code><code>/var/log/puppet</code>

<code>rundir = </code><code>/var/run/puppet</code>

<code>ssldir = $vardir</code><code>/ssl</code>

<code>[agent]</code>

<code>classfile = $vardir</code><code>/classes</code><code>.txt</code>

<code>localconfig = $vardir</code><code>/localconfig</code>

<code>certname = puppet-server      </code><code>#设置本机的certname名称</code>

<code>server = puppet-server                </code><code>#设置指向puppetmaster进行身份验证</code>

<code>[master]</code>

<code>certname = puppet-server      </code><code>###设置puppetmaster认证服务器名称</code>

<code>/etc/init</code><code>.d</code><code>/puppetmaster</code> <code>start</code>

<code>chkconfig puppetmaster on</code>

查看端口和进程

<a href="https://s3.51cto.com/wyfs02/M00/08/C0/wKiom1nmwdySW4vPAABtOB2nm3o648.png" target="_blank"></a>

2.3 agent端安装配置

<code>yum </code><code>install</code> <code>-y puppet facter</code>

<code>    </code><code>classfile = $vardir</code><code>/classes</code><code>.txt</code>

<code>    </code><code>localconfig = $vardir</code><code>/localconfig</code>

<code>    </code><code>certname = puppet-2                   </code><code>#设置本机的certname名称</code>

<code>    </code><code>server = puppet-server            </code><code>#指向puppetmaster进行身份验证</code>

启动服务

<code>/etc/init</code><code>.d</code><code>/puppet</code> <code>start</code>

2.4 证书签发

在master端查看证书

<a href="https://s5.51cto.com/wyfs02/M00/08/C0/wKiom1nmxl_x1doWAABDpFaWnVA023.png" target="_blank"></a>

没有带“+”说明没有进行身份验证

<code>puppet cert --sign puppet-1  签发证书</code>

<code>puppet cert --sign puppet-2</code>

<code>#puppet cert clean puppet-2   清理证书</code>

<a href="https://s1.51cto.com/wyfs02/M01/A7/70/wKioL1nmxBLg67R7AACML3_bSYQ972.png" target="_blank"></a>

在agent端验证

<a href="https://s4.51cto.com/wyfs02/M02/08/C1/wKiom1nmx37RQVYZAAApYx2A4Kc840.png" target="_blank"></a>

三、puppet文件资源

3.1 /etc/puppet配置目录:

12

<code>[root@puppet-server ~]</code><code># tree /etc/puppet/</code>

<code>/etc/puppet/</code>

<code>├── auth.conf                        </code><code>#认证配置文件</code>

<code>├── environments                 </code>

<code>│   └── example_env</code>

<code>│       ├── manifests</code>

<code>│       ├── modules</code>

<code>│       └── README.environment</code>

<code>├── fileserver.conf</code>

<code>├── manifests                  </code><code>#文件存储目录(puppet 会先读取该目录的.PP 文件&lt;site.pp&gt;)</code>

<code>├── modules                    </code><code>#定义模块</code>

<code>└── puppet.conf                </code><code>##主配置配置文件,详细内容可执行 puppet --genconfig</code>

3.2 模块目录结构

13

14

15

16

17

18

19

20

21

22

23

24

25

<code>模块:目录结构</code>

<code>    </code><code>module_name/</code>

<code>        </code><code>manifests/</code>

<code>            </code><code>init.pp:包含一个与模块名称同名的类</code>

<code>            </code><code>*.pp:一个清单文件通常只包含一个类,而且建议清单文件名与类名相同 nginx::web文件名为web.pp</code>

<code>            </code><code>web/</code>

<code>                </code><code>*.pp</code>

<code>            </code><code>访问路径:module_name::mainfest_file_name,module_name::subdir_name::manifest_file_name</code>

<code>        </code><code>files/</code>

<code>            </code><code>访问路径:puppet:</code><code>///modules/module_nname/file_name</code>

<code>            </code><code>nginx_web/</code>

<code>                </code><code>puppet:</code><code>///modules/module_name/subdir/file_name</code>

<code>        </code><code>templates/</code>

<code>            </code><code>*.erb:使用模块函数template()装载并运行其中模块语言,运行后会生成静态文件</code>

<code>            </code><code>访问路径 templates(‘moduleName</code><code>/templates</code><code>’)</code>

<code>        </code><code>lib/</code>

<code>            </code><code>用户自定义的插件目录</code>

<code>        </code><code>tests/</code>

<code>            </code><code>当前模块的使用说明和样例</code>

<code>        </code><code>spec/</code>

<code>            </code><code>为lib目录中的插件提供使用说明和样例</code>

<code>        </code><code>在模块根目录下,通常还应该具有几个文档</code>

<code>            </code><code>LICENSE</code>

<code>            </code><code>Modulefile</code>

<code>            </code><code>README</code>

3.3 puppet命令

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

<code>puppet 命令总结</code>

<code>    </code><code>apply,agent,master,cert,describe</code>

<code>    </code><code>apply:应用本地清单文件</code>

<code>    </code><code>agent:客户端进程</code>

<code>    </code><code>master:服务端进程</code>

<code>    </code><code>cert:证书管理</code>

<code>    </code><code>describe:资源帮助信息</code>

<code>    </code><code>module:模块管理</code>

<code>    </code><code>kick:master触发模式</code>

<code>    </code><code>帮助类命令</code>

<code>        </code><code>describe</code>

<code>        </code><code>doc:生成puppet文档</code>

<code>        </code><code>help:查看帮助</code>

<code>        </code><code>resource:查看资源帮助</code>

<code>        </code><code>status:查看puppe状态</code>

<code>    </code><code>master命令的选项</code>

<code>        </code><code>--no-daemonize:非守护进程</code>

<code>        </code><code>--daemonize:-D</code>

<code>        </code><code>--debug -d</code>

<code>        </code><code>--verbase -</code><code>v</code>

<code>        </code><code>--genconfig</code>

<code>    </code><code>agent命令的常用选项</code>

<code>        </code><code>--daemonize,-D</code>

<code>        </code><code>--no-daemonize</code>

<code>        </code><code>--verbose -</code><code>v</code>

<code>        </code><code>--noop:no operation 模式,不真正应用catalog</code>

<code>        </code><code>--</code><code>test</code><code>:测试</code>

<code>        </code><code>--waitforcert:等待证书签署成功</code>

<code>    </code><code>apply命令的常用选项</code>

<code>        </code><code>--execute -e</code>

<code>        </code><code>--modulepath</code>

<code>    </code><code>cert命令的常用操作</code>

<code>        </code><code>list</code>

<code>        </code><code>sign:签署</code>

<code>        </code><code>clean:清除证书</code>

<code>        </code><code>revoke:吊销证书</code>

<code>        </code><code>verify:验证本地指定的证书</code>

<code>        </code><code>generate:为客户端生成证书</code>

3.4 puppet资源清单

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

<code>puppet 资源</code>

<code>    </code><code>type</code> <code>{ </code><code>'title'</code><code>:</code>

<code>        </code><code>attibute =&gt; value,</code>

<code>    </code><code>}</code>

<code>    </code> 

<code>而资源定义的核心也可以抽象为</code><code>type</code><code>、title、attribute和value四个部分。</code>

<code>type</code><code>分类:</code>

<code>package:</code>

<code>    </code><code>puppet支持使用的软件包管理器</code>

<code>        </code><code>yum,rpm,apt,ports,gem,msi,dpkg,pkg</code>

<code>    </code><code>常用的参数</code>

<code>        </code><code>ensure:程序包的目标状态</code>

<code>        </code><code>name:资源的名称,即软件包的名字</code>

<code>        </code><code>provider:软件包管理器</code>

<code>        </code><code>source</code><code>:指定程序包文件路径</code>

<code>        </code><code>install_options:安装选项,最常用的是通过INSTALLDIR来制定安装目录</code>

<code>        </code><code>window下安装mysql</code>

<code>        </code><code>package{‘mysql:</code>

<code>            </code><code>ensure =&gt; </code><code>install</code><code>,</code>

<code>            </code><code>provider =&gt;</code><code>'msi'</code><code>,</code>

<code>            </code><code>source</code> <code>=&gt; </code><code>'D:\software\mysql-5.5.36.msi'</code><code>,</code>

<code>            </code><code>install_options =&gt; { </code><code>'INSTALLDIR'</code> <code>=&gt; </code><code>'c:\mysql'</code> <code>},</code>

<code>        </code><code>}</code>

<code>service:</code>

<code>    </code><code>常用参数:</code>

<code>        </code><code>ensure:服务的目标状态,ture(启动)和</code><code>false</code><code>(关闭)</code>

<code>        </code><code>enable</code><code>:是否开机自动启动,ture(启动)和</code><code>false</code><code>(关闭)</code>

<code>        </code><code>name:服务名称</code>

<code>        </code><code>path:服务脚本路径;默认为</code><code>/etc/init</code><code>.d下查找</code>

<code>        </code><code>start:定制启动命令</code>

<code>        </code><code>stop:关闭</code>

<code>        </code><code>restart:重启</code>

<code>        </code><code>status:状态</code>

<code>资源名称仅是一个字符串,在同一个类型中必须唯一</code>

<code>在定义时,资源类型必须是小写字母</code>

<code>file</code><code>:</code>

<code>    </code><code>管理文件、目录、软链接;</code>

<code>    </code><code>生成文件内容</code>

<code>    </code><code>管理文件权限、属性</code>

<code>    </code><code>也可以通过</code><code>source</code><code>属性到指定位置下载文件</code>

<code>    </code><code>通过recurse属性来获取目录</code>

<code>        </code><code>ensuce:absent(不存在) present(存在) </code><code>file</code><code>(文件) directory(目录)</code>

<code>        </code><code>backup:通过filebucket资源来备份文件,值通常为filebucket资源的名称</code>

<code>        </code><code>content:文件内容,生成方式有三种(content,</code><code>source</code><code>,target),彼此互斥</code>

<code>        </code><code>source</code><code>:通过制定的url下载文件至本地,获取文件方式为puppet url 格式:puppet:</code><code>///modules/MODULE_NAME/file_names</code><code>;</code>

<code>        </code><code>target:为符号链接指定目标</code>

<code>        </code><code>links:文件为符号链接,值为“follow”,“manage”</code>

<code>        </code><code>path: 文件路径,必须使用双引号</code>

<code>        </code><code>mode:定义权限</code>

<code>        </code><code>owner:定义属主</code>

<code>        </code><code>group:定义属组</code>

<code>        </code><code>force: 强制执行删除文件、连接或目录,仅用于ensure为absent时。</code>

<code>        </code><code>purge:清空指定目录中存在的,但未在资源中定义的文件;</code>

<code>        </code><code>recurse:目录递归,值</code><code>true</code><code>,</code><code>false</code><code>,inf,remote</code>

<code>        </code><code>replace:替换,本地存在的文件与资源中指定的文件内容不同时是否执行替换,默认为否;</code>

<code>exec</code><code>:</code>

<code>    </code><code>执行命令,通常在不得不用时才使用,慎用,通常用于完成puppet自身无法完成的功能</code>

<code>    </code><code>常用的参数:</code>

<code>        </code><code>command</code><code>:要执行的命令,通常为命令文件的完整路径</code>

<code>        </code><code>path:命令搜索路径 </code>

<code>        </code><code>group:执行命令的组</code>

<code>        </code><code>user:执行命令的用户</code>

<code>        </code><code>onlyif:0,表示仅在命令的状态返回值为0时才执行此命令</code>

<code>        </code><code>refresh:定义接受到其他资源的通知时,则要重新执行此命令</code>

<code>        </code><code>refreshonly:仅当被依赖的资源发生改变时才被触发 </code>

<code>        </code><code>tries:尝试次数,默认为1</code>

<code>        </code><code>try_sleep:多次尝试之间的时间间隔</code>

<code>group:管理系统上的用户组</code>

<code>        </code><code>常用参数</code>

<code>            </code><code>ensure:目标状态,present,absent</code>

<code>            </code><code>name:组名</code>

<code>            </code><code>gid:GID</code>

<code>            </code><code>system:系统组</code>

<code>user:管理用户</code>

<code>        </code><code>常用属性:</code>

<code>            </code><code>ensure:目标值状态</code>

<code>            </code><code>name:</code>

<code>            </code><code>uid:</code>

<code>            </code><code>system:</code>

<code>            </code><code>home:</code>

<code>            </code><code>shell:</code>

<code>            </code><code>gid:</code>

<code>            </code><code>password:加密后的密码</code>

<code>            </code><code>managehome: </code><code>true</code><code>,</code><code>false</code><code>(默认)</code>

<code>cron</code><code>:定义周期性任务</code>

<code>        </code><code>常用属性</code>

<code>            </code><code>ensure:目标状态</code>

<code>            </code><code>command</code><code>:命令或脚本</code>

<code>            </code><code>environment:运行时的环境变量</code>

<code>            </code><code>hour:</code>

<code>            </code><code>minute:</code>

<code>            </code><code>mouth:</code>

<code>            </code><code>monthday</code>

<code>            </code><code>weekday</code>

<code>            </code><code>name</code>

<code>            </code><code>user:默认为root</code>

<code>        </code><code>cron</code> <code>{ </code><code>'ntpdate'</code>

<code>         </code><code>ensure =&gt; present,</code>

<code>         </code><code>command</code> <code>=&gt; </code><code>'/usr/sbin/ntpdate 172.16.0.1'</code> <code>&amp;&gt; </code><code>/dev/null</code>

<code>         </code><code>minute =&gt; </code><code>'*/3'</code>

3.5 puppet资源引用

<code>元参数:用于定义资源间的依赖关系,及应用次序,通知机制等等</code>

<code>    </code><code>require:表示需要依赖</code>

<code>        </code><code>package { </code><code>'nginx'</code>

<code>            </code><code>ensure =&gt; present,</code>

<code>        </code><code>service{</code><code>'nginx'</code>

<code>            </code><code>ensure =&gt;ture,</code>

<code>            </code><code>enable</code> <code>=&gt;ture</code>

<code>            </code><code>require =&gt;Package[</code><code>'nginx'</code><code>]</code>

<code>    </code><code>before:先应用本资源</code>

<code>            </code><code>before =&gt;Service [</code><code>'nginx'</code><code>]</code>

<code>    </code><code>notify:将当前资源的变动信息通知给别的资源,通知发出者</code>

<code>    </code><code>subscribe:定义在后一个资源中,通知接收者,订阅</code>

<code>资源引用:</code>

<code>    </code><code>使用Type[</code><code>'title'</code><code>],首字母必须大写</code>

<code>依赖关系</code>

<code>        </code><code>} -&gt;</code>

<code>            </code><code>restart =&gt; </code><code>'/etc/rc.d/init.d/nginx reload'</code>

<code>-&gt; 表示依赖</code>

<code>~&gt; 表示通知</code>

3.6 puppet表达式:

<code>puppet的条件表达式</code>

<code>    </code><code>if</code>

<code>    </code><code>单分支</code>

<code>    </code><code>双分支</code>

<code>    </code><code>多分支</code>

<code>        </code><code>if</code> <code>条件 {</code>

<code>        </code><code>动作</code>

<code>        </code><code>} elsif 条件 {</code>

<code>        </code><code>} </code><code>else</code> <code>条件 {</code>

<code>    </code><code>case</code><code>:指定代码块</code>

<code>    </code><code>selectors:返回结果</code>

四、验证

编辑资源清单,在puppet-1安装nginx,puppet-2安装mysql并设置开机自启动

<a href="https://s5.51cto.com/wyfs02/M02/A7/73/wKioL1nm52KzaqrHAABeMtqJfB4870.png" target="_blank"></a>

在agent端测试手动执行,(默认三十分钟agent自动去master拉取)

<a href="https://s4.51cto.com/wyfs02/M01/08/C4/wKiom1nm6nfBUjr7AADBHgs4AG0236.png" target="_blank"></a>

<a href="https://s4.51cto.com/wyfs02/M00/A7/73/wKioL1nm59uzG2Z5AADD7lFFiAA185.png" target="_blank"></a>

五、puppet dashboard安装配置

5.1 安装并配置mysql数据库

<code>yum </code><code>install</code> <code>-y ruby-mysql mysql-server </code>

<code>service mysqld start</code>

<code>mysqladmin -uroot password </code><code>"mysqladmin"</code>

创建数据库并授权

<code>create database dashboard character </code><code>set</code> <code>utf8;</code>

<code>create user </code><code>'puppet'</code><code>@</code><code>'localhost'</code> <code>identified by </code><code>'puppetadmin'</code><code>;</code>

<code>grant all on dashboard.* to puppet@</code><code>'localhost'</code><code>;</code>

<code>flush privileges;</code>

<a href="https://s3.51cto.com/wyfs02/M02/A7/73/wKioL1nm6VuA5elaAABeMtqJfB4602.png" target="_blank"></a>

5.2 安装并配置puppet-dashboard

<code>yum -y </code><code>install</code> <code>puppet-dashboard</code>

<code>vim </code><code>/usr/share/puppet-dashboard/config/database</code><code>.yml</code>

<a href="https://s1.51cto.com/wyfs02/M01/A7/73/wKioL1nm6k7SaQOYAABmfNfqgqM332.png" target="_blank"></a>

<code>vim </code><code>/usr/share/puppet-dashboard/config/environment</code><code>.rb</code>

<a href="https://s5.51cto.com/wyfs02/M00/A7/74/wKioL1nm6t2DiwNeAAAIwmFuKGk031.png" target="_blank"></a>

导入数据库文件

<code>cd</code> <code>/usr/share/puppet-dashboard/</code>

<code>rake gems:refresh_specs</code>

<code>rake RAILS_ENV=production db:migrate</code>

<a href="https://s5.51cto.com/wyfs02/M00/08/C4/wKiom1nm7g2QF6kvAAEa61tQvT4990.png" target="_blank"></a>

5.3 启动服务,并测试访问

<code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/puppetmaster</code> <code>start  启动服务</code>

<code>http:</code><code>//IP</code><code>:3000  浏览器进行访问</code>

<a href="https://s5.51cto.com/wyfs02/M02/08/C4/wKiom1nm71iTSAiKAAAieSk1wns380.png" target="_blank"></a>

手工导入报告

<code>rake RAILS_ENV=production reports:</code><code>import</code>

<a href="https://s3.51cto.com/wyfs02/M02/08/C4/wKiom1nm77_CQOT9AAFuJTqU9nQ205.png" target="_blank"></a>

启动报告

<code>env</code> <code>RAILS_ENV=production </code><code>/usr/share/puppet-dashboard/script/delayed_job</code> <code>-p dashboard -n 4 -m start</code>

查看进程job

<a href="https://s1.51cto.com/wyfs02/M01/A7/74/wKioL1nm8AvCQJ1oAABZSm7_gv8508.png" target="_blank"></a>

查看dashboard

<a href="https://s1.51cto.com/wyfs02/M00/08/C5/wKiom1nm8v3Tn3BfAAH0fKAlWUo226.png" target="_blank"></a>

本文转自 KaliArch 51CTO博客,原文链接:http://blog.51cto.com/kaliarch/1973736,如需转载请自行联系原作者

继续阅读