集中管理利器-puppet快速入门-下

Puppet配置

1.    文件管理 file

文件服务器写法:

/etc/puppet/ fileserver.conf 定义

[files]

path /tmp/files  ## puppet数据存放目录 =è后面远程备份实战会用到

allow *.example.com

实战1: 备份masterc.shagent /tmp目录下。

代码:

##remote backup

filebucket{   main:
    server =>   "pmaster.example.com",
    path => false,
}

###备份master机上c.sh文件到agent /tmp目录下

file   {"/tmp/master.sh":
     source =>   "puppet://pmaster.example.com/files/c.sh",
     backup => main,
}

请留意如图中的目录结构

50.png

结果输出:

51.png

实战2: ##备份agent本地/etc/passwd文件到/tmp并命名为test3,如果文件已存在,先备份再覆盖

代码:

##备份agent本地/etc/passwd文件到/tmp并命名为test3

file   {"/tmp/test3":
    source => "/etc/passwd",
    backup =>   ".bak_$uptime_seconds",
    group => nobody,
    owner => nobody,
    mode => 600;
}

结果输出:

52.png

实战3##制定文件内容

代码:

##制定文件内容

file   {"/tmp/test4_content":
    content =>  "content test \n",
}

结果输出:

集中管理利器-puppet快速入门-下

集中管理利器-puppet快速入门-下

实战4##创建软链接测试

代码:

##创建软链接测试

file {"/tmp/test5_link1":
    ensure => link,
    target =>   "/var/log/messages";
    "/tmp/test5_link2":
    ensure => link,
    target =>   "/var/log/puppet/puppet.log";
}

结果输出:

集中管理利器-puppet快速入门-下

集中管理利器-puppet快速入门-下

实战5.##文件删除测试

代码:

##文件删除测

file   {"/tmp/test6":
    ensure => absent;
}

结果输出:

62.png

文件管理常用参数诠释:

1.backup参数
 
指定在文件内容替换之前进行备份操作,可以备份在本地,也可以集中备份。集中远程备份的话可以使用filebucket(我们在后面的实战部分会进行详细介绍),这个备份的时候如果备份在本地可以指定备份的文件名。

2.content参数
 
指定文件的内容(字符串),这个参数和sourcetarget参数冲突。

3.ensure参数
  这个参数指定是否创建、删除文件或者目录,有presentabsentfiledirectory等值。其中present会检查文件是否存在,不存在就会创建一个空文件。absent会删除文件或者目录,如果是目录需要指定recurse参数指定是否允许递归。如果指定的是其他的参数,则会创建连接文件,为了方便管理,建议在创建的时候使用ensure =>   link,并通过target参数指定文件。注意不能在windows系统上链接文件,

4.force参数
  该参数强制执行文件操作,进行如下操作的时候必须指定force参数
  1
purge 子目录
  2
)用文件或者链接文件替换目录
  3
)使用ensure =>   absent参数删除目录

5.group参数
  指定文件或者目录的属组,可以是组名或者组id,如果是windows的话属组和属主不能相同。

6.ignore参数
  这个参数指定在递归期间对符合指定的模式的文件操作将被忽略。

7.links参数
  这个参数指定处理文件期间如何处理链接文件,可以设置followmanage。在拷贝文件的时候,follow将会拷贝目标文件代替链接文件,manage将只会拷贝链接文件,ignore将会跳过。

8.mode参数
  这个参数用来指定文件或者目录的权限,puppet使用传统的unix权限方案,如果系统采用的权限方案不同的,puppet为这些系统将权限翻译成等价的权限,比如windows。这些权限可以是数字(r=4,w=2,x=1)也可以是字符(rwxst)

9.owner参数
  指定文件的属主,可以是用户名或是用户id,如果是windows的话属组和属主不能相同。

10.path参数
  指定文件管理的路径。Windows路径也使用/而不是\

11.purge参数
 
这个参数会删除在master上不存在的文件,这个参数只有在管理目录的时候指定了recurse =>   true参数的时候才有意义。

