天天看点

puppet语法学习

先讲讲shell 与puppet的不同。

shell 脚本是过程式的,里面描述的是命令执行的过程,shell 通常很短,可以很快写出来,但是很快又会被抛弃,它常常依赖于特定操作系统环境。

puppet 语言是结果式的,使用者将自己想要达到的目的通过puppet语法描述给puppet,puppet去完成它,使用者不需要关心过程,整个过程完全被抽象化了。譬如安装一个软件包,只需要ensure => present ,不需要关心操作系统是debian还是redhat 。

个人总结看来,puppet语言形式上的特点就是“花括号分类,冒号声明,逗号结束”。

接下来讲puppet的语法,主要是举例(持续完善中,,,)

1、软件包管理

安装

1

<code>package {</code><code>"vim"</code><code>: ensure =&gt; present, }</code>

多个软件包也可以一起写,用中括号和逗号

2

3

4

<code>package {</code>

<code>    </code><code>[</code><code>"httpd"</code><code>,</code><code>"mysql-server"</code><code>,</code><code>"php"</code><code>,</code><code>"php-mysql"</code><code>]:</code>

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

<code>}</code>

卸载

<code>package {</code><code>"vim"</code><code>: ensure =&gt; absent, }</code>

2、权限管理

5

<code>file</code> <code>{ </code><code>"/etc/sudoers"</code><code>:</code>

<code>    </code><code>owner =&gt; root,</code>

<code>    </code><code>group =&gt; root,</code>

<code>    </code><code>mode =&gt; 400,</code>

权限递归

<code>file</code> <code>{ </code><code>'/some/dir'</code><code>:</code>

<code>      </code><code>mode =&gt; 644,</code>

<code>      </code><code>recurse =&gt; </code><code>true</code><code>,</code>

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

目录里的所有文件会变成644,目录就会755

3、服务

6

<code>service {</code><code>"sshd"</code><code>:</code>

<code>    </code><code>hastatus =&gt; </code><code>true</code><code>,</code>

<code>    </code><code>harestart =&gt; </code><code>true</code><code>,</code>

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

<code>    </code><code>enable</code> <code>=&gt; </code><code>true</code><code>,</code>

4、文件管理

文件托管

<code>file</code> <code>{</code><code>"/etc/my.cnf"</code><code>:</code>

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

<code>    </code><code>source</code> <code>=&gt; </code><code>"puppet:///modules/mysql/my.cnf"</code>

<code>    </code><code>owner =&gt; mysql,</code>

<code>    </code><code>group =&gt; mysql,</code>

这里有个地方比较蛋疼,文件路径是/etc/puppet/modules/mysql/files/my.conf,写成puppet规则时files会被省略,写成puppet:///modules/mysql/my.cnf

链接

<code>file</code> <code>{ </code><code>"/etc/inetd.conf"</code><code>:</code>

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

<code>      </code><code>target =&gt; </code><code>"/etc/inet/inetd.conf"</code><code>,</code>

5、监视和审计

<code>file</code> <code>{ </code><code>"/etc/passwd"</code><code>:</code>

<code>    </code><code>audit =&gt; [ owner, mode ],</code>

(当文件的权限属性发生变化时发出消息,而不修正权限)

6、执行命令

7

8

9

<code>exec</code> <code>{ </code><code>"reload nginx"</code><code>:</code>

<code>    </code><code>command</code> <code>=&gt; </code><code>"/usr/sbin/nginx reload"</code><code>,</code>

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

<code>    </code><code>refreshonly =&gt; </code><code>true</code><code>,</code>

<code>file</code> <code>{ </code><code>"/etc/nginx/nginx.conf"</code><code>:</code>

<code>    </code><code>source</code> <code>=&gt; </code><code>"puppet:///modules/nginx/nginx.conf"</code><code>,</code>

<code>    </code><code>notify =&gt; Exec[</code><code>"reload nginx"</code><code>],</code>

(notify表示配置文件发生更改,就触发nginx平滑重启)

7、定时任务crontab

<code>cron</code> <code>{ ntpdate:</code>

<code>    </code><code>command</code> <code>=&gt; </code><code>"/usr/sbin/ntpdate 192.168.1.3"</code><code>,</code>

<code>    </code><code>user =&gt; root,</code>

<code>    </code><code>hour =&gt; </code><code>'*/4'</code><code>,</code>

<code>    </code><code>minute =&gt; </code><code>'1'</code><code>,</code>

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

(这样会导致流量瞬间拥挤,puppet很周到,提供一个伪随机的办法)

<code>    </code><code>minute =&gt; fqdn_rand( 60 ),</code>

(尽管是每四个小时运行一次,但是不同的机器还是会在不同的时刻去执行命令【分钟数为0-60随机】,将流量分散开来。)

8、删除

<code>tidy {  clean_temp:</code>

<code>    </code><code>path =&gt; </code><code>"/tmp/temp"</code><code>,</code>

<code>    </code><code>type</code> <code>=&gt; </code><code>"ctime"</code><code>,</code>

<code>    </code><code>recurse =&gt; </code><code>true</code><code>,</code>

<code>    </code><code>rmdirs =&gt; </code><code>true</code><code>,</code>

<code>    </code><code>age =&gt; </code><code>"1d"</code><code>,</code>

<code>    </code><code>backup =&gt; </code><code>false</code><code>,</code>

(recurse表示递归)

高级用法之class

单独的class

10

11

12

13

14

15

16

17

18

<code>class </code><code>ssh</code> <code>{</code>

<code>package {</code><code>"openssh-server"</code><code>:</code>

<code>file</code> <code>{</code><code>"/etc/ssh/sshd_config"</code><code>:</code>

<code>    </code><code>source</code> <code>=&gt; </code><code>"puppet:///files/sshd_config"</code><code>,</code>

<code>    </code><code>notify =&gt; Service [</code><code>"sshd"</code><code>],</code>

<code>    </code><code>hasstatus =&gt; </code><code>true</code><code>,</code>

<code>    </code><code>hasrestart =&gt; </code><code>true</code><code>,</code>

合并的class(class可以被引用,成为另一个class的子集,用逗号分隔,结尾没有逗号)

<code>class basic {</code>

<code>      </code><code>include </code><code>ssh</code><code>, httpd</code>

节点的语法和引用class一样

<code>node </code><code>"apache01.test.org"</code>  <code>{</code>

<code>      </code><code>include httpd,mysql,php</code>

用户管理

19

<code>user { </code><code>"root"</code><code>:</code>

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

<code>    </code><code>name     =&gt; </code><code>"root"</code><code>,</code>

<code>    </code><code>password =&gt; </code><code>"SomeAlreadyEncryptedPassword"</code><code>;</code>

<code>user {</code><code>"admin"</code><code>:</code>

<code>    </code><code>name =&gt;</code><code>"admin"</code><code>,</code>

<code>    </code><code>shell =&gt; </code><code>"/bin/bash"</code><code>,</code>

<code>    </code><code>home =&gt; </code><code>"/home/admin"</code><code>,</code>

<code>    </code><code>groups</code> <code>=&gt; </code><code>"admin,wheel"</code><code>,</code>

<code>    </code><code>uid =&gt; 500,</code>

<code>    </code><code>gid =&gt; 500,</code>

<code>    </code><code>password =&gt; </code><code>'$1$Nnh0M0$t9s7Bbwx2fFer6IP/QGdA0'</code><code>,</code>

<code>    </code><code>require =&gt; Group[</code><code>"admin"</code><code>],</code>

<code>group {</code><code>"admin"</code><code>:</code>

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

(password也就是/etc/shadow中的已经加密的密码,把它复制出来就好了,密码中包含 $ 的话,一定要记得加单引号。)

puppet还可以独立于master单独运行,功能也足够强大,几乎所有能写成puppet规则的语句,都可以直接在puppet命令行执行,例如:

1、安装软件包

<code>puppet resource package httpd ensure=present</code>

puppet 可以识别常见的linux发行版,自动调用yum或者apt去安装软件。

2、管理服务

<code>puppet resource service httpd ensure=running </code><code>enable</code><code>=</code><code>true</code>

puppet会调用/etc/init.d/下的启动脚本,这个比常见的监控脚本强太多了。(puppet 2.7以上)

3、将规则写入本地文件来执行

<code>puppet apply </code><code>/opt/puppet/rules/init</code><code>.pp</code>

本文转自 紫色葡萄 51CTO博客,原文链接:http://blog.51cto.com/purplegrape/946362,如需转载请自行联系原作者