编程语言的Puppet 该怎么搭建与部署?

    作者:课课家教育更新于: 2019-09-06 14:52:36

    大神带你学编程,欢迎选课

    Puppet 搭建与部署,看这一篇就够了。java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java要求显式的方法声明,它不支持C风格的隐式声明。这些严格的要求保证编译程序能捕捉调用错误,这就导致更可靠的程序。

    让管理员只集中于要管理的目标,而忽视实现的细节。puppet既可以在单机上使用,也可以以C/S结构使用。在大规模使用puppet的情况下,通常使用C/S结构,在这种结构中puppet客户端只运行puppetclient,Puppet服务端只运行puppetmaster。

    编程语言的Puppet 该怎么搭建与部署_编程语言_Java_Javascript_课课家

    Puppet工作原理

    让管理员只集中于要管理的目标,而忽视实现的细节。puppet既可以在单机上使用,也可以以C/S结构使用。在大规模使用puppet的情况下,通常使用C/S结构,在这种结构中puppet客户端只运行puppetclient,Puppet服务端只运行puppetmaster。具体的工作流程如图所示:

    环境

    使用四台服务器模拟搭建puppet环境,拓扑图如下所示:

    环境表

    实验步骤

    1.搭建Puppet Master

    (1)规划三台服务器主机名

    1. [root@localhost ~]# vim /etc/hostname 
    2. master.test.cn 
    3. [root@localhost ~]# vim /etc/hosts 
    4. 192.168.126.138 master.test.cn 
    5. 192.168.126.148 client01.test.cn 
    6. 192.168.126.158 client02.test.cn 

    (2)服务器时间同步

    由于puppet需要使用SSL证书,依赖时间同步,所以需要搭建NTP服务器

    1)搭建NTP Server

    1. [root@localhost ~]# yum install ntp -y 
    2. [root@localhost ~]# vim /etc/ntp.conf 
    3.  
    4. 添加以下两行:server 127.127.1.0           #指定本地作为时间源服务器 
    5. fudge 127.127.1.0 stratum 8 

    其作用是当 /etc/ntp.conf 中定义的server都不可用时,将使用local时间作为NTP服务提供给NTP客户端。

    2)启动ntp服务并设置开机自启动

    1. [root@localhost ~]# systemctl stop firewalld.service 
    2. [root@localhost ~]# systemctl disable firewalld.service 
    3. [root@localhost ~]# setenforce 0 
    4. [root@localhost ~]# systemctl start ntpd.service 
    5. [root@localhost ~]# systemctl enable ntpd.service 
    6. [root@localhost ~]# ntpstat    #同步 
    7. synchronised to NTP server (193.228.143.13) at stratum 3 
    8.    time correct to within 517 ms 
    9.    polling server every 64 s 

    3)puppetmaster作为NTP客户端的配置

    1. [root@master ~]# yum install ntpdate -y 
    2. [root@master ~]# ntpdate 192.168.126.159 
    3.  6 Aug 09:45:03 ntpdate[3488]: adjust time server 192.168.126.159 offset -0.072288 sec    #调整时间服务器192.168.126.159偏移-0.072288秒 

    4)配置YUM源

    1. [root@master ~]# yum install epel-release -y 
    2.  
    3. [root@master ~]# yum install puppet-server -y   #安装puppet服务端 

    5)启动puppet主程序

    1. [root@master ~]# systemctl stop firewalld.service 
    2. [root@master ~]# systemctl disable firewalld.service 
    3. [root@master ~]# setenforce 0 
    4. [root@master ~]# systemctl start puppetmaster.service 
    5. [root@master ~]# systemctl enable puppetmaster.service 

    2.搭建puppetclient(两台客户端配置一样)

    1)通过域名ping通puppetmaster

    1. [root@client01 ~]# ping master.test.cn 
    2. PING master.test.cn (192.168.126.138) 56(84) bytes of data. 
    3. 64 bytes from master.test.cn (192.168.126.138): icmp_seq=1 ttl=64 time=1.06 ms 
    4. 64 bytes from master.test.cn (192.168.126.138): icmp_seq=2 ttl=64 time=3.27 ms 
    5. 64 bytes from master.test.cn (192.168.126.138): icmp_seq=3 ttl=64 time=0.382 ms 
    6. 64 bytes from master.test.cn (192.168.126.138): icmp_seq=4 ttl=64 time=0.660 ms 

    2)服务器时间同步

    1. [root@client01 ~]# yum install ntpdate -y 
    2. [root@client01 ~]# vim /etc/ntp.conf 
    3. server 127.127.1.0           #指定本地作为时间源服务器 
    4. fudge 127.127.1.0 stratum 8 
    5.  
    6. [root@client01 ~]# ntpdate 192.168.126.159 
    7.  6 Aug 10:01:12 ntpdate[3303]: adjust time server 192.168.126.159 offset -0.012348 sec 

    3)配置YUM源

    1. [root@client01 ~]# yum install epel-release -y 
    2.  
    3. [root@client01 ~]# yum install puppet -y    #安装puppet客户端 

    4)修改puppet的配置文件/etc/puppet/puppet.conf

    1. [root@client01 ~]# vim /etc/puppet/puppet.conf 
    2. [main] 
    3.     # The Puppet log directory. 
    4.     # The default value is '$vardir/log'
    5.     logdir = /var/log/puppet 
    6.  
    7.     # Where Puppet PID files are kept. 
    8.     # The default value is '$vardir/run'
    9.     rundir = /var/run/puppet 
    10.  
    11.     # Where SSL certificates are kept. 
    12.     # The default value is '$confdir/ssl'
    13.     ssldir = $vardir/ssl 
    14.     server = master.test.cn    #添加puppet master的地址 

    5)分别在puppetclient01和puppetclient01上进行注册

    1. [root@client01 ~]# puppet agent --server=master.test.cn --no-daemonize --verbose 
    2. Info: Creating a new SSL key for client01.test.cn 
    3. Info: Caching certificate for ca 
    4. Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml 
    5. Info: Creating a new SSL certificate request for client01.test.cn 
    6. Info: Certificate Request fingerprint (SHA256): C1:1F:11:32:53:96:AA:91:16:9F:CE:F2:AD:D2:3F:56:C7:9B:D9:87:5C:F8:2D:30:7D:FE:49:66:46:2A:D9:FC 
    7. Info: Caching certificate for ca 

    6)查看申请注册的客户端

    1. [root@master ~]# puppet cert --list 
    2.   "client01.test.cn" (SHA256) C1:1F:11:32:53:96:AA:91:16:9F:CE:F2:AD:D2:3F:56:C7:9B:D9:87:5C:F8:2D:30:7D:FE:49:66:46:2A:D9:FC 
    3.   "client02.test.cn" (SHA256) 7C:C9:22:59:B2:1E:2B:F5:12:30:4D:88:D9:B1:AF:60:FE:02:65:7 

    7)对未注册的客户端进行注册

    1. [root@master ~]# puppet cert sign --all 
    2. Notice: Signed certificate request for client01.test.cn 
    3. Notice: Removing file Puppet::SSL::CertificateRequest client01.test.cn at '/var/lib/puppet/ssl/ca/requests/client01.test.cn.pem' 
    4. Notice: Signed certificate request for client02.test.cn 
    5. Notice: Removing file Puppet::SSL::CertificateRequest client02.test.cn at '/var/lib/puppet/ssl/ca/requests/client02.test.cn.pem' 

    8)查看已经注册的客户端

    1. [root@master ~]# ll /var/lib/puppet/ssl/ca/signed/ 
    2. 总用量 12 
    3. -rw-r--r--. 1 puppet puppet 1952 8月   6 21:22 client01.test.cn.pem 
    4. -rw-r--r--. 1 puppet puppet 1952 8月   6 21:22 client02.test.cn.pem 
    5. -rw-r--r--. 1 puppet puppet 2021 8月   6 21:06 master.test.cn.pem 

    此时客户端已经完成证书的请求与签名。

    配置实例

    • 这里为了保护Linux的ssh端口,修改客户端client1的sshd端口,将端口22修改为9922,并实 现重启工作。
    • 首先创建ssh模块,ssh模块下面有三个文件:manifests,templates和files。
    • 在manifests里面包含一个init.pp文件,这是该模块的初始入口文件,导入模块时,会从init.pp开始执行。可以把所有的代码都写到init.pp里面,也可以分成多个pp文件,init再去包含其他文件。定义class类名的时候必须是ssh,这样才能实现调用。
    • file目录是该模块的文件发布目录,Puppet提供一个文件分发机制,类似于rsync的模块。
    • templates目录包含erb模型文件,这个和file资源的template属性相关,不过很少用。具体配置如下:

    1)创建必要的目录:

    1. [root@master ~]# cd /etc/puppet/ 
    2. [root@master puppet]# mkdir -p modules/ssh/{manifests,templates,files} 
    3. [root@master puppet]# mkdir manifests/nodes 
    4. [root@master puppet]# mkdir modules/ssh/files/ssh 
    5. [root@master puppet]# chown -R puppet modules/   #修改权限 

    2)查看/etc/puppet/modules/ssh目录下的结构

    1. [root@master puppet]# ll modules/ssh/ 
    2. 总用量 0 
    3. drwxr-xr-x. 3 puppet root 17 8月   6 21:32 files 
    4. drwxr-xr-x. 2 puppet root  6 8月   6 21:31 manifests 
    5. drwxr-xr-x. 2 puppet root  6 8月   6 21:31 templates 

    3)创建模块配置文件install.pp

    1. [root@master puppet]# vim /etc/puppet/modules/ssh/manifests/install.pp 
    2. 输入以下信息(首先确定客户端已安装ssh服务):class ssh::install{ 
    3. package{"openssh"
    4.   ensure=>present, 
    5.   } 

    4)创建模块配置文件config.pp

    1. [root@master puppet]# vim /etc/puppet/modules/ssh/manifests/config.pp 
    2.  
    3. class ssh::config{ 
    4. file {"/etc/ssh/sshd_config":     #配置客户端需要同步的文件 
    5. ensure=>present,                  #确认客户端中有此文件 
    6. owner=>"root",         #文件属主 
    7. group=>"root",         #文件属组 
    8. mode=>"0600",          #文件权限属性 
    9. source=>"puppet://$puppetserver/modules/ssh/ssh/sshd_config"
    10. #从服务端同步文件 
    11. require=>Class["ssh::install"],      #调用install.pp确认ssh已经安装 
    12. notify=>Class["ssh::service"],       #如果config.pp发生变化,通知service.pp 

    5)创建模块配置文件service.pp

    1. [root@master puppet]# vim /etc/puppet/modules/ssh/manifests/service.pp 
    2. class ssh::service{ 
    3. service { "sshd"
    4. ensure=>running,     #确认ssh运行 
    5. hasstatus=>true,     #puppet该服务支持status命令,类似于service sshd status 
    6. hasrestart=>true,    #puppet该服务支持restart,类似于service sshd restart 
    7. enable=>true,        #服务器是否开机启动 
    8. require=>Class["ssh::config"]     #确认config.pp调用 

    6)创建模块主配置文件init.pp

    1. [root@master puppet]# vim /etc/puppet/modules/ssh/manifests/init.pp 
    2.  
    3. class ssh { 
    4. include ssh::install,ssh::config,ssh::service  #将配置文件加载到ssh类中去 

    7)此时/etc/puppet/modeles/ssh/mainfests目录下有四个文件

    1. [root@master puppet]# ll /etc/puppet/modules/ssh/manifests/ 
    2. 总用量 16 
    3. -rw-r--r--. 1 root root 248 8月   6 21:40 config.pp 
    4. -rw-r--r--. 1 root root  60 8月   6 21:46 init.pp 
    5. -rw-r--r--. 1 root root  64 8月   6 21:38 install.pp 
    6. -rw-r--r--. 1 root root 165 8月   6 21:42 service.pp 

    8)建立服务端ssh统一维护文件

    由于服务端和客户端的sshs_config文件默认一样,此时将服务端的/etc/ssh/sshd_config复制到模块默认路径中去。

    1. [root@master puppet]# cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/ 
    2. [root@master puppet]# chown -R puppet /etc/puppet/modules/ssh/files/ssh/ #修改权限 

    9)创建测试节点配置文件,并将ssh加载进去。

    1. [root@master puppet]# vim /etc/puppet/manifests/nodes/ssh.pp 
    2. node 'client01.test.cn'
    3. include ssh 
    4.  
    5. node 'client02.test.cn'
    6. include ssh 

    10)将测试节点载入puppet,即修改site.pp。

    1. [root@master puppet]# vim /etc/puppet/manifests/site.pp 
    2.  
    3. import "nodes/ssh.pp" 

    11)修改服务器维护的sshd_config配置文件

    1. [root@master puppet]# vim /etc/puppet/modules/ssh/files/ssh/sshd_config 
    2. Port 22    #修改为9922 

    12)重启puppet服务

    1. [root@master puppet]# systemctl restart puppetmaster.service 

    2.客户端主动拉取

    一般在小规模自动化集群中,如代码上线需要重启服务时,为了防止出现网站暂时性无法访问的问题,每台客户端运行一次puppet agent -t命令,选择模式根据客户端集群规模的大小。根据经验,一般puppet服务器到各客户端会建立ssh信任,然后自定义shell脚本,ssh批量让客户端执行puppet同步命令。

    1)Client01端:

    1. [root@client01 ~]# puppet agent -t 
    2. .....//省略 
    3. Notice: /Stage[main]/Ssh::Config/File[/etc/ssh/sshd_config]/content: 
    4. --- /etc/ssh/sshd_config    2017-08-07 10:28:25.000000000 +0800 
    5. +++ /tmp/puppet-file20180806-5162-jc80yr    2018-08-06 22:25:58.726506429 +0800 
    6. @@ -14,7 +14,7 @@ 
    7.  # SELinux about this change. 
    8.  # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER 
    9.  # 
    10. -#Port 22 
    11. +Port 9922 
    12.  #AddressFamily any 
    13.  #ListenAddress 0.0.0.0 
    14.  #ListenAddress :: 
    15. .....//省略 
    16.  
    17. Client02端:....//省略 
    18. Notice: /Stage[main]/Ssh::Config/File[/etc/ssh/sshd_config]/content: 
    19. --- /etc/ssh/sshd_config    2017-08-07 10:28:25.000000000 +0800 
    20. +++ /tmp/puppet-file20180806-4667-149tj11   2018-08-06 22:27:39.362282788 +0800 
    21. @@ -14,7 +14,7 @@ 
    22.  # SELinux about this change. 
    23.  # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER 
    24.  # 
    25. -#Port 22 
    26. +Port 9922 
    27.  #AddressFamily any 
    28.  #ListenAddress 0.0.0.0 
    29.  #ListenAddress :: 
    30. ......//省略 

    2)此时命令在客户端执行成功,验证如下:

    1. [root@client01 ~]# cat /etc/ssh/sshd_config | grep Port 
    2. Port 9922 
    3. #GatewayPorts no 

    3)查看服务器ssh服务是否重启,端口是否生效。

    1. [root@client01 ~]# netstat -tunlp | grep ssh 
    2. tcp        0      0 0.0.0.0:9922            0.0.0.0:*               LISTEN      5428/sshd 
    3. tcp6       0      0 :::9922                 :::*                    LISTEN      5428/sshd 

    3.服务器推送同步

    1)当大规模部署时,采用服务器推送模式。

    1. client: 
    2. [root@client02 ~]# vim /etc/puppet/puppet.conf 
    3. 最后一行添加 
    4.   listen = true   #使puppet监听8139端口 

    2)验证配置文件auth.conf定义了一些验证信息及访问权限

    1. [root@client02 ~]# vim /etc/puppet/auth.conf 
    2. 最后一行添加 
    3. allow *     #允许任何服务端推送 

    3)启动puppet客户端

    1. [root@client02 ~]# systemctl start puppetagent.service 
    2.  
    3. [root@client02 ~]# cat /etc/ssh/sshd_config  #查看 
    4. ......//省略 
    5. Port 9922 
    6. #AddressFamily any 
    7. #ListenAddress 0.0.0.0 
    8. #ListenAddress :: 
    9. ......//省略 

    4)开始往客户端推送

    1. Master: 
    2. [root@master puppet]# puppet kick client02.test.cn 
    3. Triggering client02.test.cn 
    4. Getting status 
    5. status is success 
    6. client02.test.cn finished with exit code 0 
    7. Finished 

    5)校验结果如下

    1. [root@master puppet]# cat /etc/ssh/sshd_config | grep Port 
    2. #Port 22 
    3. #GatewayPorts no 

    6)查看服务器ssh服务是否重启,端口是否生效。

    1. [root@client02 ~]# netstat -tunlp | grep ssh 
    2. tcp        0      0 0.0.0.0:9922            0.0.0.0:*               LISTEN      4908/sshd 
    3. tcp6       0      0 :::9922                 :::*                    LISTEN      4908/sshd 
      Java是一个面向对象的语言。对程序员来说,这意味着要注意应中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java程序是用类来组织的。

课课家教育

未登录