自动化运维工具puppet的基础使用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

一、puppet的简介

puppet是一种开源的、新一代的集中化的配置管理工具。可管理的平台有windows,Linux,Unix等。有自己的配置语言(资源申报语言),可管理文件、软件包、系统服务、用户等。这些统称为puppet的资源。puppet是采用ruby语言研发的。

工作流程

如下图:

image

工作模型:

单机模型:实现定义多个manifests --> complier --> catalog --> apply

image

master/agent模型:集中式管理

架构:

image

工作原理:

image

puppet名词解释:

资源:是puppet的核心,通过资源申报,定义在资源清单中。

类:一组资源清单。

模块:包含多个类。

站点清单:以主机为核心,应用哪些模块。

二、puppet单机模型

1、安装安装

puppet的安装可以使用源码安装,也可以使用rpm(官方提供)、epel源、官方提供的yum仓库来安装(通过下载官方提供的rpm包可以指定官方的yum仓库)。

这里使用的是2.7系列的,使用epel仓库

1
yum  install  puppet -y

2、定义资源

puppet从以下三个维度来都资源完成抽象:

1
2
3
4
5
1、相似的资源被抽象成同一种资源“类型,”如程序包资源、用户资源及服务资源等
2、将资源属性或状态的描述与其实现方式剥离开来,如仅说明安装一个程序包而不用关系其具体
   是yum、pkgadd、prots或其他方式实现
3、仅描述资源的目标状态,也即期望其实现的结果,而不是其具体过程,如“确定nginx运行起来”
  而不是具体描述为“运行nginx命令将启动起来”

这三个也被称为puppet的资源抽象层(RAL)。RAL由type(类型)和provide(提供者,即不同的OS上的特定实现)组成。

 资源是puppet用于模型化系统配置的基础单元,每个资源都从某个角度描述了系统属性,如某程序包必须安装或某用户必须移除等,在puppet,用于完成此类功能的代码也即“资源申报”

1
2
3
type  { ‘title’:
     atttibue    => value,    
}

资源的文件统一以.pp结尾。在定义时,资源类型必须使用小写字母,而资源名称仅是一个字符串,但要求在同一类型中期必须唯一。

3、常见资源介绍

package:puppet管理软件包

1
2
3
4
5
6
7
8
9
10
11
12
## 帮助查看:
puppet describe [-s] package
 
puppet支持使用的软件包管理器:yum,rpm,apt,prots,gem,msi,dpkg,pkg
 
常用的参数:
ensure:程序包的目标状态,值有present(installed)、absent(不存在)、purged、held、
   latest
name:资源的名称,即软件包的名字,可以省略,如果省略,将继承title的值
provide:软件包管理器,会自动识别
source :指定程序包文件路径
install_options:安装选项,最常用的是通过INATALLDIR来制定安装目录

service:用于定义服务的状态

1
2
3
4
5
6
7
8
9
10
11
12
## 帮助查看:
puppet describe [-s] service
 
常用的参数:
  ensure:服务的额目标状态,值有 true (running)和 false (stopped) 
  enable :是否开机自动启动,值有 true false
  name:服务名称,可以省略,如果省略,将继承title的值
  path:服务脚本路径,默认为 /etc/init .d/下
  start:定制启动命令
  stop:定制关闭命令
  restart:定制重启命令
  status:定制状态

file:管理文件、目录、软链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 帮助查看: 
puppet describe [-s]  file 
 
ensuce:目标状态,值有*absent*, *present*, * file *, 和*directory*.
backup:通过filebacket资源来备份文件,值通常为filebucket资源的名称
content:文件内容,生成方式有三种(content, source ,target),三者彼此互斥
source :通过制定的url下载文件至本地,获取文件格式为:
     puppet: ///modules/MODULE_NAME/file_names ,使用模块时会用到