12.recurse参数
 
这个参数指定是否进行递归调用以及递归调用的深度,选项如下
  1
inf,true  —在远程和本地都进行递归调用
  2
remote —只在远程进行递归调用
  3
false —不进行递归调用
  4
[0-9]+ —true参数一样,但是限制递归调用目录的深度

13.source参数
 
该参数指定将会被拷贝到指定位置的资源文件,值可以是指定远程文件的URIS或者本地的完整路径。可以指定多个sorce,这个参数和contenttarget冲突。

14.target参数
 
这个参数指定创建链接文件的目标文件或者目录。 

文档参考:

http://docs.puppetlabs.com/references/stable/type.html#file

http://www.jbxue.com/

1.    用户管理

代码:

###用户管理

group{"py":           #组名
ensure =>   "present",    #创建用户组
gid => 2002,           #组id
name =>   "py",
}
 
user{"py":
    #ensure => "absent",  #删除py用户
    ensure => "present",  #新增py用户
    uid => 2002,
    gid => 2002,
    home => '/home/py',
    shell => "/bin/bash",
    password => '$1$zRFsT1$X3TE0/smnkWtxE2P.BPWq/',  #grub-md5-crypt 工具生成
 
}
file   {"/home/py":        #创建用户家目录
    group => 2002,
    owner => 2002,
    mode => 700,
    ensure => directory;
}

结果输出:

63.png

用户管理常用参数诠释:

1.manages_aix_lam
 
用来管理AIXLAM(Loadable Authentication Module)系统。

2.manages_members
 
对于目录服务是组属性成员,而不是用户。

3.system_groups
 
用来允许你创建比较小GID的系统组,一般小于500

()Puppet组管理参数

1.allowdupe
 
是否允许重复的GIDS,默认是false

2.attributes
 
在一个key=>value对中指定AIX组的属性,需要manages_aix_lam特性。

3.ensure
 
创建或者删除组,值为presentabsent

4.gid
 
ID,如果不指定的话会自动生成一个数字,但是不建议这么做。

5.ia_load_module
 
使用I&A模块来管理用户,同样需要manages_aix_lam特性。

6.members
 
用来指定组的成员。

7.name
 
指定组的名字。

8.provider
 
使用group资源的后端。这些后端包括:
  aix — AIX
的组管理。
  directoryservice —
OS X上使用目录服务进行组管理。
  groupadd —
使用groupadd管理组,大部分的平台默认识用这个来管理。
  ldap —
通过ldap进行组管理。
  pw —
freebsd平台上通过pw进行组管理。
  windows_adsi —
windows平台上使用本地用户管理。

9.system
 
指定组是否是小GID的系统组。

二、用户的管理

()Puppet用户管理特性
  1.allows_duplicates
 
支持含有相同UID的用户。

2.manages_aix_lam
 
用来管理AIXLAM(Loadable Authentication Module)系统。

3.manages_expiry
 
管理一个用户使用的有效期。

4.manages_homedir
 
创建或者删除用户的家目录。

5.manages_password_age
 
设置密码时间需求和限制。

6.manages_passwords
 
更改用户的密码,通过传入密码hash字串,后面实战部分会详细介绍。

7.manages_solaris_rbac
 
管理角色和普通用户。

8.system_users
 
用来允许你创建比较小GID的系统用户,一般小于500

()Puppet用户管理参数

1.allowdupe
 
是否允许重复的UID

2.attributes
 
为用户指定AIX属性,需要manages_aix_lam特性。

3.auths
 
指定用户的认证方式。

4.comment
 
用户的描述。

5.ensure
 
指定用户所处的基本状态。其值可以为:presentabsentrole

6.expiry
 
用户使用期限。

7.gid
 
设置用户的组ID。可以是数字也可以是组名。

8.groups
 
设置用户的组名,只能是组名,不能是GID

9.home
 
设置用户的家目录。

10.   ia_load_module
 
