ny3259 发表于 2018-8-2 07:24:54

集中管理系统--puppet

  puppet 是一种Linux、Unix、Windows平台的集中配置管理系统,运维人员或者系统管理员可以通过使用 puppet 来处理所有的管理细节,是自动化运维的工具。
  puppet是为了让系统管理员可以相互交流和共享成熟的工具,避免重复的劳动.通过以下两个特性来实现这一目标:
  1.提供一个简洁的但是强大的框架来完成系统管理任务
  2.系统管理任务可以描述成puppet语言,因此可以相互分享代码,就像分享其他语言的代码一样,比如python, c等
  因此,作为系统管理员的你可以更快的完成工作,因为你可以用puppet来处理所有的管理细节. 甚至你还可以下载其他管理员的puppet代码来让你的工作完成的更快.
  puppet 是一个 C/S 结构, 当然,这里的 C 可以有很多,因此,也可以说是一个星型结构. 所有的 puppet 客户端同一个服务器端的 puppet 通讯. 每个puppet 客户端每半小时(可以设置)连接一次服务器端, 服务器端保存着所有对客户端服务器的配置代码,在puppet里面叫做manifest. 客户端下载manifest之后,可以根据manifest对服务器进行配置,例如软件包管理,用户管理和文件管理等等。
  puppet的工作流程如下:
  (1)客户端puppetd调用facter,facter探测出主机的一些变量,例如主机名,内存大小,ip地址等。pupppetd 把这些信息通过ssl连接发送到服务器端;
  (2)服务器端的puppetmaster 检测客户端的主机名,然后找到manifest里面对应的node配置, 并对该部分内容进行解析,facter送过来的信息可以作为变量处理,node牵涉到的代码才解析,其他没牵涉的代码不解析。解析分为几个阶段,语法检查,如果语法错误就报错。如果语法没错,就继续解析,解析的结果生成一个中间的“伪代码”,然后把伪代码发给客户端;
  (3)客户端接收到“伪代码”,并且执行,客户端把执行结果发送给服务器;
  (4)服务器端把客户端的执行结果写入日志。
  puppet工作过程中有两点值得注意,第一,为了保证安全,client和master之间是基于ssl和证书的,只有经master证书认证的client可以与master通信;第二,puppet会让系统保持在你所期望的某种状态并一直维持下去,如检测某个文件并保证其一直存在,保证ssh服务始终开启,如果文件被删除了或者ssh服务被关闭了,puppet下次执行时(默认30分钟),会重新创建该文件或者启动ssh服务。
  实验环境:rhel6.5,server4为主机,server5,server6为从机,各机hostname相互解析且时间同步。
  安装
  server4
  #yum install -y puppet-server puppet facter hiera rubygem-json ruby-shadow ruby-augeas rubygems openssl
  从机上
  #yum install -y puppet facter hiera rubygem-json ruby-shadow ruby-augeas rubygems openssl
  server4
  /etc/puppet 配置目录:
  组织结构如下:
  |-- puppet.conf #主配置配置文件,详细内容可执行 puppet --genconfig
  |-- fileserver.conf #文件服务器配置文件
  |-- auth.conf #认证配置文件
  |-- autosign.conf #自动验证配置文件
  |-- tagmail.conf #邮件配置文件(将错误信息发送)
  |-- manifests #文件存储目录(puppet 会先读取该目录的.PP 文件<site.pp>)
  #touch /etc/puppet/manifest/site.pp   //没有此文件 puppet master 无法启动,配置后面再定义
  #/etc/init.d/puppetmaster start
  #puppet cert list --all

  server6
  #/etc/init.d/puppet start
  #puppet agent --server server4.example.com --no-daemonize -vt
  //client 向 master 发出证书验证请求,然后等待 master 签名并返回证书。
  参数--server 指定了需要连接的 puppet master 的名字或是地址,默认连接名为“puppet”的主机
  如要修改默认连接主机可以修改/etc/sysconfig/puppet 文件中的 PUPPET_SERVER=puppet 选项
  参数--no-daemonize 是 puppet 客户端运行在前台
  参数--vtv指verbose使客户端输出详细的日志 t指test测试

  提示没有证书。需要在master上注册证书
  server4上
  #puppet cert sign server6.example.com
  server6
  #puppet agent --server server4.example.com --no-daemonize -vt

  证书连接成功
  开启自动验证
  server4上
  #vim /etc/puppet/puppet.conf
  在下添加
  autosign=true   //允许所有客户端的认证
  #cd /etc/puppet
  #vim autosign.conf
  *.example.com   //允许所有 example.com 域的主机
  #/etc/init.d/puppetmaster reload
  server5
  #puppet agent --server server4.example.com --no-daemonize -vt

  自动注册成功
  server4上
  #puppet cert list --all

  在实际中有时会修改 client 端的主机名,这样就需要重新生成证书
  清除server从机的证书
  server4上
  #puppet cert clean server6.example.com    //清除server6的证书
  server6上
  #rm -fr cd /var/lib/puppet/ssl/*
  puppet 资源定义
  server4上,
  #cd /etc/puppet/manifests
  #vim site.pp
  file {
  '/tmp/testfile':
  content => 'www.westos.org'
  }
  server5
  #puppet agent --server server4.example.com --no-daemonize -vt
  #cat /tmp/testfile

  server4
  还可在site.pp中添加
  mode => 600表示文件为600权限,
  owner => puppet 所有者为puppet,
  group => puppet 所有组为puppet
  #cd /etc/puppet
  #mkdir files
  #vim fileserver.conf//文件服务器配置文件
  在最后添加
  path /etc/puppet/files       //定义pp文件中files路径
  allow *.example.com   //允许所有 example.com 域的主机
  #/etc/init.d/puppetmaster reload
  #vim /etc/puppet/manifests/site.pp
  添加
  file {
  '/tmp/passwd':
  source => 'puppet:///files/passwd'
  }
  package {
  'httpd':
  ensure => present    //软件包定义
  }
  service {
  'httpd':
  ensure => running,      //服务定义
  require => Package ['httpd']   //启动依赖Package模块,定义启动的先后顺序
  }
  更改pp文件无需reload puppetmaster服务。
  server5
  #puppet agent --server server4.example.com --no-daemonize -vt

  可看到httpd以安装,启动。/tmp/passwd文件以创建
  server4中site.pp
  添加
  user {
  'test':
  uid => 900,
  home => "/home/test",
  shell => "/bin/bash",
  provider => useradd,
  managehome => true,
  ensure => present         //添加用户
  }
  exec {
  'echo westos | passwd --stdin test':
  path => "/usr/bin:/bin",    //定义动作,给test用户添加密码
  onlyif => 'id test'         //当test存在时模块exec才生效
  }
  server6
  #puppet agent --server server4.example.com --no-daemonize -vt

  文件系统挂载
  在site.pp上
  file {
  "/public":
  ensure => directory
  }
  mount {
  "/public":
  device => "172.25.0.251:/var/ftp/pub",
  fstype => "nfs",
  options => "defaults",
  ensure => mounted   //自动挂载文件系统,并同步 fstab 文件,如果需要卸载,改为 absent
  }
  package {
  "nfs-utils","httpd":
  ensure => present
  }
  真机(ip:172.25.0.251)上
  #yum install -y nfs-utils
  #/etc/init.d/nfs start
  server6上
  #puppet agent --server server4.example.com --no-daemonize -vt
  #cat /etc/fstab

  crontab 任务
  在site.pp上
  cron { echo:
  command => "/bin/echo `/bin/date` >> /tmp/echo",
  user => root,
  hour => ['2-4'],
  minute => '*/10'
  }
  任务会在 client 上/var/spool/cron 目录中生成。
  server6

  添加vsftpd模块
  server4
  #mkdir /etc/puppet/modules/vsftpd
  #cd /etc/puppet/modules/vsftpd
  #mkdir manifests
  #mkdir files
  #cd files
  #yum install vsftpd
  #cp /etc/vsftpd/vsftpd.conf.
  #chmod 644 vsftpd.conf
  #cd ../manifests
  #touch install.pp config.pp service.pp init.pp
  结构:

  #vim init.pp
  class vsftpd {
  include vsftpd::install,vsftpd::config,vsftpd::service
  }
  #vim install.pp
  class vsftpd::install {
  package {
  'vsftpd':
  ensure => present
  }
  }
  #vim config.pp
  class vsftpd::config {
  file {
  ‘/etc/vsftpd/vsftpd.conf’:
  source => ‘puppet:///modules/vsftpd/vsftpd.conf’,    //实际路径在/etc/puppet/modules/vsftpd/files/vsftpd.conf
  mode => 600,
  require => Class[‘vsftpd::install’],
  notify => Class[‘vsftpd::service’]
  }
  }
  #vim vsftpd::service {
  service {
  ‘vsftpd’:
  ensure => runnig,
  require => Class[‘vsftpd::install’,’vsftpd::config’]
  }
  }
  #cd /etc/puppet/manifest
  #mkdir nodes
  #vim nodes/server5.pp    //nodes目录下可以创建多个节点文件
  node 'server5.example.com {
  include vsftpd
  package {
  'httpd':
  ensure => present
  }
  service {
  'httpd':
  ensure => stopped,
  require => Package['httpd']
  }
  }
  #vim site.pp
  改成如下
  import 'nodes/*.pp'   //包含nodes/下的pp文件
  file {
  '/tmp/testfile':
  content => 'www.westos.org',
  mode => 600,
  owner => puppet,
  group => puppet
  }

  #service puppetmaster>  server5
  #puppet agent --server server4.example.com --no-daemonize -vt

  显示vsftpd启动成功
  添加appache模块
  server4
  #cd modules
  #cp vsftpd httpd
  #cd httpd/files
  #cp /etc/httpd/conf/httpd.conf .
  #rm -fr vsftpd.conf
  #cd ../manifests
  在 init.pp,service.pp,config,install.pp中
  将vsftpd换成httpd
  #mkdir ../templates//用于存放模版应用
  #vim /etc/puppet/modules/httpd/templates/httpd_vhost.erb   //添加模版,必须以*.erb结尾,这里添加的是httpd的虚拟主机模版
  <VirtualHost *:80>
  ServerName <%= domainname %>
  DocumentRoot /var/www/<%= domainname %>
  ErrorLog logs/<%= domainname %>_error.log
  CustomLog logs/<%= domainname %>_access.log common
  </VirtualHost>
  #cd /etc/puppet/manifests/
  #vim init.pp
  define httpd::vhost($domainname) {
  file { "/etc/httpd/conf.d/${domainname}_vhost.conf":
  content => template("httpd/httpd_vhost.erb"),
  require => Class["httpd::install"],
  notify => Class["httpd::service"]
  }
  file { "/var/www/$domainname":
  ensure => directory
  }
  file { "/var/www/$domainname/index.html":
  content => $domainname
  }
  }
  #vim /etc/puppet/manifests/nodes/server5.pp
  node ‘server5.example.com’{
  include vsftpd,httpd
  httpd::vhost {
  ‘www.example.com’:
  domainname => “www.example.com”,
  }
  }
  #vim /etc/puppet/module/httpd/files/httpd.conf
  将最后几行修改为
  <VirtualHost *:80>
  DocumentRoot /var/www/html
  ServerName server5.example.com
  </VirtualHost>
  server5
  #puppet agent --server server4.example.com --no-daemonize -vt

  显示httpd启动
  真机(浏览器使用的是真机)添加解析
  172.25.0.4www.example.com
页: [1]
查看完整版本: 集中管理系统--puppet