一、关于Puppet
puppet是一个IT基础设施自动化管理工具,它能够帮助系统管理员管理基础设施的整个生命周期:供应(provisioning)、配置(configuration)、联动(orchestration)及报告(reporting),基于puppet,可以实现自动化重复任务,快速部署关键性应用以及在本地或云端完成主动管理变更和快速扩展架构规模等。
puppet资源
如果把OS的所有配置,如用户账号、特定的文件、文件所属的目录、运行的服务、程序包以及cron任务等,看作是许多独立原子单元的集合的话,这些所谓的“单元”就是“资源”,不过,这些资源在其大小、复杂程度以及生命周期的跨度上等多个维度上可能会各不相同。
通常来说,类属于同一种资源的属性是相近的,如文件都有其属主和属组,而用户账号则由用户名、UID、GID等组成。但,即便是同一种资源,其在不同OS上的实现方式却又可能各不相同,例如,在windows上和Linux上启动和停止服务的方式相去甚远。
因此,puppet从以下三个维度来对资源完成抽象:
相似的资源被抽象成同一种资源“类型”,如程序包资源、用户资源及服务资源等;
将资源属性或状态的描述与其实现方式剥离开来,如仅说明安装一个程序包而不用关心其具体是通过yum、pkgadd、ports或是其它方式实现;
仅描述资源的目标状态,也即期望其实现的结果,而不是其具体过程,如“确定nginx运行起来”而不是具体描述为“运行nginx命令将其启动起来”;
这三个也被称作puppet的资源抽象层(RAL)。RAL由type(类型)和provider(提供者,即不同OS上的特定实现)组成。
puppet资源解构
在为puppet定义一个资源时,这种语法被称作“资源申报(resource declaration)”,它是puppet语言的核心组成部分。上述的定义中,仅描述了资源的目标状态而没有提到为达成目标所需要采取的任何步骤。而资源定义的核心也可以抽象为type、title、attribute和value四个部分。
puppet有许多内置的资源类型,而通过安装插件还可以继续新增额外的类型。可以通过puppet官方的类型参考页面(http://docs.puppetlabs.com/references/latest/type.html)获取详细的信息。也可以使"puppet describe"命令来获取puppet当前所支持的类型列表及每种类型的详细信息,下面给出了一个简要的使用说明。
puppet describe -l:例如puppet支持的所有资源类型及其描述信息;
puppet describe -s <TYPE>:列出指定资源的简要说明;
puppet describe <TYPE>:显示指定资源的详细说明;
下面说一下,puppet几个常用的资源使用方法:
首先安装puppet
1
2
3
4
<code># 升级facter版本</code>
<code>[root@node1 ~]</code><code># rpm -Uvh facter-1.7.3-1.el6.x86_64.rpm</code>
<code># 添加epel安装源,安装puppet</code>
<code>[root@node1 ~]</code><code># yum -y localinstall puppet-2.7.23-1.el6.noarch.rpm</code>
package资源使用:
5
6
7
8
9
10
11
<code># 安装nginx</code>
<code>[root@node1 ~]</code><code># vi test.pp</code>
<code>package {</code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => </code><code>true</code><code>, </code><code>#确保nginx是被安装的</code>
<code>}</code>
<code># 执行test.pp</code>
<code>[root@node1 ~]</code><code># puppet apply test.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Package</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'1.0.15-5.el6'</code> <code>to </code><code>'true'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.77 seconds</code>
<code>[root@node1 ~]</code><code># rpm -q nginx</code>
<code>nginx-1.0.15-5.el6.x86_64</code>
service资源使用
12
13
14
15
16
17
<code> </code><code>ensure => </code><code>true</code><code>,</code>
<code>service {</code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => </code><code>true</code><code>, </code><code>#确保服务是被启动的</code>
<code> </code><code>require => Package[</code><code>'nginx'</code><code>], </code><code>#确保是在安装nginx之后启动</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Service</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>1.02 seconds</code>
<code>[root@node1 ~]</code><code># ps aux | grep nginx</code>
<code>root 8562 0.0 0.0 94572 2024 ? Ss 11:31 0:00 nginx: master process </code><code>/usr/sbin/nginx</code> <code>-c </code><code>/etc/nginx/nginx</code><code>.conf</code>
<code>nginx 8563 0.0 0.0 94916 2580 ? S 11:31 0:00 nginx: worker process </code>
<code>root 8568 0.0 0.0 6384 656 pts</code><code>/0</code> <code>R+ 11:31 0:00 </code><code>grep</code> <code>nginx</code>
<code># 发现nginx已经启动</code>
group资源使用:
<code>[root@node1 ~]</code><code># vi test2.pp</code>
<code>group {</code><code>'hellopuppet'</code><code>:</code>
<code> </code><code>ensure => present, </code><code>#确保hellopuppet是被创建的</code>
<code> </code><code>gid => 1001, </code><code># gid为1001</code>
<code>[root@node1 ~]</code><code># puppet apply test2.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Group</code><code>[hellopuppet]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.08 seconds</code>
<code>[root@node1 ~]</code><code># cat /etc/group | grep hellopuppet</code>
<code>hellopuppet:x:1001:</code>
user资源使用:
18
19
20
21
22
<code> </code><code>ensure => present,</code>
<code> </code><code>gid => 1001,</code>
<code>user {</code><code>'hellopuppet'</code><code>:</code>
<code> </code><code>ensure => present, </code><code>#确保用户被创建</code>
<code> </code><code>gid => 1001, </code><code>#指定基本组ID</code>
<code> </code><code>uid => 1001, </code><code>#指定uid</code>
<code> </code><code>home => </code><code>'/home/hellopuppet'</code><code>, </code><code>#指定家目录</code>
<code> </code><code>managehome => </code><code>true</code><code>, </code><code>#创建家目录</code>
<code> </code><code>password => </code><code>'$1$2b2a85db$liwf2K3dQzc2oaRq/RnUg/'</code><code>, </code><code>#给用户创建密码,可以使用openssl passwd -1 -salt `openssl rand -hex 4`命令生成随机串,然后粘贴在这里</code>
<code> </code><code>require => Group[</code><code>'hellopuppet'</code><code>], </code><code>#在创建hellopuppet组之后,创建用户</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//User</code><code>[hellopuppet]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.09 seconds</code>
<code>[root@node1 ~]</code><code># cat /etc/passwd | grep hellopuppet</code>
<code>hellopuppet:x:1001:1001::</code><code>/home/hellopuppet</code><code>:</code><code>/bin/bash</code>
<code>[root@node1 ~]</code><code># cat /etc/shadow | grep hellopuppet</code>
<code>hellopuppet:$1$2b2a85db$liwf2K3dQzc2oaRq</code><code>/RnUg/</code><code>:16173:0:99999:7:::</code>
<code># 发现用户已被创建,并且生成密码</code>
cron资源使用:
<code>[root@node1 ~]</code><code># vi test3.pp</code>
<code>cron</code> <code>{</code><code>'ntpdate'</code><code>:</code>
<code> </code><code>command</code> <code>=> </code><code>"/usr/sbin/ntpdate 8.8.8.8"</code><code>, </code><code>#执行的命令</code>
<code> </code><code>user => root, </code><code>#指定执行用户</code>
<code> </code><code>minute => </code><code>'*/3'</code><code>, </code><code>#指定每3分钟执行一次</code>
<code> </code><code>ensure => present, </code><code>#确保被创建任务 </code>
<code> </code>
<code>[root@node1 ~]</code><code># puppet apply test3.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Cron</code><code>[ntpdate]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.03 seconds</code>
<code>[root@node1 ~]</code><code># crontab -l</code>
<code># Puppet Name: ntpdate</code>
<code>*</code><code>/3</code> <code>* * * * </code><code>/usr/sbin/ntpdate</code> <code>8.8.8.8</code>
<code># 发现cron任务已经被创建</code>
file资源使用:
<code>[root@node1 ~]</code><code># cp /etc/nginx/nginx.conf /tmp/nginx.conf</code>
<code>[root@node1 ~]</code><code># mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak</code>
<code>[root@node1 ~]</code><code># vi test4.pp</code>
<code>file</code> <code>{</code><code>'/etc/nginx/nginx.conf'</code><code>:</code>
<code> </code><code>ensure => </code><code>file</code><code>, </code><code>#确保nginx.conf是一个文件</code>
<code> </code><code>mode => 0644, </code><code>#定义权限</code>
<code> </code><code>source</code> <code>=> </code><code>'/tmp/nginx.conf'</code><code>, </code><code>#定义文件的源地址,如过没就从source复制</code>
<code>[root@node1 ~]</code><code># puppet apply test4.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/ensure</code><code>: defined content as </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.02 seconds</code>
<code>[root@node1 ~]</code><code># ls /etc/nginx/nginx.conf</code>
<code>/etc/nginx/nginx</code><code>.conf</code>
资源间的应用次序
<code>[root@node1 ~]</code><code># yum -y remove nginx</code>
<code> </code><code>ensure => running,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code><code>,</code>
<code>Package[</code><code>'nginx'</code><code>] -> Service[</code><code>'nginx'</code><code>]</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Package</code><code>[nginx]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>2.27 seconds</code>
<code>root 13589 0.0 0.0 94572 2028 ? Ss 11:57 0:00 nginx: master process </code><code>/usr/sbin/nginx</code> <code>-c </code><code>/etc/nginx/nginx</code><code>.conf</code>
<code>nginx 13590 0.0 0.0 94916 2576 ? S 11:57 0:00 nginx: worker process </code>
<code>root 13596 0.0 0.0 6384 652 pts</code><code>/0</code> <code>R+ 11:57 0:00 </code><code>grep</code> <code>nginx</code>
<code># Package['nginx'] -> Service['nginx'] 表示先安装nginx,然后启动nginx</code>
exec资源使用
23
<code>exec</code> <code>{</code><code>'chkconfig nginx'</code><code>:</code>
<code> </code><code>path => </code><code>"/sbin"</code><code>, </code><code>#执行命令的,程序路径</code>
<code> </code><code>command</code> <code>=> </code><code>"chkconfig --add nginx; chkconfig nginx off"</code><code>, </code><code>#执行的命令</code>
<code> </code><code>user => root, </code><code>#执行用户</code>
<code> </code><code>group => root,</code>
<code>Package[</code><code>'nginx'</code><code>] -> Service[</code><code>'nginx'</code><code>] -> Exec[</code><code>'chkconfig nginx'</code><code>]</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[chkconfig nginx]</code><code>/returns</code><code>: executed successfully</code>
<code>notice: Finished catalog run </code><code>in</code> <code>2.05 seconds</code>
<code>[root@node1 ~]</code><code># chkconfig --list nginx</code>
<code>nginx 0:off 1:off 2:off 3:off 4:off 5:off 6:off</code>
发现资源按照顺序依次执行
资源间通知的使用:
24
25
26
27
<code> </code><code>ensure => </code><code>file</code><code>,</code>
<code> </code><code>mode => 0644,</code>
<code> </code><code>source</code> <code>=> </code><code>'/tmp/nginx.conf'</code><code>,</code>
<code>service { </code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => running,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code><code>,</code>
<code>File[</code><code>'/etc/nginx/nginx.conf'</code><code>] ~> Service[</code><code>'nginx'</code><code>]</code>
<code>[root@node1 ~]</code><code># vi /tmp/nginx.conf</code>
<code># 修改源文件中启动线程为4</code>
<code>worker_processes 4</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Service</code><code>[nginx]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.50 seconds</code>
<code>root 15452 0.0 0.0 94572 2024 ? Ss 12:05 0:00 nginx: master process </code><code>/usr/sbin/nginx</code> <code>-c </code><code>/etc/nginx/nginx</code><code>.conf</code>
<code>nginx 15453 0.0 0.0 94916 2612 ? S 12:05 0:00 nginx: worker process </code>
<code>nginx 15454 0.0 0.0 94916 2696 ? S 12:05 0:00 nginx: worker process </code>
<code>nginx 15456 0.0 0.0 94916 2696 ? S 12:05 0:00 nginx: worker process </code>
<code>nginx 15457 0.0 0.0 94916 2676 ? S 12:05 0:00 nginx: worker process </code>
<code>root 15463 0.0 0.0 6384 656 pts</code><code>/0</code> <code>R+ 12:05 0:00 </code><code>grep</code> <code>nginx</code>
<code># 启动进程变为4个,</code>
<code># File['/etc/nginx/nginx.conf'] ~> Service['nginx']表示当配置文件有修改时,重启nginx</code>
正则表达式的使用
<code>[root@node1 ~]</code><code># vi test5.pp</code>
<code>$webserver = $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>
<code>notify {</code><code>"$webserver"</code><code>:</code>
<code> </code><code>message => </code><code>"install $webserver"</code><code>,</code>
<code>[root@node1 ~]</code><code># puppet apply test5.pp</code>
<code>notice: </code><code>install</code> <code>httpd</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Notify</code><code>[httpd]</code><code>/message</code><code>: defined </code><code>'message'</code> <code>as </code><code>'install httpd'</code>
首先定义一个webserver变量,$operatingsystem是pupppet中的顶级变量,表示当前系统的版本,可以随时调用"?"表示判断语句,然后后面是正则模式匹配,"i"表示忽略字符大小写,"-m"表示不把.当作换行符,"x"表示忽略模式中的空白字符和注释,然后通过notify资源输出,因为当前是centos系统,所以通知要安装httpd。
puppet资源使用,暂时先介绍这么多,以后会不断更新。
本文转自ljl_19880709 51CTO博客,原文链接:http://blog.51cto.com/luojianlong/1394841,如需转载请自行联系原作者