使用I&A模块来管理用户,同样需要manages_aix_lam特性。

11. managehome
 
当进行用户管理的时候,是否同时管理用户的家目录。

12. name
 
指定用户名。

13. password
 
指定用户的密码,后面的实战部分会详细讲解。

14.   password_max_age
 
一个密码在必须更改之前能使用的最多天数。

15.   password_min_age
 
一个密码在必须更改之前能使用的最少天数。

16. profiles
 
指定用户拥有的配置文件。

17. project
 
和用户相关的项目的名字,需要manages_solaris_rbac特性。

18. provider
 
使用user资源的后端。这些后端包括:
  aix — AIX
的用户管理。
  directoryservice —
OS X上使用目录服务进行用户管理。
  Hpuxuseradd — HP-UX
的用户管理。
  ldap —
通过ldap进行用户管理。
  pw —
freebsd平台上通过pw进行用户管理。
  user_role_add — solaris
的用户和角色管理。
  useradd —
通过useradd进行用户管理,加入你要进行密码管理的话,需要安装rubyshadow密码库,一般是ruby-libshadow
  windows_adsi —
windows平台上使用本地用户管理。

19. roles
 
用户的角色,针对solaris系统适用。

20. shell
 
指定用户登录的shell

21. system
 
指定用户是否为系统用户,一般是小于500UID用户。

22.uid
 
指定用户的UID

文档参考:

http://docs.puppetlabs.com/references/latest/type.html#user
http://docs.puppetlabs.com/references/latest/type.html#group

http://www.jbxue.com/

1.    命令执行

代码:

/etc/puppet/manifests/site.pp   配置

file   {"/tmp/mysql_test/mysql_test.tgz":    ##将pmaster /tmp/files/mysql_test.tgz文件下发到agent /tmp/mysql_test/目录下
    source =>   "puppet://pmaster.example.com/files/mysql_test.tgz",  
 
}
exec {   "unzip tgz packget":
    command => "tar -xvf   /tmp/mysql_test/mysql_test.tgz",     ###所有命令必须为全路径或者path参数指定命令搜索路径
    path =>   "/usr/bin:/usr/sbin:/bin:/sbin",
    cwd =>   "/tmp/mysql_test"  ##命令执行的路径为: /tmp/mysql_test/
    creates =>   "/etc/my.cnf"  #当/etc/my.cnf不存在的时候,才会执行该命令
    tries => 2,  #重试次数
    try_sleep => 3, #重试间隔 s为单位
 }

结果输出:

64.png

常用参数诠释:

1. command
 
指定要执行的命令。如果忽略,这个参数的值默认为资源的标题。必须填写命令的完整路径或者提供这个命令的查找路径。假如命令执行成功,执行过程的输出将会记录到普通(normal)日志中,但是如果命令执行失败,任何的输出都会记录到错误日志中

2. creates
 
命令创建的一个文件。加入这个参数设置的话,只有这个文件不存在的时候命令才会执行,例子:

3. cwd
 
命令执行的路径。假如目录不存在,命令执行将会失败。

4. environment
 
为命令设置附加的环境变量。加入你用这个参数设置PATH,那么将会把path参数的值覆盖。多个环境变量需要使用数组指定。

5. group
 
执行命令运行的用户组。这个看起来在各个平台运行结果不确定,这是平台的问题不是ruby或者puppet的问题。

6. logoutput
 
是否记录输出信息。默认会根据exec资源的日志等级来记录输出信息,使用on_failure只有当命令执行出错的时候才会记录输出信息。值可以为truefaleson_failure和任何合法的日志等级。

7. onlyif
 
只有onlyif指定命令执行返回为0的时候,命令才会执行

8. path
 
命令执行搜索的路径。如果没有指定path,命令需要填写完整的路径。路径可以指定为一个数组并通过冒号分隔。

9.timeout
 
指定命令运行的最长时间。假如命令执行的时间查过timeout设定的时间,那么就会认为命令执行失败了并且会停止该命令。设置为0表示没有执行时间限制。时间以秒为单位。

