设为首页 收藏本站
查看: 1007|回复: 0

[经验分享] 自动化运维puppet工具使用

[复制链接]
YunVN网友  发表于 2018-8-2 11:55:23 |阅读模式
  http://puppet.wikidot.com  中文官方文档,有详细的资源介绍,注意看
  1.什么是puppet
  puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
  2.设计架构
  puppet是基于c/s架构的。服务器端保存着所有对客户端服务器的配置代码,在puppet里面叫做manifest.客户端下载manifest之后,可以根据manifest对服务器进行配置,例如软件包管理,用户管理和文件管理等等。
  下图展示了一个典型的 puppet 配置的数据流动情况
DSC0000.jpg

DSC0001.jpg

  如上图所示,puppet的工作流程如下:
  1. 客户端 Puppetd 向 Master 发起认证请求,或使用带签名的证书。
  2. Master 告诉 Client 你是合法的。
  3. 客户端 Puppetd 调用 Facter,Facter 探测出主机的一些变量,例如主机名、内存大小、IP 地址
  等。Puppetd 将这些信息通过 SSL 连接发送到服务器端。
  4. 服务器端的 Puppet Master 检测客户端的主机名,然后找到 manifest 对应的 node 配置,并对该
  部分内容进行解析。Facter 送过来的信息可以作为变量处 理,node 牵涉到的代码才解析,其他
  没牵涉的代码不解析。解析分为几个阶段,首先是语法检查,如果语法错误就报错;如果语法
  没错,就继续解析,解析的结 果生成一个中间的“伪代码”(catelog),然后把伪代码发给客
  户端。
  5. 客户端接收到“伪代码”,并且执行。
  6. 客户端在执行时判断有没有 File 文件,如果有,则向 fileserver 发起请求。
  7. 客户端判断有没有配置 Report,如果已配置,则把执行结果发送给服务器。
  8. 服务器端把客户端的执行结果写入日志,并发送给报告系统。
  puppet工作过程中有两点值得注意,第一,为了保证安全,client和master之间是基于ssl和证书的,只有经master证书认证的client可以与master通信;第二,puppet会让系统保持在你所期望的某种状态并一直维持下去,如检测某个文件并保证其一直存在,保证ssh服务始终开启,如果文件被***了或者ssh服务被关闭了,puppet下次执行时(默认30分钟),会重新创建该文件或者启动ssh服务。
  3.安装配置即使用
  实验环境:rhel6.5
  selinux and iptables disabled
  puppet:
  server端:
  把下面的条目加入yum仓库
[puppet]  name=puppet
  baseurl=http://yum.puppetlabs.com/el/6.5/products/x86_64/
  gpgcheck=0
  [ruby]
  name=ruby
  baseurl=http://yum.puppetlabs.com/el/6.5/dependencies/x86_64/
  gpgcheck=0
  yum仓库中没有包rubygems-1.3.7-1.el6.noarch.rpm,需要自己下载使用yum安装后才能装puppet-server,若是rhel6.2还需要将yum指向6.3或6.4才能安装(因为6.2缺少rubygems依赖包 ruby-rdoc )
  yum install puppet-server -y
  puppet 的第一个执行的代码是在/etc/puppet/manifest/site.pp,因此这个文件必须存在,而
  且其他的代码也要通过该文件来调用。
# touch /etc/puppet/manifest/site.pp  # /etc/init.d/puppetmaster start           #启动 puppet master
# netstat -antlp |grep ruby  
tcp     0      0 0.0.0.0:8140       0.0.0.0:*      LISTEN      52
  
  13142      1645/ruby
  clents端:
  配置yum仓库,安装puppet
  yum install puppet -y
  puppet客户端连接puppet-server
  puppet agent --server rhcs4.com --no-daemonize --verbose
DSC0002.jpg

  client 向 master 发出证书验证请求,然后等待master 签名并返回证书。
  参数--server 指定了需要连接的puppet master 的名字或是地址,默认连接名为“puppet”的主机
  如要修改默认连接主机
可以修改/etc/sysconfig/puppet 文件中的PUPPET_SERVER=puppet 选项
  参数--no-daemonize 是puppet 客户端运行在前台
  参数--verbose 使客户端输出详细的日志
  在server端:
  # puppet cert list                           //显示所有等待签名证书的主机
DSC0003.jpg

  # puppet cert sign rhcs3.com           //签名证书发送给rhcs3.com
DSC0004.jpg

  clients上可看到获取证书成功
DSC0005.jpg

  如要同时签名所有证书,执行以下命令:
  # puppet cert sign --all
  # puppet cert clean desktop2.example.com        //***签名证书
  自动验证:
  在 server 端,编辑 puppet.conf 文件:
  [main]
  autosign = true             //添加行,允许所有客户端的认证
  /etc/puppet 目录下创建 autosign.conf文件,内容如下:
  *.com               //表示允许所有example.com 域的主机

  # service puppetmaster>  在实际中有时会修改 client端的主机名,这样就需要重新生成证书:
  1)在 server 端执行:puppet
