前言
随着IT行业的快速发展,传统的运维方式依赖大量的人力,使得运维人员很难自动处理大量重复繁琐的工作。前期我们介绍了运维自动化工具ansible的简单应用。本期带来了运维自动化神器puppet,实现基于主/代理模式的LNMP平台部署。
木偶
简介
Puppet是一个基于ruby语言开发的用于Linux、Unix和Windows平台的集中式配置管理系统。它可以以C/S模式运行,也可以独立运行,使用自己的Puppet描述语言管理配置文件、用户、cron任务、软件包、系统服务等。
工作流
①代理向主机发起认证请求。
②②主终端验证其合法性并允许其连接。
③代理发送本地变量(主机名、内存大小、IP地址等。)通过SSL连接来掌握。
④Master检测代理的主机名,然后找到manifest对应的节点配置,分析这部分内容。解析结果以生成“伪代码”(catelog)并发送给代理。
⑤代理收到“伪代码”并开始执行。
⑥执行时,判断是否有文件File,如果有,向文件服务器发起请求。
⑦判断是否配置了报表,如果配置了报表,则将执行结果发送给服务器。
执行结束,检查系统状态。
实施过程
实验拓扑
傀儡师配置
安装所需的软件包
创建模块目录
[root@node1 ~]# cd /etc/puppet/modules/ [root@node1 modules]# mkdir nginx/{files,manifests} php/{files,manifests} mysql/{files,manifests} -pv准备每个服务配置文件。
[root@node1 modules]# cp /root/files/nginx.conf nginx/files/ [root@node1 modules]# cp /root/files/www.conf php/files/ [root@node1 modules]# cp /root/files/my.cnf mysql/files/创建每个模块
[root@node1 modules]# vim nginx/manifests/init.pp class nginx { package{'nginx': ensure => present, name => nginx, } file{'nginx.conf': ensure => file, source => 'puppet:///modules/nginx/nginx.conf', path => '/etc/nginx/nginx.conf', require => Package['nginx'], } service{'nginx': ensure => true, enable => true, subscribe => File['nginx.conf'], } } [root@node1 modules]# vim php/manifests/init.pp class php { package{'php-fpm': ensure => present, name => php-fpm, } file{'www.conf': ensure => file, source => 'puppet:///modules/php/www.conf', path => '/etc/php-fpm.d/www.conf', require => Package['php-fpm'], } service{'php-fpm': ensure => true, enable => true, subscribe => File['www.conf'], } } [root@node1 modules]# vim mysql/manifests/init.pp class mysql { package{'mysql-server': ensure => present, name => 'mysql-server', } file{'my.cnf',: ensure => file, source => 'puppet:///modules/mysql/my.cnf', path => '/etc/my.cnf', require => Package['mysql-server'], } service{'mysqld': ensure => true, enable => true, subscribe => File['my.cnf'], } } [root@node1 modules]# cd ../manifests/ [root@node1 manifests]# mkdir server [root@node1 manifests]# vim server/node3.pp node 'node3.scholar.com' { include mysql } [root@node1 manifests]# vim server/node4.pp node 'node4.scholar.com' { include nginx,php } [root@node1 manifests]# vim site.pp import "server/*.pp"上述资源的详细说明
#package详解 ensure:程序包目标状态,{present(installed)|absent|purged|held|latest} name:资源名称,即软件包名字,可省略,如果省略,将继承title的值 provide:软件包管理器,会自动识别 source:程序包文件路径 install_options:安装选项,最常用的是通过INATALLDIR来制定安装目录 #file详解 ensuce:目标状态,{present|absent|directory|file|link} backup:通过filebacket资源来备份文件,值通常为filebucket资源的名称 content:文件内容,生成方式有三种(content,source,target),三者彼此互斥 source:通过制定的url下载文件至本地,格式:puppet:///modules/MODULE_NAME/file_name target:为符号链接指定目标 links:文件为符号连接,{follow|manage} path:文件路径,必须使用双引号 mode:定义权限,通常为8进制数字 owner: 定义文件的属主 group:定义文件的属组 force:强制执行删除文件、链接或目录,仅用于ensure为absent时 purge:清除指定目录中存在的,但未在资源中定义的文件 resurce:目录递归,{true|false|inf|remote} replace:替换,本地存在的文件与资源中指定的文件内容不同时是否执行替换,默认为否 #service详解 ensure:服务目标状态,{ true(running)|false(stopped)} enable:是否开机自动启动,{true|false} name:服务名称,可以省略,如果省略,将继承title的值 path:服务脚本路径,默认为/etc/init.d/ start:是否启动服务 stop:是否关闭服务 restart:是否重启服务 status:判断服务是否运行 #特殊属性 require:需要依赖于某个资源 before:应该先执行本资源,在执行别的资源 notify: 将当前资源的变动信息通知给别的资源 subscribe:订阅某资源变动信息 -> :后资源需要依赖前资源 ~> :前资源变动通知后资源调用启动服务
当puppet-server守护进程第一次启动时,它会自动初始化运行环境,比如在服务器端创建一个本地CA和相关的证书和密钥。初始化之后,puppet将监听指定的套接字,并等待来自客户机的连接请求。默认情况下,其证书和密钥文件位于/var/lib/puppet/ssl/目录中。
出于调试的目的,puppet服务进程可以以非守护进程的方式首次启动,它可以输出详细的信息,以便观察初始化过程。下面展示的是创建本地CA,作为puppetserver的本地主机向CA申请证书,获取证书,去除CA的证书签名请求等过程。,然后启动服务进程,准备接受各个代理的连接请求。您还可以通过对以下命令使用-debug选项来获得更详细的输出信息。
如果上面的测试启动没有问题,就可以停止当前的启动,正式启动服务。
[root@node1 manifests]# service puppetmaster start Starting puppetmaster: [ OK ] [root@node1 manifests]# ss -tnlp | grep puppet LISTEN 0 5 *:8140 *:* users:(("puppetmasterd",3186,5))傀儡代理配置
安装所需的软件包
指定傀儡服务器
[root@node3 ~]# vim /etc/puppet/puppet.conf #也可手动命令指定 [agent] server = node1.scholar.com在启动服务之前,请检查是否安装了每个代理所需的软件。
[root@node3 ~]# rpm -q mysql-server package mysql-server is not installed [root@node4 ~]# rpm -q ngnix package ngnix is not installed [root@node4 ~]# rpm -q php-fpm package php-fpm is not installed启动服务
当puppet代理第一次启动时,它将从为它指定的puppet服务器申请一个证书,并完成后续的连接请求。出于同样的原因,出于测试的目的,可以通过非守护进程的方式访问当前puppet集群中的第一个代理节点,以观察其初始化过程。
#所有agent端都执行以上系列 *** 作此时,在puppet服务器端使用puppetcert命令来管理客户端的证书请求,其-list选项可以查看等待签署证书的客户端列表,而-sign选项可以用于签署指定节点的证书。如果希望一次为多个节点签署证书请求,可以同时使用-all选项
正式开始服务
[root@node3 ~]# service puppet start Starting puppet: [ OK ] [root@node4 ~]# service puppet start Starting puppet: [ OK ]再次检查每个代理软件的状态。
[root@node3 ~]# rpm -q mysql-server mysql-server-5.1.73-5.el6_6.x86_64 [root@node3 ~]# service mysqld status mysqld (pid 4526) is running... [root@node3 ~]# chkconfig --list mysqld mysqld 0:off1:off2:on3:on4:on5:on6:off [root@node4 ~]# rpm -q nginx nginx-1.0.15-11.el6.x86_64 [root@node4 ~]# service nginx status nginx (pid 6678) is running... [root@node4 ~]# chkconfig --list nginx nginx 0:off1:off2:on3:on4:on5:on6:off [root@node4 ~]# rpm -q php-fpm php-fpm-5.3.3-46.el6_6.x86_64 [root@node4 ~]# service php-fpm status php-fpm (pid 6309) is running... [root@node4 ~]# chkconfig --list php-fpm php-fpm 0:off1:off2:on3:on4:on5:on6:off服务已如期启动,Puppet基于主/代理模式成功部署LNMP平台。
木偶踢
默认情况下,我们每30分钟与主代理通信一次。如果在此期间某项服务出现bug或配置错误,如何实现紧急推送,将业务损失降到最低?下面简单说一下木偶踢腿功能的实现。
傀儡代理配置
木偶大师推
[root@node1 ~]# puppet kick -p 10 --host node3.scholar.com Triggering node3.scholar.com Getting status status is success node3.scholar.com finished with exit code 0 Finished推送成功,实现了木偶踢腿功能。至此,Puppet基于主/代理模式的LNMP平台部署实验已经完成
结尾
Puppet的基础应用就这些了。Puppet是强大的,从管理规模上和Ansible相比,Puppet还是略胜一筹的。以上只是小试牛刀,有兴趣的朋友可以深入研究一下,部署时遇到问题可以留言交流。以上仅供个人学习。如有错漏,请勿喷~~~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)