puppet是一种开源的、新一代的集中化的配置管理工具。可管理的平台有windows,Linux,Unix等。有自己的配置语言(资源申报语言),可管理文件、软件包、系统服务、用户等。这些统称为puppet的资源。puppet是采用ruby语言研发的。
如下图:
<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411296X3QI.png" target="_blank"></a>
单机模型:实现定义多个manifests --> complier --> catalog --> apply
<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411297Cjwz.png" target="_blank"></a>
master/agent模型:集中式管理
架构:
<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411300lcVW.png" target="_blank"></a>
工作原理:
<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411302tdfp.png" target="_blank"></a>
资源:是puppet的核心,通过资源申报,定义在资源清单中。
类:一组资源清单。
模块:包含多个类。
站点清单:以主机为核心,应用哪些模块。
puppet的安装可以使用源码安装,也可以使用rpm(官方提供)、epel源、官方提供的yum仓库来安装(通过下载官方提供的rpm包可以指定官方的yum仓库)。
这里使用的是2.7系列的,使用epel仓库
1
<code>yum </code><code>install</code> <code>puppet -y</code>
puppet从以下三个维度来都资源完成抽象:
2
3
4
5
<code>1、相似的资源被抽象成同一种资源“类型,”如程序包资源、用户资源及服务资源等</code>
<code>2、将资源属性或状态的描述与其实现方式剥离开来,如仅说明安装一个程序包而不用关系其具体</code>
<code> </code><code>是yum、pkgadd、prots或其他方式实现</code>
<code>3、仅描述资源的目标状态,也即期望其实现的结果,而不是其具体过程,如“确定nginx运行起来”</code>
<code> </code><code>而不是具体描述为“运行nginx命令将启动起来”</code>
这三个也被称为puppet的资源抽象层(RAL)。RAL由type(类型)和provide(提供者,即不同的OS上的特定实现)组成。
资源是puppet用于模型化系统配置的基础单元,每个资源都从某个角度描述了系统属性,如某程序包必须安装或某用户必须移除等,在puppet,用于完成此类功能的代码也即“资源申报”
<code>type</code> <code>{ ‘title’:</code>
<code> </code><code>atttibue => value, </code>
<code>}</code>
资源的文件统一以.pp结尾。在定义时,资源类型必须使用小写字母,而资源名称仅是一个字符串,但要求在同一类型中期必须唯一。
6
7
8
9
10
11
12
<code>## 帮助查看:</code>
<code>puppet describe [-s] package</code>
<code>puppet支持使用的软件包管理器:yum,rpm,apt,prots,gem,msi,dpkg,pkg</code>
<code>常用的参数:</code>
<code>ensure:程序包的目标状态,值有present(installed)、absent(不存在)、purged、held、</code>
<code> </code><code>latest</code>
<code>name:资源的名称,即软件包的名字,可以省略,如果省略,将继承title的值</code>
<code>provide:软件包管理器,会自动识别</code>
<code>source</code><code>:指定程序包文件路径</code>
<code>install_options:安装选项,最常用的是通过INATALLDIR来制定安装目录</code>
<code>puppet describe [-s] service</code>
<code>常用的参数:</code>
<code> </code><code>ensure:服务的额目标状态,值有</code><code>true</code><code>(running)和</code><code>false</code><code>(stopped) </code>
<code> </code><code>enable</code><code>:是否开机自动启动,值有</code><code>true</code><code>和</code><code>false</code>
<code> </code><code>name:服务名称,可以省略,如果省略,将继承title的值</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>
13
14
15
16
17
18
<code>## 帮助查看: </code>
<code>puppet describe [-s] </code><code>file</code>
<code>ensuce:目标状态,值有*absent*, *present*, *</code><code>file</code><code>*, 和*directory*.</code>
<code>backup:通过filebacket资源来备份文件,值通常为filebucket资源的名称</code>
<code>content:文件内容,生成方式有三种(content,</code><code>source</code><code>,target),三者彼此互斥</code>
<code>source</code><code>:通过制定的url下载文件至本地,获取文件格式为:</code>
<code> </code><code>puppet:</code><code>///modules/MODULE_NAME/file_names</code><code>,使用模块时会用到</code>
<code>target:为符号链接指定目标</code>
<code>links:文件为符号连接,值为“follow”,“manage”</code>
<code>path:文件路径,必须使用双引号</code>
<code>mode:定义权限,通常为8进制数字</code>
<code>owner: 定义文件的属主</code>
<code>group:定义文件的属组</code>
<code>force:强制执行删除文件、链接或目录、仅用于ensure为absent时</code>
<code>purge:清除指定目录中存在的,但未在资源中定义的文件</code>
<code>resurce:目录递归,值为</code><code>true</code><code>,</code><code>false</code><code>,inf,remote</code>
<code>replace:替换,本地存在的文件与资源中指定的文件内容不同时是否执行替换,默认为否</code>
<code>package { [</code><code>"httpd"</code><code>,</code><code>'mysql-server'</code><code>,</code><code>'php'</code><code>]:</code>
<code> </code><code>ensure => present</code>
<code>} </code>
<code>service { [</code><code>"httpd"</code><code>,</code><code>'mysqld'</code><code>]:</code>
<code> </code><code>ensure => </code><code>true</code><code>,</code>
<code> </code><code>enable</code> <code>=> </code><code>false</code>
<code>file</code><code>{</code><code>'my.cnf'</code><code>:</code>
<code> </code><code>ensure => </code><code>file</code><code>,</code>
<code> </code><code>source</code> <code>=> </code><code>'/root/my.cnf'</code><code>,</code>
<code> </code><code>path => </code><code>'/etc/my.cnf'</code><code>,</code>
<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411304nyUz.png" target="_blank"></a>
<code>puppet describe [-s] </code><code>exec</code>
<code>command</code><code>:要执行的命令,通过为命令文件的完整路径</code>
<code>path:命令搜索路径</code>
<code>group:执行命令的组</code>
<code>user:执行命令的用户</code>
<code>onlyif:0,表示仅在命令的状态返回值为0时才执行此命令</code>
<code>refresh:定义接受的其他资源的通知时,则要重新执行此命令</code>
<code>refreshonly:仅被当被依赖的资源发生改变时才被触发</code>
<code>tries:尝试次数,默认为1</code>
<code>try_sleep:多次尝试之间的时间间隔</code>
<code>puppet describe [-s] group</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>puppet describe [-s] user</code>
<code>ensure:目标状态,present,absent</code>
<code>name:用户名</code>
<code>uid:用户uid</code>
<code>system:系统用户</code>
<code>home:用户家目录</code>
<code>shell:用户默认shell</code>
<code>gid:用户的gid</code>
<code>password:密码,使用加密后密码</code>
<code>managehome: 是否创建家目录,默认为</code><code>false</code>
<code>常见属性</code>
<code>command</code><code>:命令或脚本</code>
<code>environment:运行时的环境变量</code>
<code>hour:小时</code>
<code>mouth:月</code>
<code>monthday:日</code>
<code>weekday:周</code>
<code>minute:分</code>
<code>name:名称</code>
<code>user: 默认为root</code>
<code>message:信息</code>
<code>name:信息名称</code>
常见的资源就是这些。更详细的可以使用puppet describe命令查看。
使用Type['title'],首字母必须大写
puppet提供了before、require、notify、subscribe四个元参数来定义资源之间的相关性。
<code>require:表示需要依赖于某个资源</code>
<code>before:表示应该先执行本资源,在执行别的资源</code>
<code>notify: 表示将当前资源的变动信息通知给别的资源,为通知的发出者</code>
<code>subscribe:表示定义某资源的变动信息,为通知的接收者</code>
依赖关系还可以使用->和~>来表示
<code>-> 表示后资源需要依赖前资源</code>
<code>~> 表示前资源变动通知后资源调用</code>
例如:
<code>package{</code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => installed,</code>
<code>file</code><code>{</code><code>'nginx.conf'</code><code>:</code>
<code> </code><code>ensure => </code><code>file</code><code>,</code>
<code> </code><code>source</code> <code>=> </code><code>'/root/nginx.conf'</code><code>,</code>
<code> </code><code>require => Package[</code><code>'nginx'</code><code>],</code>
<code> </code><code>path => </code><code>'/etc/nginx/nginx.conf'</code><code>,</code>
<code>service{</code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => </code><code>true</code><code>,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code><code>,</code>
<code> </code><code>subscribe => File[</code><code>'nginx.conf'</code><code>],</code>
6、puppet变量
puppet的变量名称以“$”开头,赋值操作符为“=”
19
20
21
22
23
<code>puppet的变量类型:</code>
<code>布尔型:</code><code>true</code><code>和</code><code>false</code><code>,不能加引号,</code><code>if</code><code>语句的测试条件和比较表达式都会返回布尔型值,</code>
<code> </code><code>另外,其他数据类型也可以自动转换为布尔型,如空字符串为</code><code>false</code><code>等</code>
<code>undef:从未声明的变量的值类型即为undef,也可以手动为某变量赋予undef值,</code>
<code> </code><code>即直接使用不加引号的undef字符串</code>
<code>字符型:非结构化的文本字符串,可以使用引号,也可以不用。单引号中的变量不会替换,</code>
<code> </code><code>而双引号中的能够进行变量替换;字符型也支持使用转移符</code>
<code>数值型:可为整数或浮点数,不过,puppe只有在数值上下文才把数值当数值对待,</code>
<code> </code><code>其他清理下一律以字符型处理</code>
<code>数组:数组值为中括号“[]”中的以逗号分隔的项目列表,最后一个项目后面可以有逗号;</code>
<code> </code><code>数组中的袁术可以为任何可用数据类型,包括</code><code>hash</code><code>或其他数组,属组索引为从0开始的整数,</code>
<code> </code><code>也可以使用负数索引</code>
<code>hash</code><code>:即为外键值数据类型,键和值之间使用“=>”分隔,键值对定义在“{ }”中,</code>
<code> </code><code>彼此间以逗号分隔;其键位字符型数据,而值可以为puppet支持的任意数据类型,</code>
<code> </code><code>访</code><code>hash</code><code>类型的数据元素要使用“键”当作索引进行。实际上和关联数组应属于同一数据类型</code>
<code>正则表达式:属于puppet的非标准数据类型,不能赋值给变量,仅能用于有限的几个接收正则</code>
<code> </code><code>表达式的地方,即接受使用“=~”及“!~”匹配操作符的位置,通常包括</code><code>case</code><code>语句中的</code>
<code> </code><code>selector,已经节点名称匹配的位置,他们不能传递给函数或用于资源属性的定义</code>
<code>facter变量:可以通过facter查看</code>
<code>内置变量:</code>
<code> </code><code>例如:agent端:$environment,$clientcert,$clentbversion</code>
<code> </code><code>server端:$servername,$serverip,$serverversion</code>
puppet中的正则表达式支持使用(?<ENABLED OPTION>:<SUNPATTERN>)和(?-<DISABLED OPTION>:<SUNPATTERN>)两个特殊的符号,如下面的示例,表示做正则表达式匹配时启用选项“i(忽略字符大小写)”,但不支持使用“m(把.当作换行符)”和启用“x(忽略模式中的空白字符和注释)”
<code>$packages = $operatingsystem ? {</code>
<code> </code><code>/(?i-mx:ubuntu|debian)/ => </code><code>'apache2'</code><code>,</code>
<code> </code><code>/(?i-mx:centos|fedora|redhat)/ => </code><code>'httpd'</code><code>,</code>
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<code>puppet的判断语句主要有三种分别为</code><code>if</code><code>,</code><code>case</code><code>,selector</code>
<code>puppet的操作符有:比较操作符,布尔操作符,算术操作符</code>
<code>if</code><code>语句分为单分支,双分支和多分支 </code>
<code>单分支:</code>
<code> </code><code>if</code> <code>CONDITION {</code>
<code> </code><code>statement</code>
<code> </code><code>...</code>
<code> </code><code>}</code>
<code>双分支:</code>
<code> </code><code>else</code> <code>{</code>
<code>多分支:</code>
<code> </code><code>elsif CONDITION {</code>
<code>case</code><code>语句的语法</code>
<code> </code><code>case</code> <code>CONTROL_EXPRESS {</code>
<code> </code><code>case1,...: { statement... }</code>
<code> </code><code>case2,...:{ statement... }</code>
<code> </code><code>... ...</code>
<code> </code><code>default:{ statement... }</code>
<code>selector语句的用法 </code>
<code> </code><code>CONTROL_VARIABLE ? {</code>
<code> </code><code>case1 => value1</code>
<code> </code><code>case2 => value2</code>
<code> </code><code>default => valueN</code>
例如:判断一个系统的OS的类型,并输出“welcome to OS”的信息
<code>if</code> <code>$operatingsystem == /^(?i-mx:centos|fedora|redhat)/ {</code>
<code> </code><code>notice </code><code>"welcome to redhat OS Family"</code>
<code>}elsif $operatingsystem == ubuntu {</code>
<code> </code><code>notice </code><code>"welcome to ubuntu server"</code>
<code>}</code><code>else</code> <code>{</code>
<code> </code><code>notice </code><code>"unkown server"</code>
<code>#################################################################</code>
<code> </code>
<code>case</code> <code>$operatingsystem {</code>
<code> </code><code>'Solaris'</code><code>: { notice(</code><code>"Welcome to Solaris"</code><code>) }</code>
<code> </code><code>'RedHat'</code><code>, </code><code>'CentOS'</code><code>: { notice(</code><code>"Welcome to RedHat OSFamily"</code><code>) }</code>
<code> </code><code>/^(Debian|Ubuntu)$/:{ notice(</code><code>"Welcome to $1 linux"</code><code>) }</code>
<code> </code><code>default: { notice(</code><code>"Welcome, alien *_*"</code><code>) }</code>
<code> </code><code>} </code>
<code>$welcome =$operatingsystem ? {</code>
<code> </code><code>/^(?i-mx:centos|fedora|redhat)/ => </code><code>'redhat OS Family'</code><code>,</code>
<code> </code><code>/^(?i-mx:ubuntu)/ => </code><code>'ubuntu'</code><code>,</code>
<code> </code><code>/^(?i-mx:debian)/ => </code><code>'debebian'</code><code>,</code>
<code> </code><code>}</code>
<code>notify { </code><code>"$welcome"</code><code>:</code>
<code> </code><code>message => </code><code>"welcome to $welcome"</code><code>,</code>
<code>class my_class {</code>
<code> </code><code>...puppet code ...</code>
<a href="http://blog.51cto.com/guoting/1568590#">?</a>
<code>class nginx {</code>
<code> </code><code>package { </code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => installed,</code>
<code> </code><code>name => nginx,</code>
<code> </code><code>service { </code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => </code><code>true</code><code>,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code><code>,</code>
<code> </code><code>subscribe => Package[</code><code>'nginx'</code><code>],</code>
以上是类的定义,类似于函数。需要使用的话,要调用。调用时,使用关键在include即可。
类可以基于父类调用,在调用时,应该指定通过inherits关键字调用父类。例如:
<code>class nignx::web inherits nginx {</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code><code>,</code>
<code>include nignx::web</code>
也支持类的覆盖和重写:
<code>=>:在子类中覆盖父类中的资源</code>
<code>+>:在子类中为父类中的资源新增额外的属性</code>
puppet模块:为了实现某种完备功能而组织成的一个独立的、自我包含的目录结构
模块名:目录名
<code>目录结构:</code>
<code>Module_name:</code>
<code> </code><code>manifests</code>
<code> </code><code>init.pp: 必须声明一个类,类名与模块名相同; </code>
<code> </code><code>*.pp:</code>
<code> </code><code>MODULE_NAME::[SUBDIR_NAME]::MANIFESTS_FILE_NAME</code>
<code> </code><code>files:静态文件</code>
<code> </code><code>puppet url:puppet:</code><code>///modules/MODULE_NAME/</code><code>[SUBDIR_NAME]</code><code>/FILE_NAME</code>
<code> </code><code>file</code><code>{</code><code>'nginx.conf'</code><code>:</code>
<code> </code><code>source</code> <code>=> puppet:</code><code>///modules/nginx/nginx</code><code>.conf</code>
<code> </code><code>templates: 模板文件:*.erb</code>
<code> </code><code>template(</code><code>'MODULE_NAME/TEMPLATE_FILE_NAME'</code><code>); </code>
<code> </code><code>content => template(</code><code>'模板文件'</code><code>),</code>
<code> </code><code>} </code>
<code> </code><code>lib: 插件</code>
<code> </code><code>tests: 模块使用说明文档</code>
<code> </code><code>spec: lib目录下的插件使用说明文档</code>
三、使用maste/agent模式,部署LAMP平台
Master/Agent模型之间通信是靠主机名通信的,大致步骤是:
<code>1、master启动时会为自己的key,自签</code>
<code>2、agent启动前要生成自己的key,生成签署请求</code>
<code>3、master收到请求书,验证合法性,签署证书</code>
实验环境:
<code>Master端:172.16.10.9 server.magedu.com</code>
<code>Agent端:172.16.10.77 basic.example.com</code>
<code> </code><code>172.16.10.122 node2.example.com</code>
<code>### 安装软件</code>
<code>在172.16.10.9:</code>
<code>yum </code><code>install</code> <code>puppet puppet-server -y</code>
<code>在172.16.10.77,172.16.10.122:</code>
<code>### 提供主机名解析名文件</code>
<code># 172.16.10.9 172.16.10.77 172.16.10.122</code>
<code># /etc/hosts</code>
<code>127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4</code>
<code>::1 localhost localhost.localdomain localhost6 localhost6.localdomain6</code>
<code>172.16.10.77 basic.example.com</code>
<code>172.16.10.9 server.magedu.com</code>
<code>172.16.10.122 node2.example.com</code>
<code>### 配置3台机器时间同步</code>
46
47
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
<code>## Master端 目录文件,如下:</code>
<code>[root@server modules]</code><code># pwd</code>
<code>/etc/puppet/modules</code>
<code>[root@server modules]</code><code># tree </code>
<code>.</code>
<code>├── mysql</code>
<code>│ ├── </code><code>file</code>
<code>│ │ └── my.cnf</code>
<code>│ └── manifests</code>
<code>│ └── init.pp</code>
<code>└── nginx</code>
<code> </code><code>├── files</code>
<code> </code><code>│ └── nginx.conf</code>
<code> </code><code>└── manifests</code>
<code> </code><code>└── init.pp</code>
<code>6 directories, 4 files</code>
<code>[root@server modules]</code><code># cat mysql/manifests/init.pp </code>
<code>class mysql {</code>
<code> </code><code>package{</code><code>'mysql-server'</code><code>:</code>
<code> </code><code>ensure => installed,</code>
<code> </code><code>file</code><code>{</code><code>'my.cnf'</code><code>:</code>
<code> </code><code>ensure => </code><code>file</code><code>,</code>
<code> </code><code>source</code> <code>=> </code><code>'puppet:///modules/mysql/my.cnf'</code><code>,</code>
<code> </code><code>path => </code><code>'/etc/my.cnf'</code><code>,</code>
<code> </code><code>require => Package[</code><code>'mysql-server'</code><code>],</code>
<code> </code><code>service{</code><code>'mysqld'</code><code>:</code>
<code> </code><code>ensure => </code><code>true</code><code>,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code><code>,</code>
<code> </code><code>subscribe => File[</code><code>'my.cnf'</code><code>],</code>
<code>[root@server modules]</code><code># cat nginx/manifests/init.pp </code>
<code> </code><code>package{</code><code>'nginx'</code><code>:</code>
<code> </code>
<code> </code><code>file</code><code>{</code><code>'nginx.conf'</code><code>:</code>
<code> </code><code>source</code> <code>=> </code><code>'puppet:///modules/nginx/nginx.conf'</code><code>,</code>
<code> </code><code>require => Package[</code><code>'nginx'</code><code>],</code>
<code> </code><code>path => </code><code>'/etc/nginx/nginx.conf'</code><code>,</code>
<code> </code><code>service{</code><code>'nginx'</code><code>:</code>
<code> </code><code>subscribe => File[</code><code>'nginx.conf'</code><code>],</code>
<code> </code><code>} </code>
<code>## 说明:my.cnf nginx.cnf是配置文件</code>
<code>[root@server manifests]</code><code># pwd</code>
<code>/etc/puppet/manifests</code>
<code>[root@server manifests]</code><code># tree </code>
<code>├── server</code>
<code>│ ├── basic.pp</code>
<code>│ └── node2.pp</code>
<code>└── site.pp</code>
<code>1 directory, 3 files</code>
<code>[root@server manifests]</code><code># cat server/node2.pp </code>
<code>node </code><code>'node2.example.com'</code> <code>{</code>
<code> </code><code>include nginx,mysql</code>
<code>[root@server manifests]</code><code># cat server/basic.pp </code>
<code>node </code><code>'basic.example.com'</code> <code>{</code>
<code> </code><code>include nginx,</code>
<code>[root@server manifests]</code><code># cat site.pp </code>
<code>import</code> <code>"server/*.pp"</code>
创建好目录清单后,此时需要启动服务。第一次启动时,可手动启动。
Master端启动:
<code>[root@server ~]</code><code># puppet master -v -d --no-daemonize</code>
<code>debug: Failed to load library </code><code>'rubygems'</code> <code>for</code> <code>feature </code><code>'rubygems'</code>
<code>debug: Puppet::Type::User::ProviderUser_role_add: </code><code>file</code> <code>roleadd does not exist</code>
<code>debug: Puppet::Type::User::ProviderPw: </code><code>file</code> <code>pw does not exist</code>
<code>debug: Puppet::Type::User::ProviderDirectoryservice: </code><code>file</code> <code>/usr/bin/dscl</code> <code>does not exist</code>
<code>debug: Puppet::Type::User::ProviderLdap: </code><code>true</code> <code>value when expecting </code><code>false</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/yaml</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/private</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/etc/puppet/auth</code><code>.conf]: Autorequiring File[</code><code>/etc/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/lib</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/facts</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/certificate_requests</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/etc/puppet/manifests/site</code><code>.pp]: Autorequiring File[</code><code>/etc/puppet/manifests</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/rrd</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/log/puppet/masterhttp</code><code>.log]: Autorequiring File[</code><code>/var/log/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/private_keys</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/reports</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/etc/puppet/puppet</code><code>.conf]: Autorequiring File[</code><code>/etc/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/state</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/etc/puppet/fileserver</code><code>.conf]: Autorequiring File[</code><code>/etc/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/server_data</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/etc/puppet/manifests</code><code>]: Autorequiring File[</code><code>/etc/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/bucket</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/public_keys</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/certs</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/yaml</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/rrd</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/reports</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/facts</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/private_keys</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/public_keys</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/certs</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/state</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/private</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/lib</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/bucket</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/certificate_requests</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/server_data</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: Finishing transaction 70003525843560</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/signed</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl/ca</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/requests</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl/ca</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/private</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl/ca</code><code>]</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/signed</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/private</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/requests</code><code>]</code><code>/ensure</code><code>: created</code>
<code>debug: Finishing transaction 70003525749380</code>
<code>info: Creating a new SSL key </code><code>for</code> <code>ca</code>
<code>info: Creating a new SSL certificate request </code><code>for</code> <code>ca</code>
<code>info: Certificate Request fingerprint (md5): E4:F9:A5:7C:CD:DC:D5:F4:30:C5:97:D4:4B:75:E2:1A</code>
<code>notice: Signed certificate request </code><code>for</code> <code>ca</code>
<code>notice: Rebuilding inventory </code><code>file</code>
<code>debug: Using cached certificate </code><code>for</code> <code>ca</code>
<code>info: Creating a new certificate revocation list</code>
<code>info: Creating a new SSL key </code><code>for</code> <code>server.magedu.com</code>
<code>info: Creating a new SSL certificate request </code><code>for</code> <code>server.magedu.com</code>
<code>info: Certificate Request fingerprint (md5): EC:52:9E:3B:8A:92:A3:E2:82:FB:D6:EF:7B:36:50:1F</code>
<code>notice: server.magedu.com has a waiting certificate request</code>
<code>debug: Using cached certificate_request </code><code>for</code> <code>server.magedu.com</code>
<code>notice: Signed certificate request </code><code>for</code> <code>server.magedu.com</code>
<code>notice: Removing </code><code>file</code> <code>Puppet::SSL::CertificateRequest server.magedu.com at </code><code>'/var/lib/puppet/ssl/ca/requests/server.magedu.com.pem'</code>
<code>notice: Removing </code><code>file</code> <code>Puppet::SSL::CertificateRequest server.magedu.com at </code><code>'/var/lib/puppet/ssl/certificate_requests/server.magedu.com.pem'</code>
<code>notice: Starting Puppet master version 2.7.25</code>
<code>debug: Finishing transaction 70003524197780</code>
<code>debug: No modules </code><code>mount</code> <code>given; autocreating with default permissions</code>
<code>debug: No plugins </code><code>mount</code> <code>given; autocreating with default permissions</code>
出现以上信息时,证明测试没有问题,此时可以使用:
<code>service puppetmaster start</code>
<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411310PLp7.png" target="_blank"></a>
以172.16.10.122为例:
<code>[root@node2 ~]</code><code># puppet agent --server=server.magedu.com --no-daemonize -d</code>
<code>### 会出现以下信息:</code>
<code>info: Creating a new SSL key </code><code>for</code> <code>node2.example.com</code>
<code>info: Caching certificate </code><code>for</code> <code>ca</code>
<code>info: Creating a new SSL certificate request </code><code>for</code> <code>node2.example.com</code>
<code>info: Certificate Request fingerprint (md5): 1B:D4:E5:D9:15:A8:87:5B:67:C0:4B:C2:72:\</code>
<code> </code><code>15:45:BA</code>
<code>###############################################################</code>
<code>此时在Master端:</code>
<code>[root@server ~]</code><code># puppet cert --list</code>
<code> </code><code>"node2.example.com"</code> <code>(1B:D4:E5:D9:15:A8:87:5B:67:C0:4B:C2:72:15:45:BA)</code>
<code>签名:</code>
<code>[root@server ~]</code><code># puppet cert --sign node2.example.com</code>
<code>notice: Signed certificate request </code><code>for</code> <code>node2.example.com</code>
<code>notice: Removing </code><code>file</code> <code>Puppet::SSL::CertificateRequest node2.example.com at \</code>
<code>'/var/lib/puppet/ssl/ca/requests/node2.example.com.pem'</code>
<code>#####################################################################</code>
<code>此时Agent端出现:</code>
<code>debug: Using cached certificate </code><code>for</code> <code>node2.example.com</code>
<code>notice: Starting Puppet client version 2.7.25</code>
<code>表明签署成功。</code>
<code>####################################################################</code>
<code>确保上述agent相关操作不存在问题后,便可以将--server选项指定的信息存储与agent的配置文件中</code>
<code>,并以服务的方式启动puppet agent了。</code>
<code>其配置文件为</code><code>/etc/puppet/puppet</code><code>.conf</code>
<code>echo</code> <code>"server=server.magedu.com"</code> <code>>> </code><code>/etc/puppet/puppet</code><code>.conf</code>
<code>service puppet start</code>
172.16.10.77同样的配置。
<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411311IKZU.png" target="_blank"></a>
puppet客户端默认每30分钟很服务器通讯一次,但是有时,我们希望服务器能够给客户端紧急推送一些任务,于是就有了puppet kick(puppet 2.6以前叫puppetrun)。
<code>1)编辑客户端配置文件</code><code>/etc/puppet/puppet</code><code>.conf在[agent]端中添加如下</code>
<code>listen=</code><code>true</code>
<code>2)在客户端编辑或创建新文件</code><code>/etc/puppet/namespaceauth</code><code>.conf,包含下面内容</code>
<code>[puppetrunner]</code>
<code>allow *.magedu.com</code>
<code>3)在客户端编辑文件auth.conf,添加如下内容</code>
<code>path </code><code>/run</code>
<code> </code><code>method save</code>
<code> </code><code>auth any</code>
<code> </code><code>allow server.magedu.com</code><code>## 注意,这一项放到 path /前面</code>
<code>4)推送方法,在服务器端运行命令</code>
<code>[root@server puppet]</code><code># puppet kick -p 1 --host node2.example.com</code>
<code>Triggering node2.example.com</code>
<code>Getting status</code>
<code>status is success</code>
<code>node2.example.com finished with </code><code>exit</code> <code>code 0</code>
<code>Finished</code>
配置基本完成。
本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1568590,如需转载请自行联系原作者