|
自动化运维
如果上千台机器需要互相绑定主机名到/etc/hosts,有什么方法?
1, 内网DNS
2, shell expect ssh-kengen (nis ldap用户集中化管理)
3, 通过软件进行推送(puppet chef cfengine)
如果这上千台机器(可能操作系统不一样,或者版本不一样)需要安装一个软件,用脚本来做行吗?
不同平台写的脚本不通用,但是puppet可以做版本,平台的判断,然后执行不同的动作
如果上千台机器都要创建一个文件,用脚本来做效率高吗?
脚本做的话是按照循环一个一个的做,效率不高.puppet是可以结合队列实现并发同时操作。
=======================================================================
安装前准备:一个server,两个client
1,主机名绑定
cat /etc/hosts
10.1.1.3 puppetmaster.cluster.com puppetmaster
10.1.1.4 agent1.cluster.com agent1
10.1.1.5 agent2.cluster.com agent2
2,时间同步
3,静态IP
4,关闭iptables,selinux
5,配置本地yum源
第一步:
在原来本地yum源的基础上加上puppet的yum源
rpm版的安装软件包的官方路径为:
http://yum.puppetlabs.com/el/6.5/products/x86_64/
http://yum.puppetlabs.com/el/6.5/dependencies/x86_64/
配置yum,使用reposync下载这两个yum仓库(但是安装puppet仍然少了两个软件包,一个为rubygem-json-1.5.5-3.el6.x86_64.rpm,另一个为rubygems-1.3.7-2.3.noarch.rpm
这两个包可以去rpm.pbone.net或rpmfind.net去搜索下载)
我这里已经把这两个包下载并且做好了本地的yum源(把这两个包加入到下载目录,并删除repodata目录,并重新createrepo生成)
我的本地yum源路径为:(我这里是使用nfs共享的)
/share/soft/puppet
/share/soft/puppet-dependencies/
我这里在我的宿主机做了http的alias跳转
[puppet]
name=puppet
baseurl=http://10.1.1.35/puppet
enabled=1
gpgcheck=0
[puppet-dependencies]
name=puppet-dependencies
baseurl=http://10.1.1.35/puppet-dependencies
enabled=1
gpgcheck=0
第二步:安装puppet方法
配置好yum源后
在puppetmaster上
# yum install puppet-server -y
# /etc/init.d/puppetmaster restart
# lsof -i:8140
在所有的agent上
# yum install puppet -y
# /etc/init.d/puppet restart
第三大步:
1,在所有的agent客户端配置认证
# vim /etc/puppet/puppet.conf --在[main]配置段加上下面一句
server = puppetmaster.cluster.com --这是puppet服务器的主机名(必须绑定才能解析)
发送验证请求给服务端
# puppet agent --server=puppetmaster.cluster.com --test --会产生创建ssl证书的信息
客户端查看
# ll /var/lib/puppet/ssl/certs/目录,会产生了ca.pem文件
2,在服务端操作
列出验证请求
# puppet cert list
"agent1.cluster.com" (SHA256) CC:66:AB:0F:70:C0:AF:89:74:6E:71:74:56:B4:C4:8A:21:1D:C0:2D:98:79:B0:A3:49:7A:38:43:ED:5B:55:5D
"agent2.cluster.com" (SHA256) BB:CB:6F:A6:34:2A:7E:AA:A0:A4:C3:90:67:8D:6A:02:E5:AD:4B:1A:68:B2:67:B2:0B:C3:AB:52:E6:20:5C:65
进行证书签名
# puppet cert --sign --all --对所有请求进行签名
3,再回到客户端操作(所有客户端都需要操作)
# puppet agent --server=puppetmaster.cluster.com --test --再次验证请求
客户端查看
#ll /var/lib/puppet/ssl/certs/目录,又多了名为"主机名.pem"文件(如agent1.cluster.com上看到的是叫agent1.cluster.com.pem.)
第四大步:
测试
1.服务端配置:
# vim /etc/puppet/manifests/site.pp --此文件修改之后立即生效,无需重启puppetmaster服务
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秒后同步
# service puppet restart
# cat /tmp/test.txt
hello, world
如果同步推送有问题,在agent端使用下面的命令手动同步一下,会有相关的报错
# puppet agent --test --server puppetmaster.cluster.com
其它配置实例(参考语法文档路径为:http://docs.puppetlabs.com/references/latest/type.html)
例1,为不同节点创建不同内容的不同文件
node 'agent1.cluster.com' { --只针对agent1.cluster.com节点,需要单引号引起来
file { "/tmp/test.txt":
content=> "hahahaha\n",
}
}
node 'agent2.cluster.com' { --只针对agent2.cluster.com节点,需要单引号引起来
file { "/tmp/test1.txt":
content=> "hehehehe\n",
}
}
例2,为不同节点删除无用的文件
node 'agent1.cluster.com' {
file { "/tmp/test.txt":
ensure=> absent, --表示保证此文件不存在,如果存在,则删除
}
}
node 'agent2.cluster.com' {
file { "/tmp/test1.txt":
ensure=> absent,
}
}
例3,使用正则表达式为有相似名字的主机统一做一个软链接(目前版本不支持通配符,只支持正则表达式)
node /^agent\d+\.cluster\.com/ { --代表agentX.cluster.com的所有节点(X代表任意数字);你也可以把前面的正则换成简单点如 /^agent/或/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 /^agent\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 /^agent\d+\.cluster\.com/ {
user { "user1":
ensure => present,
managehome => true, --表示会创建家目录
}
}
例7,删除user1用户,增加user2用户,增加group1组
node /^agent\d+\.cluster\.com/ {
user { "user1":
ensure => absent,
}
user { "user2":
ensure => present,
uid => 505, --指定uid=505,这里不要写gid=505,因为如果不存在505这个组,就会出问题
shell => "/sbin/nologin",
}
group { "group1":
ensure => present,
gid => 520,
}
}
例8,为客户端做crontab定时任务(客户端使用对应的用户crontab -l去验证)
node /^agent\d+\.cluster\.com/ {
cron { "cron1": --一个注释的名称
command => "/sbin/init 0", --时间任务要做的命令
user => "root", --什么用户身份
minute => "01",
hour => "21", --这是表示21点01分,其它的不写都会默认以*代替
}
}
例9:对客户端服务状态进行控制
node /^agent\d+\.cluster\.com/ {
service { iptables:
ensure => "stopped", --确认iptables服务要为关闭状态,启动了会帮你关闭
}
service { nfs:
ensure => "running", --确认nfs服务为开启状态,关闭了会帮你启动
}
}
例10:创建一个简单的脚本,并使用exec资源来执行它
node /^agent\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 /^agent\d+\.cluster\.com/ {
file { "/etc/yum.repos.d/rhel-source.repo":
content => "[server]\nname=server\nbaseurl=ftp://10.1.1.35\nenabled=1\ngpgcheck=0\n",
mode => 644,
owner => root,
group => root,
}
package { 'install vsftpd':
provider => yum,
name => vsftpd,
ensure => installed,
}
}
例12:用模块来实现/etc/sudoers文件的推送
第一步:
建立模块相应的结构目录
# mkdir -p /etc/puppet/modules/sudo/{files,templates,manifests}
第二步:
配置site.pp文件(指定要找的客户端资源)
# vim /etc/puppet/manifests/site.pp --指定导入nodes.pp文件,并指定$puppetserver变量的值为服务端的域名
import 'nodes.pp'
$puppetserver="puppetmaster.cluster.com"
第三步:
配置与site.pp同目录下的nodes.pp文件(大量节点时,可以按正则表达式配置所有的节点在这里,然后可以被site.pp调用)
# vim /etc/puppet/manifests/nodes.pp
node /\.cluster\.com$/ {
include sudo --这里表示agentX.cluster.com的所有节点要做的事情为sudo,它会调用下面配置的叫sudo的类
}
第四步:
配置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")
}
}
第五步:
# vim /etc/puppet/puppet.conf --在[main]配置段下增加下面一句,指定模块的目录路径
modulepath = /etc/puppet/modules
第六步:
指定相关的目录能被客户端访问的权限
# vim /etc/puppet/fileserver.conf
[sudo]
path /etc/puppet/modules/sudo
allow *
第七步:
准备好将要发送到所有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/
# /etc/init.d/puppetmaster restart
第8步:
客户端验证
# puppet agent --test --server puppetmaster.cluster.com --no-daemonize --verbose
或者直接去
cat /etc/sudoers 查看是否有你在服务端修改的内容
====================================================================
练习:
在所有的puppet的agent节点上实现:
1,配置yum
2,安装httpd*
3, 修改httpd的家目录为/web,并在每一个家目录里产生主页index.html文件,里面的内容写上web$IP主页($IP为agent节点的IP的最后一个数字)
4,服务启动,并开机自动启动
答案:
1,# mkdir -p /etc/puppet/modules/httpd/{files,templates,manifests}
2,# vim /etc/puppet/manifests/site.pp
import 'nodes.pp'
$puppetserver="puppetmaster.cluster.com"
3,# vim /etc/puppet/manifests/nodes.pp
node /\.cluster\.com$/ {
include httpd
}
4,# vim /etc/puppet/modules/httpd/manifests/init.pp
class httpd {
file { "/etc/yum.repos.d/rhel-source.repo":
content => "[server]\nname=server\nbaseurl=ftp://10.1.1.35\nenabled=1\ngpgcheck=0\n",
mode => 644,
owner => root,
group => root,
}
file { "/web":
ensure => directory,
}
file { "/tmp/1.sh":
content => "#!/bin/bash\nip=`ifconfig eth1 |grep Bcast |awk -F: '{print \$2}' |awk '{print \$1}' |awk -F. '{print \$4}'`\necho web\$ip > /web/index.html\n",
mode => 755,
owner => root,
group => root,
}
exec { "exec-shell":
cwd => "/tmp",
command => "sh 1.sh",
user => "root",
path => "/bin:/sbin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin",
}
package { 'install httpd':
provider => yum,
name => httpd,
ensure => installed,
}
if $operatingsystem in [ "RedHat","CentOS","Fedora" ] {
file { "/etc/httpd/conf/httpd.conf":
owner => "root",
group => "root",
mode => 0440,
source => "puppet://$puppetserver/httpd/files/etc/httpd.conf",
require => package["httpd"],
}
} else {
fail("Doesn't support this OS: $operatingsystem")
}
service { httpd:
ensure => "running",
enable => true,
}
}
5,# vim /etc/puppet/puppet.conf
modulepath = /etc/puppet/modules
6,# vim /etc/puppet/fileserver.conf
[sudo]
path /etc/puppet/modules/sudo
allow *
[httpd]
path /etc/puppet/modules/httpd
allow *
7,# mkdir -p /etc/puppet/modules/httpd/files/etc
# cp /etc/httpd/conf/httpd.conf /etc/puppet/modules/httpd/files/etc/httpd.conf --拷过来后,把家目录改为/web
# chown -R puppet /etc/puppet/modules/
# /etc/init.d/puppetmaster reload
======================================================================
puppet还有一些相关插件,可以课后自己去查找资源测试实现
如
1, web报告查看
2, activeMQ+mcollective实现队列高效推送
3, web管理工具
等等
附扩展: puppet-dashboard图形查看报告的一个简易配置
第一步:
在puppetmaster上安装相关软件包
# yum install puppet-dashboard ruby-mysql mysql-server
第二步:
# /etc/init.d/mysqld restart
mysql> create database dashboard character set utf8;
mysql> grant all on dashboard.* to 'dashboard'@'localhost' identified by '123';
mysql> flush privileges;
第三步:配置连接mysql的用户名,密码等
# vim /usr/share/puppet-dashboard/config/database.yml
production:
database: dashboard
username: dashboard
password: 123
encoding: utf8
adapter: mysql
第四步
导入mysql数据
# cd /usr/share/puppet-dashboard/
# rake gems:refresh_specs
# rake RAILS_ENV=production db:migrate
第五步:启动服务
# /etc/init.d/httpd stop
# /etc/init.d/puppetmaster restart
# /etc/init.d/puppet-dashboard restart
然后就可以使用firefox访问http://IP:3000
第六步:手工导入报告
# cd /usr/share/puppet-dashboard
# rake RAILS_ENV=production reports:import
(in /usr/share/puppet-dashboard)
Importing 513 reports from /var/lib/puppet/reports in the background
Importing: 100% |############################################| Time: 00:00:01
513 of 513 reports queued
|
|