10.tries
 
命令执行重试次数,默认为1。设置这个参数命令将会重试你设置的次数直到合理的代码返回。

11.try_sleep
 
设置命令重试的间隔时间,单位是秒。

12.user
 
指定执行命令的用户。
 
备注:加入你使用这个参数,任何错误输出不会在当下扑捉。这是源自ruby内部的一个bug

文档参考:

http://docs.puppetlabs.com/references/latest/type.html#exec

http://www.jbxue.com/

1.    cron 管理

实例:

cron { "sh   /tmp/a.sh":
    command => "/bin/sh   /tmp/a.sh",
    user=> root,
    minute    => '*/3'
    #ensure    => "absent";     ##cron删除
}

结果输出:

65.png

Cron管理常用参数诠释

1.command
 
计划任务执行的命令,最好指定命令的完整路径。

2.ensure
 
定义资源是否存在,也有通过这个参数来删除指定的计划任务。可能的值为presentabsent

3.environment
 
和这个计划任务有关的环境变量,比如设置PAHT,   PATH=/bin:/usr/bin:/usr/sbin

4.hour
 
指定计划任务X小时运行,如果指定话,值的范围必须设置在0-23之间。

5.minute
 
指定计划任务在X分钟运行,如果指定话,值的范围必须设置在0-59之间。

6.month
 
指定计划任务在一年中的X月运行,如果指定话,值的范围必须设置在1-12之间。

7.monthday
 
指定计划任务在一个月的X天运行,如果指定话,值的范围必须设置在1-31之间。

8.name
 
指定计划任务的名字,这个名字只是提供给任命做参考,并且

9.target
 
计划任务的存放位置。

10. user
 
指定执行计划任务中命令的用户。puppet不会去检查用户是否运行执行计划任务,但是这个用户必须允许执行计划任务。默认的用户为运行puppet的用户。

11. weekday
 
指定计划任务在一周的X天运行。如果指定话,值的范围必须设置在0-7之间。注意0是表示星期天。

1.    常用命令归类

puppet genconfig      #查看当前配置

service   puppetmasterd start   #启动puppetmaster

service puppet   start     ##启动客户端

客户端的运行报告在服务器端:/var/lib/puppet/reports/
 
每次运行会生产一个报告,报告文件名为:/var/lib/puppet/reports/hy18.uniqlick.com/201108020948.yaml

Agent  /etc/hosts中添加主机信息

puppetmasterd –genconfig   > puppet.conf

puppet master   –verbose –no-daemon

puppet agent   –server=pmaster –no-daemonize –verbose    ##agent   連接server

使用—waitforcert 參數改變agent等待時間

puppetmasterd   –configprint modulepath  ##打印默认路径

puppet cert –list  ##显示等待签名的服务器

puppet cert   –sign node1.example.com  ##签名

puppert cert –sign   –all #对所有等待的证书进行签名

服务器控制客户端立即运行

puppet kick 

官网不建议使用,只检查客户端返回状态,不检查命令执行结果,且新版本会弃用,这个功能建议puppet加强                    

70.png71.png

1.    配置Agent

/etc/puppet/

puppet.conf:

[agent]
listen = true

72.png

auth.conf   红色部分为新增

path /run
auth any
method save
allow   pmaster.example.com
# this one is   not stricly necessary, but it has the merit
# to show the   default policy which is deny everything else
path /
auth any

2.    demo方式启动agent

service puppet restart    ###启动成功不代表成功了,netstat确认端口被监听,puppet这块功能有待完善

 73.png

3.    Master远程确认8139端口可通,执行puppet kick

74.png

4.    agent确认最终结果

5. 报错参考:

1.连接master的时候出现如下报错:
  dnsdomainname: Unknown host
  解决办法:
  检查机器主机名的设置,以及是否添加进hosts。

2. 连接master的时候出现如下报错:
  err: Could not request certificate: getaddrinfo: Name or service not known
  解决办法:
  服务器端没有配置hosts域名绑定,在hosts中添加。

