自由论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 983|回复: 0
打印 上一主题 下一主题

【学习笔记】云计算(一)

[复制链接]

85

主题

97

帖子

9829

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9829
跳转到指定楼层
楼主
发表于 2016-4-24 16:49:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自动化运维

如果上千台机器需要互相绑定主机名到/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


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Prostar Inc.

GMT+8, 2024-11-22 14:42 , Processed in 0.036118 second(s), 9 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表