cert --clean ty2.org      //你要***的原client 端主机名
  2)在 client 端执行:rm
-fr /var/lib/puppet/ssl/*
  puppet agent --server=puppet.example.com
  puppet 资源定义
  以下资源均定义在/etc/puppet/manifest/site.pp文件中,在没有指定节点的情况下,对所有
  已经经过验证的 client 都生效。
  资源定义
  1、创建文件
node "ty2.org" {                            //必须用双引号  
file { "/tmp/testfile":            //在client上创建/tmp/testfile文件
  
        content => "ty2.org",       //文件内容为ty2.org,多个参数时要用逗号分隔
  mode => 755,                //mode定义文件权限
  
        owner => mysql              //owner定义文件拥有者
  
     }
  
}
  2、软件包
package { "vsftpd":  
           ensure => present     //为present时install;absent为uninstall
  
}
  3、从server端拷贝文件到clients
file { "/etc/vsftpd/vsftpd.conf":  
        source => "puppet:///serverconf/vsftpd.conf",//参数source定义源文件目录位置,此目录必须在fileserver.conf中定义
  
        mode => 600          //权限为600
  
}
vi fileserver.conf     //添加如下行  
  [serverconf]          //puppet:///serverconf必须和[]中名一致
  
  path /etc/puppet/serverconf    //该目录中文件要注意权限,other要有r权限才可以
  
  allow *.org
  4、服务定义
  service { "vsftpd":
  ensure => running         
//参数ensure定义服务running或stoped
  }
  5、添加用户及密码
user { "test":  
        uid => 888,
  
        home => "/home/test",
  
        shell => "/bin/bash",
  
        provider => useradd,     //指定provider,用什么命令来执行用户操作
  
        managehome => true,     //管理用户的时候是否管理用户的home目录,可以设置的值是true,false
  
        ensure => present       //present添加,absent***
  
     }
exec { "echo westos | passwd --stdin test":    //让puppet执行外部命令  
        path => "/usr/bin:/usr/sbin:/bin",       //指定命令的路径
  
        onlyif => "id test"      //如果这个参数被设定了,则exec只会在onlyif设定的命令返回0时才执行
  
     }
  6、文件系统挂载(挂载nfs)
file { "/public":                     //先创建挂载目录  
        ensure => directory
  
     }
  
mount { "/public":
  
        device => "192.168.1.21:/mnt",
  
        fstype => "nfs",
  
        options => "defaults",
  
        ensure => mounted           //mounted挂载;unmounted卸载
  
      }
  7. crontab 任务
cron { echo:  
       command => "/bin/echo `/bin/date` >> /tmp/echo",
  
       user => root,
  
       hour => ['2-4'],
  
       minute => '*/10'
  
    }
  # 任务会在 client上/var/spool/cron 目录中生成。
  ----------------------------------------------
  使用puppet安装apache服务和nginx源码
  使用模块配置
  cd /etc/puppet/modules/
  mkdir httpd                //创建要安装服务的模块目录
  cd httpd/
  mkdir files  manifests  templates
  touch init.pp              //调用下边三个,使结构更加清晰
  touch install.pp  config.pp  service.pp
  vi install.pp
  class httpd::install {
  package { "httpd":
  ensure => present
  }
  }
  vi config.pp
  class httpd::config {
  file { "/etc/httpd/conf/httpd.conf":
  ensure => present,
  source => "puppet:///modules/httpd/httpd.conf",

  require =>>
  notify =>>  }
  }
  vi service.pp
  class httpd::service {
  service { "httpd":
  ensure => stopped,
  require =>
Class["httpd::install","httpd::config"]
  }
  }
  vi init.pp
  class httpd {
  include httpd::install,httpd::config,httpd::service
  }
  ls files/                  //将设置好的服务配置文件放在此目录,可以同步到clients
  httpd.conf
  cd /etc/puppet/manifests
  touch nodes.pp                //将节点分开定义
  vi nodes.pp
  node "ty2.org" {
  include httpd
  }
  vi site.pp                  
