1). 背景:
  集群部署的时候, 需要一致的配置和环境设置. 对于虚拟机集群, 可以借助镜像拷贝, 复制和还原集群机器. 对与物理机集群而言, 则不一样, 如果机器一多, 多人去操作和配置, 对于成熟精干的团队还好, 对于不熟悉环境的小团队, 由于水平的参差不齐, 往往会导致不一致的环境. 因此无论如何, 写脚本进行自动化的配置和环境校验总是最佳实践.

2). 假设应用场景:
*) 系统环境:
安装CDH5, 集群规模为16台机器, 每台机器16CPU, 内存16G, 2块SATA盘共500G, 操作系统为Centos 6.4.
集群机器, ip范围为192.168.1.101~192.168.1.116.

*) 基本要求
安装CDH5时, 需要满足以下基本要求
#) 需要配置每台机器的/etc/hosts文件, 使得每台机器拥有集群所有机器的域名
#) 需要关闭防火墙, 并禁止开启启动
#) 需要配置本地yum源
#) 磁盘分区尽量满足/mnt/disk{N}的形式
#) 机器时间基本同步

3). 具体实施
*) 配置集群的ssh无登录登录
选择一台中控机(跳板机), 或者集群的某台机器, 作为自动化脚本的发起端, 作为系统管理员, 采用root用户.
#) 本地创建RSA密钥, 产生RSA公钥/私钥对
mkdir -p ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa -P ''
默认生成id_rsa(私钥), id_rsa.pub(公钥)文件

#) 编辑脚本
ssh-copy-id -i id_rsa root@<target_ip>

#! /bin/bash
username="root"
server_ips=(
  "192.168.1.101" "192.168.1.102" "192.168.1.103" "192.168.1.104" "192.168.1.105"
  "192.168.1.106" "192.168.1.107" "192.168.1.108" "192.168.1.109" "192.168.1.110"
  "192.168.1.111" "192.168.1.112" "192.168.1.113" "192.168.1.114" "192.168.1.115"
  "192.168.1.116"
) for (( i = 0; i < ${#server_ips[*]}; i++ )); do
  ssh-copy-id -i ~/.ssh/id_rsa $username@${server_ips[i]}
done

执行, 当然这步还是痛苦的, 需要手动输入16次密码(16台机器).

#) 开启RSA验证
编辑/etc/ssh/sshd_conf

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys GSSAPIAuthentication no
UseDNS no

前三项, 用于开启RSA服务, 后两项用于解决初始连接SSH响应慢的问题

#) 重启ssh服务
service sshd restart

*) 编写自动化脚本

#! /bin/bash

username="root"

server_ips=(
  "192.168.1.101" "192.168.1.102" "192.168.1.103" "192.168.1.104" "192.168.1.105"
  "192.168.1.106" "192.168.1.107" "192.168.1.108" "192.168.1.109" "192.168.1.110"
  "192.168.1.111" "192.168.1.112" "192.168.1.113" "192.168.1.114" "192.168.1.115"
  "192.168.1.116"
) # description:
#   在各个节点上, 执行命令, 并把执行结果汇总到一个文件中, 便于对比
# params:
#   $1 => command, 要执行的命令
#   $2 => filename, 要保存输出结果的文件, 用于结果对比
execute_all_servers() {
  ssh_command=$1
  result_file=$2
  echo "start execute..." > $result_file
  for (( i = 0; i < ${#server_ips[*]}; i++ )); do
    echo "server_ip: ${server_ips[i]}, execute command: '$ssh_command'" >> $result_file
    ssh $username@${server_ips[i]} "$ssh_command" >> $result_file
    echo "=================================" >> $result_file
  done
}

#) 检测/etc/hosts文件
execute_all_servers "cat /etc/hosts" "check_hosts_result.log"

#) 磁盘分区和挂载检测
execute_all_servers "df -h ; fdisk -l" "check_fdisk_result.log"

#) 防火墙关闭检测
execute_all_servers "service iptables status" "check_iptable_result.log"

#) 防火墙关闭命令
execute_all_servers "service iptables stop ; chkconfig --levels 235 iptables off" "stop_iptables_result.log"

其他需要加的环境检测和环境配置, 皆可采用类似的方式去实现, 这并非完美, 只是提供了一种解决思路

最新文章

  1. Android入门(八)广播
  2. Unity3D 开发 之 JDK安装与环境变量配置
  3. 字符串长度函数strlen()
  4. django internal search
  5. apache开源项目--Mavibot
  6. iOS 并行编程:GCD Dispatch Sources
  7. docker 1.10.3 里php出现 curl 56错误码问题解决
  8. CRM需要注意的一些事,修改字段类型
  9. SUID,SGID,SBIT这些到底是什么
  10. python requirements使用方法
  11. 使用text-overflow: ellipsis 处理文本溢的一个小问题
  12. python 词云学习
  13. 老男孩Python九期全栈学习笔记4
  14. 关于TCP和MQTT之间的转换(转载)
  15. JDBC动态查询MySQL中的表(按条件筛选)
  16. jenkins--svn+Email自动触发1(作业设置)
  17. c++中“箭头(-&gt;)”和“点号(.)”操作符的区别
  18. 03-03 java 顺序语句结构,选择结构if语句
  19. 将 MyBatis3 的支持添加到 Spring
  20. extern &quot;C&quot; 的用意

热门文章

  1. Fence9
  2. ie9,10 uploadify cleanUp bug
  3. 宜家的幸福生活,源于K2 BPM的支撑
  4. Android 查看webview里面的图片
  5. APC to USB
  6. ODI中显示us7ascii字符集的测试
  7. XAMPP启动mysql遇到的问题
  8. Android布局— — —线性布局
  9. poj1651 区间dp
  10. Codeforces Round #230 (Div. 2) 解题报告