target:为符号链接指定目标
links:文件为符号连接,值为“follow”,“manage”
path:文件路径,必须使用双引号
mode:定义权限,通常为8进制数字
owner: 定义文件的属主
group:定义文件的属组
force:强制执行删除文件、链接或目录、仅用于ensure为absent时
purge:清除指定目录中存在的,但未在资源中定义的文件
resurce:目录递归,值为 true false ,inf,remote
replace:替换,本地存在的文件与资源中指定的文件内容不同时是否执行替换,默认为否

举例:lamp.pp

1
2
3
4
5
6
7
8
9
10
11
12
13
package { [ "httpd" , 'mysql-server' , 'php' ]:
     ensure => present
 
service { [ "httpd" , 'mysqld' ]:
     ensure =>  true ,
     enable  =>  false
}
file { 'my.cnf' :
         ensure  =>  file ,
         source   =>  '/root/my.cnf' ,
         path    =>  '/etc/my.cnf' ,
}

9

exec: 执行命令,通常在不得不用时才使用,慎用,通常用于完成puppet自身无法完成的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
## 帮助查看: 
puppet describe [-s]  exec
 
常用的参数:
command :要执行的命令,通过为命令文件的完整路径
path:命令搜索路径
group:执行命令的组
user:执行命令的用户
onlyif:0,表示仅在命令的状态返回值为0时才执行此命令
refresh:定义接受的其他资源的通知时,则要重新执行此命令
refreshonly:仅被当被依赖的资源发生改变时才被触发
tries:尝试次数,默认为1
try_sleep:多次尝试之间的时间间隔

group:管理系统上的用户组

1
2
3
4
5
6
7
8
## 帮助查看: 
puppet describe [-s] group
 
常用参数:
  ensure:目标状态,present,absent
  name:组名
  gid:GID
  system:系统组

user:管理用户

1
2
3
4
5
6
7
8
9
10
11
12
13
## 帮助查看: 
puppet describe [-s] user
 
常用参数:
ensure:目标状态,present,absent
name:用户名
uid:用户uid
system:系统用户
home:用户家目录
shell:用户默认shell
gid:用户的gid
password:密码,使用加密后密码
managehome: 是否创建家目录,默认为 false

cron:定义周期性任务

1
2
3
4
5
6
7
8
9
10
11
常见属性
ensure:目标状态,present,absent
command :命令或脚本
environment:运行时的环境变量
hour:小时
mouth:月
monthday:日
weekday:周
minute:分
name:名称
user: 默认为root

notify:调试输出

1
2
3
常用参数:
message:信息
name:信息名称

常见的资源就是这些。更详细的可以使用puppet describe命令查看。

4、资源的引用

使用Type['title'],首字母必须大写

5、puppet的特殊属性

puppet提供了before、require、notify、subscribe四个元参数来定义资源之间的相关性。

1
2
3
4
require:表示需要依赖于某个资源
before:表示应该先执行本资源,在执行别的资源
notify: 表示将当前资源的变动信息通知给别的资源,为通知的发出者
subscribe:表示定义某资源的变动信息,为通知的接收者

依赖关系还可以使用->和~>来表示

1
2
-> 表示后资源需要依赖前资源
~> 表示前资源变动通知后资源调用

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package{ 'nginx' :
     ensure    => installed,
}
file { 'nginx.conf' :
     ensure    =>  file ,
     source     =>  '/root/nginx.conf' ,
     require    => Package[ 'nginx' ],
     path    =>  '/etc/nginx/nginx.conf' ,
service{ 'nginx' :
     ensure    =>  true ,
     enable     =>  true ,
     require    => Package[ 'nginx' ],
     subscribe => File[ 'nginx.conf' ],
}

6、puppet变量

puppet的变量名称以“$”开头,赋值操作符为“=”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
puppet的变量类型:
 
布尔型: true false ,不能加引号, if 语句的测试条件和比较表达式都会返回布尔型值,
    另外,其他数据类型也可以自动转换为布尔型,如空字符串为 false
undef:从未声明的变量的值类型即为undef,也可以手动为某变量赋予undef值,
     即直接使用不加引号的undef字符串
字符型:非结构化的文本字符串,可以使用引号,也可以不用。单引号中的变量不会替换,
    而双引号中的能够进行变量替换;字符型也支持使用转移符
数值型:可为整数或浮点数,不过,puppe只有在数值上下文才把数值当数值对待,
    其他清理下一律以字符型处理
数组:数组值为中括号“[]”中的以逗号分隔的项目列表,最后一个项目后面可以有逗号;
    数组中的袁术可以为任何可用数据类型,包括 hash 或其他数组,属组索引为从0开始的整数,
    也可以使用负数索引
hash :即为外键值数据类型,键和值之间使用“=>”分隔,键值对定义在“{ }”中,
   彼此间以逗号分隔;其键位字符型数据,而值可以为puppet支持的任意数据类型,
   访 hash 类型的数据元素要使用“键”当作索引进行。实际上和关联数组应属于同一数据类型
正则表达式:属于puppet的非标准数据类型,不能赋值给变量,仅能用于有限的几个接收正则
   表达式的地方,即接受使用“=~”及“!~”匹配操作符的位置,通常包括 case 语句中的
   selector,已经节点名称匹配的位置,他们不能传递给函数或用于资源属性的定义
facter变量:可以通过facter查看
内置变量:
     例如:agent端:$environment,$clientcert,$clentbversion
     server端:$servername,$serverip,$serverversion

puppet中的正则表达式支持使用(?<ENABLED OPTION>:<SUNPATTERN>)和(?-<DISABLED OPTION>:<SUNPATTERN>)两个特殊的符号,如下面的示例,表示做正则表达式匹配时启用选项“i(忽略字符大小写)”,但不支持使用“m(把.当作换行符)”和启用“x(忽略模式中的空白字符和注释)”

1
2
3
4
$packages = $operatingsystem ? {
     /(?i-mx:ubuntu|debian)/        =>  'apache2' ,
     /(?i-mx:centos|fedora|redhat)/ =>  'httpd' ,
}

7、puppet的判断语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
puppet的判断语句主要有三种分别为 if case ,selector
puppet的操作符有:比较操作符,布尔操作符,算术操作符
if 语句分为单分支,双分支和多分支        
 
单分支:
     if  CONDITION {
         statement
         ...
     }
双分支:
     if  CONDITION {
         statement
         ...
     }
     else  {
         statement
         ...
     }
多分支:
     if  CONDITION {
         statement
         ...
     }
     elsif CONDITION {
         statement
         ...
     }
     else  {
         statement
         ...
     }
case 语句的语法
     case  CONTROL_EXPRESS {
         case1,...: { statement... }
         case2,...:{ statement... }
         ... ...
         default:{ statement... }
     }
selector语句的用法    
     CONTROL_VARIABLE ? {
         case1 => value1
         case2 => value2
         ...
         default => valueN
     }

例如:判断一个系统的OS的类型,并输出“welcome to OS”的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if  $operatingsystem  == /^(?i-mx:centos|fedora|redhat)/ {
     notice  "welcome to redhat OS Family"
}elsif $operatingsystem  == ubuntu {
     notice  "welcome to ubuntu server"
} else  {
     notice  "unkown server"
#################################################################
   
case  $operatingsystem {
      'Solaris' :          { notice( "Welcome to Solaris" ) }
      'RedHat' 'CentOS' : { notice( "Welcome to RedHat OSFamily" ) }
      /^(Debian|Ubuntu)$/:{ notice( "Welcome to $1 linux" ) }
      default:            { notice( "Welcome, alien *_*" ) }
   
 
#################################################################
 
$welcome =$operatingsystem ? {
                 /^(?i-mx:centos|fedora|redhat)/ =>  'redhat OS Family' ,
                 /^(?i-mx:ubuntu)/        =>  'ubuntu' ,
                 /^(?i-mx:debian)/        =>  'debebian' ,
         }
notify {  "$welcome" :
     message =>  "welcome to $welcome" ,
}

8、puppet的类  
Class是用于通用目标或目的的一组资源,因此,它是命令的代码块,在某位置创建之后可在puppet全局使用。类似于其他编程语言中的类的功能,puppet的类可以继承,也可以包含子类,定义类的语法如下所示

1
2
3
class my_class {
    ...puppet code ...
}

例如:定义一个名为nginx的类牟其中包含两类资源,一个是package类型的nginx,一个是service的nginx

?
 
1
2
3
4
5
6
7
8
9
10
class nginx {
     package {  'nginx' :
         ensure => installed,
         name   => nginx,
     }
     service {  'nginx' :
         ensure =>  true ,
         enable  =>  true ,
         subscribe => Package[ 'nginx' ],
     }
}

以上是类的定义,类似于函数。需要使用的话,要调用。调用时,使用关键在include即可。

类的继承:

类可以基于父类调用,在调用时,应该指定通过inherits关键字调用父类。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class nginx {
     package {  'nginx' :
         ensure => installed,
         name   => nginx,
     }
}
 
class nignx::web inherits nginx {
     service {  'nginx' :
     ensure =>  true ,
     enable  =>  true ,
     }
}
include nignx::web

也支持类的覆盖和重写:

1
2
=>:在子类中覆盖父类中的资源
+>:在子类中为父类中的资源新增额外的属性

10、模板

puppet模块:为了实现某种完备功能而组织成的一个独立的、自我包含的目录结构  
模块名:目录名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
目录结构:
Module_name:
     manifests
         init.pp: 必须声明一个类,类名与模块名相同;                     
         *.pp:
             MODULE_NAME::[SUBDIR_NAME]::MANIFESTS_FILE_NAME
     files:静态文件
         puppet url:puppet: ///modules/MODULE_NAME/ [SUBDIR_NAME] /FILE_NAME 
         file { 'nginx.conf' :
             source      => puppet: ///modules/nginx/nginx .conf
         }
     templates: 模板文件:*.erb
         template( 'MODULE_NAME/TEMPLATE_FILE_NAME' ); 
 
         file { 'nginx.conf' :
             content     => template( '模板文件' ),
        
     lib: 插件
     tests: 模块使用说明文档
     spec: lib目录下的插件使用说明文档

三、使用maste/agent模式,部署LAMP平台

Master/Agent模型之间通信是靠主机名通信的,大致步骤是:

1
2
3
1、master启动时会为自己的key,自签
2、agent启动前要生成自己的key,生成签署请求
3、master收到请求书,验证合法性,签署证书

实验环境:

1
2
3
Master端:172.16.10.9 server.magedu.com
Agent端:172.16.10.77 basic.example.com
     172.16.10.122 node2.example.com

实验步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
### 安装软件
在172.16.10.9:
yum  install  puppet puppet-server -y
 
在172.16.10.77,172.16.10.122:
yum  install  puppet -y
 
### 提供主机名解析名文件
# 172.16.10.9 172.16.10.77 172.16.10.122
# /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.10.77 basic.example.com
172.16.10.9 server.magedu.com
172.16.10.122 node2.example.com
 
### 配置3台机器时间同步

完成上面的配置后,接下来要在服务端配置模块了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
## Master端 目录文件,如下:
[root@server modules] # pwd
/etc/puppet/modules
[root@server modules] # tree 
.
├── mysql
│   ├──  file
│   │   └── my.cnf
│   └── manifests
│   └── init.pp
└── nginx
     ├── files
     │   └── nginx.conf
     └── manifests
         └── init.pp
 
6 directories, 4 files
[root@server modules] # cat mysql/manifests/init.pp 
class mysql {
     package{ 'mysql-server' :
         ensure  => installed,
     }
 
     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 ,
         require => Package[ 'mysql-server' ],
         subscribe => File[ 'my.cnf' ],
     }
}
[root@server modules] # cat nginx/manifests/init.pp 
class nginx {
     package{ 'nginx' :
         ensure  => installed,
     }
     
     file { 'nginx.conf' :
         ensure  =>  file ,
         source   =>  'puppet:///modules/nginx/nginx.conf' ,
         require => Package[ 'nginx' ],
         path    =>  '/etc/nginx/nginx.conf' ,
     }
 
    service{ 'nginx' :
         ensure  =>  true ,
         enable   =>  true ,
         require => Package[ 'nginx' ],
         subscribe => File[ 'nginx.conf' ],
     }  
}
## 说明:my.cnf nginx.cnf是配置文件
 
[root@server manifests] # pwd
/etc/puppet/manifests
[root@server manifests] # tree 
.
├── server
│   ├── basic.pp
│   └── node2.pp
└── site.pp
 
1 directory, 3 files
[root@server manifests] # cat server/node2.pp 
node  'node2.example.com'  {
     include nginx,mysql
}
[root@server manifests] # cat server/basic.pp 
node  'basic.example.com'  {
     include nginx,
}
[root@server manifests] # cat site.pp 
import  "server/*.pp"


创建好目录清单后,此时需要启动服务。第一次启动时,可手动启动。

Master端启动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
[root@server ~] # puppet master -v -d --no-daemonize
debug: Failed to load library  'rubygems'  for  feature  'rubygems'
debug: Puppet::Type::User::ProviderUser_role_add:  file  roleadd does not exist
debug: Puppet::Type::User::ProviderPw:  file  pw does not exist
debug: Puppet::Type::User::ProviderDirectoryservice:  file  /usr/bin/dscl  does not exist
debug: Puppet::Type::User::ProviderLdap:  true  value when expecting  false
debug:  /File [ /var/lib/puppet/yaml ]: Autorequiring File[ /var/lib/puppet ]
debug:  /File [ /var/lib/puppet/ssl/private ]: Autorequiring File[ /var/lib/puppet/ssl ]
debug:  /File [ /etc/puppet/auth .conf]: Autorequiring File[ /etc/puppet ]
debug:  /File [ /var/lib/puppet/lib ]: Autorequiring File[ /var/lib/puppet ]
debug:  /File [ /var/lib/puppet/facts ]: Autorequiring File[ /var/lib/puppet ]
debug:  /File [ /var/lib/puppet/ssl/certificate_requests ]: Autorequiring File[ /var/lib/puppet/ssl ]
debug:  /File [ /etc/puppet/manifests/site .pp]: Autorequiring File[ /etc/puppet/manifests ]
debug:  /File [ /var/lib/puppet/rrd ]: Autorequiring File[ /var/lib/puppet ]
debug:  /File [ /var/log/puppet/masterhttp .log]: Autorequiring File[ /var/log/puppet ]
debug:  /File [ /var/lib/puppet/ssl/private_keys ]: Autorequiring File[ /var/lib/puppet/ssl ]
debug:  /File [ /var/lib/puppet/reports ]: Autorequiring File[ /var/lib/puppet ]
debug:  /File [ /etc/puppet/puppet .conf]: Autorequiring File[ /etc/puppet ]
debug:  /File [ /var/lib/puppet/state ]: Autorequiring File[ /var/lib/puppet ]
debug:  /File [ /etc/puppet/fileserver .conf]: Autorequiring File[ /etc/puppet ]
debug:  /File [ /var/lib/puppet/server_data ]: Autorequiring File[ /var/lib/puppet ]
debug:  /File [ /etc/puppet/manifests ]: Autorequiring File[ /etc/puppet ]
debug:  /File [ /var/lib/puppet/bucket ]: Autorequiring File[ /var/lib/puppet ]
debug:  /File [ /var/lib/puppet/ssl/public_keys ]: Autorequiring File[ /var/lib/puppet/ssl ]
debug:  /File [ /var/lib/puppet/ssl ]: Autorequiring File[ /var/lib/puppet ]
debug:  /File [ /var/lib/puppet/ssl/certs ]: Autorequiring File[ /var/lib/puppet/ssl ]
debug:  /File [ /var/lib/puppet/yaml ] /ensure : created
debug:  /File [ /var/lib/puppet/rrd ] /ensure : created
debug:  /File [ /var/lib/puppet/reports ] /ensure : created
debug:  /File [ /var/lib/puppet/facts ] /ensure : created
debug:  /File [ /var/lib/puppet/ssl ] /ensure : created
debug:  /File [ /var/lib/puppet/ssl/private_keys ] /ensure : created
debug:  /File [ /var/lib/puppet/ssl/public_keys ] /ensure : created
debug:  /File [ /var/lib/puppet/ssl/certs ] /ensure : created
debug:  /File [ /var/lib/puppet/state ] /ensure : created
debug:  /File [ /var/lib/puppet/ssl/private ] /ensure : created
debug:  /File [ /var/lib/puppet/lib ] /ensure : created
debug:  /File [ /var/lib/puppet/bucket ] /ensure : created
debug:  /File [ /var/lib/puppet/ssl/certificate_requests ] /ensure : created
debug:  /File [ /var/lib/puppet/server_data ] /ensure : created
debug: Finishing transaction 70003525843560
debug:  /File [ /var/lib/puppet/ssl/ca/signed ]: Autorequiring File[ /var/lib/puppet/ssl/ca ]
debug:  /File [ /var/lib/puppet/ssl/ca/requests ]: Autorequiring File[ /var/lib/puppet/ssl/ca ]
debug:  /File [ /var/lib/puppet/ssl/ca/private ]: Autorequiring File[ /var/lib/puppet/ssl/ca ]
debug:  /File [ /var/lib/puppet/ssl/ca ] /ensure : created
debug:  /File [ /var/lib/puppet/ssl/ca/signed ] /ensure : created
debug:  /File [ /var/lib/puppet/ssl/ca/private ] /ensure : created
debug:  /File [ /var/lib/puppet/ssl/ca/requests ] /ensure : created
debug: Finishing transaction 70003525749380
info: Creating a new SSL key  for  ca
info: Creating a new SSL certificate request  for  ca
info: Certificate Request fingerprint (md5): E4:F9:A5:7C:CD:DC:D5:F4:30:C5:97:D4:4B:75:E2:1A
notice: Signed certificate request  for  ca
notice: Rebuilding inventory  file
debug: Using cached certificate  for  ca
info: Creating a new certificate revocation list
info: Creating a new SSL key  for  server.magedu.com
debug: Using cached certificate  for  ca
info: Creating a new SSL certificate request  for  server.magedu.com
info: Certificate Request fingerprint (md5): EC:52:9E:3B:8A:92:A3:E2:82:FB:D6:EF:7B:36:50:1F
notice: server.magedu.com has a waiting certificate request
debug: Using cached certificate  for  ca
debug: Using cached certificate_request  for  server.magedu.com
notice: Signed certificate request  for  server.magedu.com
notice: Removing  file  Puppet::SSL::CertificateRequest server.magedu.com at  '/var/lib/puppet/ssl/ca/requests/server.magedu.com.pem'
notice: Removing  file  Puppet::SSL::CertificateRequest server.magedu.com at  '/var/lib/puppet/ssl/certificate_requests/server.magedu.com.pem'
notice: Starting Puppet master version 2.7.25
debug: Finishing transaction 70003524197780
debug: No modules  mount  given; autocreating with default permissions
debug: No plugins  mount  given; autocreating with default permissions

出现以上信息时,证明测试没有问题,此时可以使用:

1
service puppetmaster start

image

Agent端的启动:

以172.16.10.122为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@node2 ~] # puppet agent --server=server.magedu.com --no-daemonize -d
### 会出现以下信息:
info: Creating a new SSL key  for  node2.example.com
info: Caching certificate  for  ca
info: Creating a new SSL certificate request  for  node2.example.com
info: Certificate Request fingerprint (md5): 1B:D4:E5:D9:15:A8:87:5B:67:C0:4B:C2:72:\
  15:45:BA
###############################################################
此时在Master端:
[root@server ~] #  puppet cert --list
   "node2.example.com"  (1B:D4:E5:D9:15:A8:87:5B:67:C0:4B:C2:72:15:45:BA)
签名:
[root@server ~] #  puppet cert --sign node2.example.com
notice: Signed certificate request  for  node2.example.com
notice: Removing  file  Puppet::SSL::CertificateRequest node2.example.com at \
'/var/lib/puppet/ssl/ca/requests/node2.example.com.pem'
#####################################################################
此时Agent端出现:
debug: Using cached certificate  for  node2.example.com
notice: Starting Puppet client version 2.7.25
表明签署成功。
####################################################################
 
确保上述agent相关操作不存在问题后,便可以将--server选项指定的信息存储与agent的配置文件中
,并以服务的方式启动puppet agent了。
其配置文件为 /etc/puppet/puppet .conf
echo  "server=server.magedu.com"  >>  /etc/puppet/puppet .conf
####################################################################
service puppet start

172.16.10.77同样的配置。

image

puppet kick功能实现

puppet客户端默认每30分钟很服务器通讯一次,但是有时,我们希望服务器能够给客户端紧急推送一些任务,于是就有了puppet kick(puppet 2.6以前叫puppetrun)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1)编辑客户端配置文件 /etc/puppet/puppet .conf在[agent]端中添加如下
listen= true
2)在客户端编辑或创建新文件 /etc/puppet/namespaceauth .conf,包含下面内容
[puppetrunner]
allow *.magedu.com
3)在客户端编辑文件auth.conf,添加如下内容
path     /run
   method  save
   auth    any
   allow   server.magedu.com ## 注意,这一项放到 path /前面