//系统默认调用site.pp,使用其再调用nodes.pp,也可以将nodes.pp中内容直接写入site.pp,但这样不容易查看排错
  import "nodes.pp"
  /etc/init.d/puppetmaster start         //启动,默认端口8140
  现在就可以在clients端测试了:
  puppet agent --server ty1.org --no-daemonize --verbose
  安装nginx源码包:
  cd /etc/puppet/modules
  mkdir nginx                //创建要安装服务的模块目录
  cd nginx/
  mkdir files  manifests  templates
  touch init.pp              //调用下边三个,使结构更加清晰
  touch install.pp  config.pp  service.pp
  vi install.pp
  class nginx::install {
  package { ["openssl-devel","pcre-devel","zlib-devel"]:
  ensure => present
  }
  file { "/tmp/nginx-1.4.2.tar.gz":
  ensure => present,
  source =>
"puppet:///modules/nginx/nginx-1.4.2.tar.gz"
  }
  file { "/tmp/nginx_install.sh":
  ensure => present,
  source =>
"puppet:///modules/nginx/nginx_install.sh",
  mode => 755
  }
  exec { "/tmp/nginx_install.sh":
  path => "/bin:/usr/bin:/usr/sbin",           //指定命令的路径
  unless => ["test -x /etc/init.d/nginx"],       //unless设定的命令执行失败才执行exec参数
  require => File["/tmp/nginx_install.sh"]     //约束,有此文件时再执行
  }
  }
  vi config.pp
  class nginx::config {
  file { "/usr/local/nginx/conf/nginx.conf":
  ensure => present,
  source => "puppet:///modules/nginx/nginx.conf",

  require =>>
  notify =>>  }
  file { "/etc/init.d/nginx":
  source => "puppet:///modules/nginx/nginx",
  mode => 755,
  ensure => present,
  owner => "root",
  require =>
File["/usr/local/nginx/conf/nginx.conf"]
  }
  }
  vi service.pp
  class nginx::service {
  service { "nginx":
  ensure => running,
  require =>
Class["nginx::install","nginx::config"]
  }
  }
  /etc/init.d/puppetmaster restart
  clients推送:
  puppet agent --server ty1.org --no-daemonize --verbose
  --------------------------
  Puppet dashboard 安装 (用以web 方式管理 puppet)
  puppet dashboard是GUI(图形用户界面)方式管理puppet,可以查看puppet运行日志;是一个Ruby on Rails程序,用于显示Puppet master和agent的相关信息。它允许你查看从一个或多个Puppet
master汇总的图形和报告数据。它同时从一个或者多个Puppet master上收集来自于Puppet
agent的资产数据(主机的Fact和其他信息)。最后,它能作为一个ENC来配置Puppet节点,并指定这些节点上的类和参数。
  依赖性:
  * Ruby 1.8.7
  * Rubygems
  * Rake >= 0.8.3
  * mysql-server 5.x
  * Ruby-mysql bindings 2.7.x or 2.8.x
  # rpm -ivh rubygem-rake-0.8.7-2.1.el6.noarch.rpm
  # yum install puppet-dashboard ruby-mysql mysql mysql-server -y
  # cd /usr/share/puppet-dashboard/
  # vi config/database.yml
  #只留下生产环境配置
  production:
  database: dashboard_production
  username: dashboard
  password: linux
  encoding: utf8
  adapter: mysql
  配置数据库:
  #/etc/init.d/mysqld start
  #vi test.sql         //创建dashboard_production库、用户,并做授权
  CREATE DATABASE dashboard_production CHARACTER SET utf8;

  CREATE USER 'dashboard'@'localhost'>  GRANT ALL PRIVILEGES ON dashboard_production.* TO
'dashboard'@'localhost';
  #mysql < test.sql
  puppet-dashboard 默认时区不正确,需要修改:
  #rake time:zones:local                      //可以使用此命令获取时区
  #vi /usr/share/puppet-dashboard/config/settings.yml
  time_zone: 'Beijing'
  #rake gems:refresh_specs                       //修改完后需要执行此命令
  #cd /usr/share/puppet-dashboard/config
  #rake RAILS_ENV=production db:migrate            
//创建dashboard所需的表
  启动服务:
[root@ty1 config]# /etc/init.d/puppet-dashboard start  
Starting Puppet Dashboard: => Booting WEBrick
  
=> Rails 2.3.17 application starting on http://0.0.0.0:3000 [  OK ]
  
#chmod 666 log/production.log
  
[root@ty1 puppet-dashboard]# /etc/init.d/puppet-dashboard-workers
  
start
  
Starting puppet-dashboard-workers:                         [  OK ]
  实时报告汇总
  设置server端:
  #vi /etc/puppet/puppet.conf
  [main]
  reports = http
  reporturl = http://192.168.1.21:3000/reports
  设置client端
  # vi /etc/puppet/puppet.conf
  [agent]
  report = true
  #puppet agent --server ty1.org --no-daemonize –verbose      
//验证
  现在就可以使用web访问192.168.1.21:3000查看效果了
  搭建过程中出现的问题:
  1.Could not run: Could not create PID file: /var/lib/puppet/run/master.pid
  # ps -aux | grep puppet
  应该能看到相应的进程。因为使用自动验证时,直接使用puppet agent启动,即以daemon方式启动;
  如果以 daemonize 的方式启动,不能再以 no-daemonize 的方式启动了,杀死该进程重启即可。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-545334-1-1.html 上篇帖子: puppet的认识 下篇帖子: Centos 6.5 X86_64 puppet 安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表