3.连接master的时候出现如下报错:
  warning: peer certificate won't be verified in this SSL session
  解决办法:
  服务端还没有返回签发证书,使用puppet cert –list查看

4. 连接master的时候出现如下报错:
  err: Could not retrieve catalog from remote server: certificate verify failed
  解决办法:
  客户端和服务器端时间不同步,SSL连接需要依赖主机上的时间是否正确。
  执行更新时间的命令:/sbin/ntpdate asia.pool.ntp.org

class类的尝试

1.    配置主配置文件:

75.png

#   cat site.pp

import  'nodes/nodes.pp'
node default {
file {   "/tmp/linuxlst.txt":
       owner    => root,
       group    => root,
       ensure => present,
    content =>"good morning!\n",
     mode    => 644,
}

#   cat nodes/nodes.pp

node   'node1.example.com' {
    #include test::test
    include mysql::mysql
}

2.    单独配置mysql模块

#查看puppet默认加载的模块目录, —即在这些目录下的配置会被默认加载

76.png

[root@pmaster   puppet]# pwd

/etc/puppet

[root@pmaster   puppet]# tree modules/           ##/etc/puppet/modeles目录下进行本次的类配置

modules/
|-- mysql
|   |-- manifests
|   |     |-- config.pp
|   |     |-- init.pp
|   |     |-- install.pp
|   |     `-- service.pp
|   `-- template
|       `-- my.cnf.erb
`-- test
    `-- manifests
        `-- init.pp

77.png

#   cat modules/mysql/manifests/config.pp   #类似python,*.pp必须和定义的类名保持一致

class mysql::config{
file   {"/tmp/mysql_test/mysql_test.tgz":    ##将pmaster   /tmp/files/mysql_test.tgz文件下发到agent   /tmp/mysql_test/目录下
    source =>   "puppet://pmaster.example.com/files/mysql_test.tgz",  
}
}

#   cat modules/mysql/manifests/install.pp    #类似python,*.pp必须和定义的类名保持一致

class mysql::install{
exec {   "unzip tgz packget":
    command => "tar -xvf   /tmp/mysql_test/mysql_test.tgz",     ###所有命令必须为全路径或者path参数指定命令搜索路径
    path =>   "/usr/bin:/usr/sbin:/bin:/sbin",
    cwd =>   "/tmp/mysql_test",  ##命令执行的路径为: /tmp/mysql_test/
    creates =>   "/etc/my.cnf",  #当/etc/my.cnf不存在的时候,才会执行该命令
    tries => 2,  #重试次数
    try_sleep => 3, #重试间隔 s为单位
}
}

#   cat modules/mysql/manifests/init.pp   #init.pp中定义包涵的所有类

class   mysql::mysql{
    include mysql::install,mysql::config
}

3.    agent上验证结果:

puppetd –test   –server pmaster.example.com

4.    好处:

通过如上方式,一个模块一个目录,干净整洁,且于维护配置,且利于功能模块复用.

5.    示例:

78.png

Ok,截止如上,puppet基本配置大家已经掌握,文章开始的问题大问题在学习的过程中大家可能已经在答案了,部分问题还需要大家自己再摸索.

对于Puppet的个人感觉:

1.       对没有一定基础的同学,入门较难;

2.       因灵活性,扩展性,语言方面限制大企业应用较难,主要针对中小型企业的应用;

3.   在对正确性及灵性要求较高的情况下,puppet适用性会受到质疑;

如上仅代表个人见解,如有不对,请谅解.

有兴趣同学进一步的学习方向

Ø  Puppet Master 负载均衡配置

Ø  精通Class类配置

Ø  Puppet 图形界面dashboard / Foreman的安装配置

Ø  Puppet 内置web界面替换(如用nginx,apache代替)

Ø  Puppet factor 自定义信息收集(需对ruby语言有一定了解)

原创文章,作者:stanley,如若转载,请注明出处:http://www.178linux.com/3987