4)推送方法,在服务器端运行命令
[root@server puppet] # puppet kick -p 1 --host node2.example.com
Triggering node2.example.com
Getting status
status is success
node2.example.com finished with  exit  code 0
Finished

配置基本完成。










本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1568590,如需转载请自行联系原作者
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
运维 应用服务中间件 网络安全
自动化运维的利器:Ansible在服务器管理中的应用
【8月更文挑战第28天】本文深入探讨了Ansible在简化和自动化服务器管理工作中的强大功能及其实际应用。通过浅显易懂的语言和具体示例,展示了如何利用Ansible进行批量配置、部署应用以及执行系统管理任务,旨在为读者提供一套完整的解决方案,以便更好地理解和应用Ansible,从而提高工作效率和减轻运维负担。
|
3天前
|
运维 Kubernetes Devops
自动化运维的变革之路:从脚本到DevOps
【8月更文挑战第28天】在信息技术迅猛发展的今天,自动化运维已成为企业提升效率、确保服务质量的关键。本文将带你领略自动化运维的发展脉络,从最初的脚本编写到现代的DevOps实践,揭示这一领域如何不断进化以适应新的技术挑战。你将看到,通过采纳DevOps文化和工具,团队如何打破壁垒,实现更高效的协作与交付,从而为企业带来持续的创新和价值。
|
1天前
|
运维 监控 应用服务中间件
自动化运维:打造高效、稳定的系统环境
【8月更文挑战第30天】本文将探讨如何通过自动化运维技术,提升系统的稳定性和效率。我们将从基础概念出发,逐步深入到实践应用,分享一些实用的工具和技术,以及如何将这些工具和技术融入到日常的运维工作中。无论你是运维新手,还是有一定经验的老手,都能在这篇文章中找到有价值的信息。让我们一起探索自动化运维的世界,提升我们的工作效率,让系统运行得更加平稳。
|
1天前
|
运维 安全 应用服务中间件
自动化运维的利器:Ansible入门与实战网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【8月更文挑战第30天】在当今快速发展的IT时代,自动化运维已成为提升效率、减少错误的关键。本文将介绍Ansible,一种流行的自动化运维工具,通过简单易懂的语言和实际案例,带领读者从零开始掌握Ansible的使用。我们将一起探索如何利用Ansible简化日常的运维任务,实现快速部署和管理服务器,以及如何处理常见问题。无论你是运维新手还是希望提高工作效率的资深人士,这篇文章都将为你开启自动化运维的新篇章。
|
1天前
|
数据采集 运维 Devops
探索Python编程之美:从基础到进阶自动化运维的变革之路:从脚本到DevOps
【8月更文挑战第30天】在数字化时代的浪潮中,编程已经成为一门重要的技能。Python以其简洁明了的语法和强大的功能,成为了许多初学者的首选编程语言。本文将通过浅显易懂的语言,带领读者从Python的基础语法出发,逐步深入到面向对象编程、网络爬虫开发以及数据分析等高级应用,旨在帮助初学者构建扎实的编程基础,并激发他们进一步探索编程世界的热情。文章不仅分享实用的编程技巧,还将探讨如何将编程知识应用于解决实际问题,以期培养读者的问题解决能力和创新思维。
|
2天前
|
测试技术
基于LangChain手工测试用例转Web自动化测试生成工具
该方案探索了利用大模型自动生成Web自动化测试用例的方法,替代传统的手动编写或录制方式。通过清晰定义功能测试步骤,结合LangChain的Agent和工具包,实现了从功能测试到自动化测试的转换,极大提升了效率。不仅减少了人工干预,还提高了测试用例的可维护性和实用性。
12 4
|
1天前
|
运维 监控 调度
自动化运维:使用Python脚本简化日常任务
【8月更文挑战第30天】本文通过介绍如何使用Python脚本来简化和自动化日常的运维任务,旨在帮助读者提升工作效率。文章将重点介绍如何使用Python的基本库以及如何创建简单的脚本来处理文件、监控服务器状态和自动化备份过程。我们将从基础开始,逐步深入到更复杂的应用场景,使读者能够根据实际需要编写自己的自动化脚本。
|
1天前
|
运维 监控 Cloud Native
自动化运维的魔法书云原生之旅:从容器化到微服务架构的演变
【8月更文挑战第29天】本文将带你领略自动化运维的魅力,从脚本编写到工具应用,我们将一起探索如何通过技术提升效率和稳定性。你将学会如何让服务器自主完成更新、监控和故障修复,仿佛拥有了一本能够自动翻页的魔法书。
|
2天前
|
运维 Ubuntu 应用服务中间件
自动化运维:使用Ansible管理服务器
【8月更文挑战第29天】在当今快速发展的IT领域,自动化运维已成为提升效率和减少人为错误的关键技术。本文将引导你了解如何使用Ansible这一强大的自动化工具来简化服务器管理任务。从基础的安装、配置到高级的应用部署与维护,我们将一步步揭示Ansible如何让你轻松掌控多台服务器,确保系统稳定运行。文章末尾,你还将找到实用的代码示例,助你立刻上手实践。
|
2天前
|
运维 Ubuntu 应用服务中间件
自动化运维的利器:Ansible入门与实践
【8月更文挑战第29天】本文旨在为读者提供一份简明扼要的Ansible入门指南,通过通俗易懂的语言和实际案例,引导读者了解Ansible的基本概念、安装步骤以及如何编写简单的Playbook。文章不仅涵盖了Ansible的基础使用,还探讨了其在自动化运维中的关键作用,鼓励读者思考如何将Ansible应用到日常工作中,以提升效率和减少人为错误。
下一篇
云函数