puppet

puppet
(chef cfengine SaltStack Ansible)
假设管理100台服务器,现在我要去这100台上都执行一个事情,怎么做?
1,一个个的ssh连上去,手动操作
2,shell脚本做
但有两个主要的问题:
a,)密码的问题
解决方法: ssh-keygen 空密钥
expect 自动应答密码
b,)循环的效率问题:
100台服务器,假设每台服务器要做的事情需要10秒,则一共就得要1000秒了
解决方法: shell并发执行
#!/bin/bash
for i in `seq 10`
do
echo $i
let i++
sleep 1
done & --这里不加后台符号和加后台符号效果不一样,测试一下就知道了
for j in `seq 11 20`
do
echo $j
let j++
sleep 1
done
---------------------------------------------------------------
3,自动化(集中化)配置管理工具
puppet
如果你管理的多台机器(可能操作系统不一样,或者版本不一样),puppet会有一个叫facter的包可以帮助判断管理机器的系统和版本。然后管理员在管理端写上类似下面的语法就可以实现差异化管理了
if centos;then
xxxx
elif rhel;then
xxxx
elif suse;then
xxxx
fi
puppet
master touch /tmp/123
rpm -ivh xxxx
yum install xxxx
server1 server2 server3 server4 ........
--------------------------------------------------------------------------------------------------------
安装前准备:一个server,两个client(centos7.3平台)
1,主机名配置和主机名互相绑定
# hostnamectl set-hostname --static vm1.cluster.com
# vim /etc/hosts
172.16.2.10 vm1.cluster.com
172.16.2.11 vm2.cluster.com
172.16.2.12 vm3.cluster.com
2,时间同步
3,静态IP
4,关闭firwalld,selinux
5,配置yum源 (本地iso源和163源,还要加上下面的官方源)
# vim /etc/yum.repos.d/puppet.repo
[puppet]
name=puppet
enabled=1
gpgcheck=0
[puppet-dependencies]
name=puppet-dependencies
enabled=1
gpgcheck=0
第一步:安装puppet
在vm1上
# yum install puppet-server
# systemctl start vm1
# systemctl status vm1
# systemctl enable vm1
# lsof -i:8140
在所有的agent上
# yum install puppet
# systemctl start puppet
# systemctl status puppet
# systemctl enable puppet
# systemctl start puppetagent
# systemctl status puppetagent
# systemctl enable puppetagent
第二步:
master与所有agent建立连接
1,在所有的agent客户端配置
# vim /etc/puppet/puppet.conf --在[main]配置段加上下面一句
server = vm1.cluster.com --这是puppet服务器的主机名(别名会有问题,最好不用别名;必须绑定才能解析)
发送验证请求给服务端
# puppet agent --server=vm1.cluster.com --test --会产生创建ssl证书的信息
# ls /var/lib/puppet/ssl/certs/ --此目录会产生ca.pem文件
ca.pem
2,在服务端(vm1)上操作
列出验证请求
# puppet cert list
"vm2.cluster.com" (SHA256) 0D:FE:23:A0:BA:DC:59:74:95:A3:DD:0D:15:C3:68:1D:EC:9C:94:C5:49:9F:65:65:9A:1A:DB:EB:B4:C3:05:DD
"vm3.cluster.com" (SHA256) 36:A4:39:46:9D:09:BF:E7:96:D4:AE:A3:51:3B:C0:07:1A:E9:A1:A1:58:FB:DE:2F:28:09:1A:CD:9E:96:3B:1C
进行证书签名
# puppet cert --sign --all --对所有请求进行签名
3,再回到agent客户端操作(所有agent客户端都需要操作)
# puppet agent --server=vm1.cluster.com --test --再次验证请求
# ls /var/lib/puppet/ssl/certs/目录,又多了名为"主机名.pem"文件(如vm2.cluster.com上看到的是叫vm2.cluster.com.pem)
第三步:
测试
1.服务端配置:
# vim /etc/puppet/manifests/site.pp --此文件修改之后立即生效,无需重启vm1服务
node default { --default节点,代表默认所有节点
file { "/tmp/test.txt": --资源title,如果没有使用path参数,就默认使用这个为文件路径
content=> "hello,world\n", --指定文件内容,所以此文件不存在的话,也会帮你创建
}
}
2.客户端查看是否成功创建文件
由于puppet Agent端默认30分钟跟Master端进行同步配置文件,所以此处进行手动重启,查看是否成功
如果需要修改同步时间,在客户端的/etc/puppet/puppet.conf 的[agent]下加入runinterval = 3 ,表示3秒后同步
然后在agent上测试文件是否成功创建
# cat /tmp/test.txt
hello, world
如果同步推送有问题,在agent端使用下面的命令手动同步一下,会有相关的报错
# puppet agent --test --server vm1.cluster.com --daemon
# puppet agent --test --server vm1.cluster.com --no-daemonize --verbose
其它配置实例(参考语法文档路径为:http://docs.puppetlabs.com/references/latest/type.html)
例1,为不同节点创建不同内容的不同文件
node 'vm2.cluster.com' { --只针对vm2.cluster.com节点,需要单引号引起来
file { "/tmp/test.txt":
content=> "hahahaha\n",
}
}
node 'vm3.cluster.com' { --只针对vm3.cluster.com节点,需要单引号引起来
file { "/tmp/test1.txt":
content=> "hehehehe\n",
}
}
例2,为不同节点删除无用的文件
node 'vm2.cluster.com' {
file { "/tmp/test.txt":
ensure=> absent, --表示保证此文件不存在,如果存在,则删除(如果是删除一个目录,还要加一个force=> yes,才可以成功)
}
}
node 'vm3.cluster.com' {
file { "/tmp/test1.txt":
ensure=> absent,
}
}
例3,使用正则表达式为有相似名字的主机统一做一个软链接(目前版本不支持通配符,只支持正则表达式)
node /^vm\d+\.cluster\.com/ { --代表vmX.cluster.com的所有节点(X代表任意数字);你也可以把前面的正则换成简单点如 /^vm/或/cluster\.com$/
file { "/tmp/fstab":
ensure => link, --做软链接
target => "/etc/fstab", --软链接的源文件为/etc/fstab
}
}
例4,创建目录,并在目录内创建文件,并指定权限,owner,group等属性
node /\.cluster\.com$/ {
file { "/test/":
ensure => directory,
}
file { "/test/abc":
content => "haha\n",
mode => 4755,
owner => bin,
group => daemon,
}
}
例5,在例4的基础上,把/test/abc的文件内容改成客户端的/etc/fstab的文件内容
node /^vm\d+\.cluster\.com/ {
file { "/test/":
ensure => directory,
}
file { "/test/abc":
source => "/etc/fstab", --这里content改成了source
mode => 4755,
owner => bin,
group => daemon,
}
}
例6,创建user1用户(属性默认,就相当于在直接在agent客户机上useradd user1)
node /^vm\d+\.cluster\.com/ {
user { "user1":
ensure => present,
managehome => true, --表示会创建家目录
}
}
例7,删除user1用户,增加user2用户,增加group1组
node /^vm\d+\.cluster\.com/ {
user { "user1":
ensure => absent,
managehome => true, --表示删除用户时会删除家目录
}
user { "user2":
ensure => present,
uid => 505, ----指定uid=505,这里不要写gid=505,因为如果不存在505这个组,就会出问题
shell => "/sbin/nologin", ----指定shell 类型
home => "/user/user2" -----指定家目录
}
group { "group1":
ensure => present,
gid => 520,
}
}
例8,为客户端做crontab定时任务(客户端使用对应的用户crontab -l去验证)
node /^vm\d+\.cluster\.com/ {
cron { "cron1": --一个注释的名称
command => "/sbin/init 0", --时间任务要做的命令
user => "root", --什么用户身份
minute => "01",
hour => "21", --这是表示21点01分,其它的不写都会默认以*代替
}
}
例9:对客户端服务状态进行控制
node /^vm\d+\.cluster\.com/ {
service { sshd:
ensure => "stopped", --确认sshd服务要为关闭状态,启动了会帮你关闭
enable => false, --相当于做成systemctl disable sshd
}
service { httpd:
enable => true, --相当于做成systemctl enable httpd
}
}
例10:创建一个简单的脚本,并使用exec资源来执行它
node /^vm\d+\.cluster\.com/ {
file { "/shell/":
ensure => directory,
}
file { "/shell/1.sh":
content => "mkdir -p /test\ntouch /test/{1..100}\n",
mode => 755,
owner => root,
group => root,
}
exec { "exec-shell":
cwd => "/shell", --指定在哪个目录执行这个脚本
command => "sh 1.sh", --因为上一条指定了在/shell目录,所以这里用相对路径
user => "root", --执行这个脚本的身份
path => "/bin:/sbin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin", --执行这个脚本时的命令(如sh)的路径
}
}
例11:简单的推送yum配置文件,然后安装vsftpd软件包
node /^vm\d+\.cluster\.com/ {
file { "/etc/yum.repos.d/rhel-source.repo":
content => "[server]\nname=server\nbaseurl=file:///yum\nenabled=1\ngpgcheck=0\n",
mode => 644,
owner => root,
group => root,
}
package { 'install vsftpd':
provider => yum,
name => vsftpd,
ensure => installed,
}
}
例12:指定一个块设备挂载到一个目录
node default{
mount { "/mnt": --title,没有name参数则就代表挂载点
ensure=> mounted, --mounted表示此挂载不仅加到/etc/fstab,还会帮你挂载上去(还有present,unmounted,absent相关参数,自行参考文档)
device=> "UUID=3f1de712-7864-47ea-b0b4-9fa5781b2e88", --挂载设备的UUID,也可以直接写/dev/sdax
fstype=> ----挂载的文件类型
}
}
例13:修改/etc/hosts里其中一条记录(主机名不变,修改绑定的IP或别名)
node default{
host { "vm2.cluster.com": --针对所有agent里的/etc/hosts文件里绑定的vm2.cluster.com来进行修改
ip=> "20.1.1.4", --将其IP改为20.1.1.4(原来是20.1.1.4则保持不变)
host_aliases=> "vm2haha", --将其别名改为vm2haha(原来是vm2haha则保持不变)
}
}
例14:从配置yum,安装包,修改配置文件(要求拒绝匿名用户登录,所有普通用户支持chroot),启动服务并chkconfig on来实现vsftpd服务
node /^vm\d+\.cluster\.com/ {
file { "/etc/yum.repos.d/abc.repo":
content => "[server]\nname=server\nbaseurl=file:///yum\nenabled=1\ngpgcheck=0\n",
mode => 644,
owner => root,
group => root,
}
package { 'install vsftpd':
provider => yum,
name => vsftpd,
ensure => installed,
}
file { "/tmp/1.sh":
content => "sed -i '/^anonymous_enable/s/YES/NO/' /etc/vsftpd/vsftpd.conf\nsed -i '/chroot_local_user=YES/s/#//' /etc/vsftpd/vsftpd.conf\n",
}
exec { "exec-shell":
cwd => "/tmp",
command => "sh 1.sh; rm -rf 1.sh",
user => "root",
path => "/bin:/sbin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin",
}
service { vsftpd:
ensure => true,
enable => true,
}
}
例15:用模块来实现/etc/sudoers文件的推送
第一步:
在vm1建立模块相应的结构目录
# mkdir -p /etc/puppet/modules/sudo/{files,templates,manifests}
第二步:
在vm1上指定存放模块的路径
# vim /etc/puppet/puppet.conf --在[main]配置段下增加下面一句,指定模块的目录路径
modulepath = /etc/puppet/modules
第三步:
在vm1上指定相关的目录能被客户端访问的权限
# vim /etc/puppet/fileserver.conf
[sudo]
path /etc/puppet/modules/sudo
allow *
第四步:
在vm1上配置site.pp文件(指定要找的客户端资源)
# vim /etc/puppet/manifests/site.pp --指定导入nodes.pp文件,并指定$puppetserver变量的值为服务端的域名
import 'nodes.pp'
$puppetserver="vm1.cluster.com"
第五步:
在vm1上配置与site.pp同目录下的nodes.pp文件(大量节点时,可以按正则表达式配置所有的节点在这里,然后可以被site.pp调用)
# vim /etc/puppet/manifests/nodes.pp
node /\.cluster\.com$/ {
include sudo --这里表示.cluster.com$的所有节点要做的事情为sudo,它会调用下面配置的叫sudo的类
}
第六步:
在vm1上配置sudo模块的核心文件init.pp,指定要做的事情
--下面配置里的$operatingsystem变量的值会由facter返回
# vim /etc/puppet/modules/sudo/manifests/init.pp
class sudo{
package{ sudo:
provider => yum,
name => sudo,
ensure=> present,
}
if $operatingsystem in [ "RedHat","CentOS","Fedora" ] {
file { "/etc/sudoers":
owner => "root",
group => "root",
mode => 0440,
source => "puppet://$puppetserver/sudo/files/etc/sudoers",
require => package["sudo"],
}
} else {
fail("Doesn't support this OS: $operatingsystem")
}
}
第七步:
在vm1上准备好将要发送到所有agent客户端上的真实资源,建立与上面配置对应的目录,并修改你要发送的内容和修改相应的权限
# mkdir -p /etc/puppet/modules/sudo/files/etc
# cp /etc/sudoers /etc/puppet/modules/sudo/files/etc/sudoers --将这个拷后的文件做一定的修改,修改的内容就是你要推送到所有agent上的内容
# chown -R puppet /etc/puppet/modules/
第8步:
客户端验证
# puppet agent --test --server vm1.cluster.com --no-daemonize --verbose
或者直接去
cat /etc/sudoers 查看是否有你在服务端修改的内容
-----------------------------------------------------------------
练习:
按照上面的例15的方式做成一个模块,实现在所有的puppet的agent节点上实现:
1,配置yum
2,安装httpd*
5,服务启动,并开机自动启动
posted @ 2018-06-19 22:23  Sky-wings  阅读(484)  评论(0编辑  收藏  举报