Rancher离线一键化安装部署脚本

版本选择

CentOs 7.4 

Rancher 2.3.3 

Docker 17.09

Harbor 1.9.2

Kubectl v1.17.3

Kubernetes v1.16.3 (rke自带)

基本思想

配置证书、免密>>安装代理nginx>>安装Harbor>>安装docker>>rke安装Rancher>>安装kubectl

注:新版本采用helm方式安装,原理基本相通,需要改进部分脚本

以下为主安装脚本install.sh

#!/bin/bash
#脚本根目录
base_dir=$(cd "$(dirname "$0")"; pwd)
#本地IP
net_int=$(ls /etc/sysconfig/network-scripts/ | grep ifcfg- | grep -v ifcfg-lo | awk -F '-' '{print $2}')
local_ip=$(ifconfig ${net_int}|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "addr:")

#本地生成ssh私钥/密钥
echo y | ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa

#从配置文件中获得IP
function get_ip()
{
  str=$1
  check_comma=$(echo $str | grep "\,")
  check_brackets=$(echo $str | grep "\[")
  #不支持既包含连续又包含非连续的地址段
  if [[ "$check_brackets" != "" && "$check_comma" != ""  ]];then
    echo "please wait....!"
    exit 1
  elif [[ "$check_brackets" != "" ]];then
    prefix=${str%[*}; temp=${str#*[}
    first=${temp%-*}; temp=${temp%]*}
    last=${temp#*-}
    index=0
    for (( i=$first;i<=$last;i++ ))
    do
      IPS[$index]=${prefix}${i}
      let index++
   done
  elif [[ "$check_comma" != "" ]];then
    LD_IFS="$IFS"; IFS=","
    IPS=($str)
    IFS="$OLD_IFS" 
  else
    IPS[0]=$str
  fi
  echo ${IPS[*]}
}

#生成证书
function create_cert()
{
 # yum remove openssl -y
  yum localinstall ./rpm/openssl/*.rpm -y
  yum localinstall ./rpm/expect/*.rpm -y
  cd ${base_dir}/cert
  
  openssl genrsa -out ${base_dir}/cert/server.key 1024
  /bin/expect $base_dir/cert/https.sh
  openssl x509 -req  -days 365 -sha256 -extfile ${base_dir}/cert/openssl.cnf -extensions v3_req   -in ${base_dir}/cert/server.csr -signkey ${base_dir}/cert/server.key -out ${base_dir}/cert/server.crt
openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650
  cd $base_dir
  echo "create cert susscess!"
}


#配置ansible
function ansible_hosts()
{
  #master节点
  temp_dest=""
  temp_cluster=""
  for master in ${MASTERS[*]}
   do
    if [[ "${local_ip}" == "${master}" ]];then
      temp_dest="${local_ip} ansible_ssh_user=\"root\" ansible_ssh_pass=\"${password}\" \n"
      temp_cluster="${local_ip} ansible_ssh_user=\"rancher\" ansible_ssh_pass=\"${password}\" \n"
    else
      dest_ip=${dest_ip}"${master} ansible_ssh_user=\"root\" ansible_ssh_pass=\"${password}\" \n"
      cluster_ip=${cluster_ip}"${master} ansible_ssh_user=\"rancher\" ansible_ssh_pass=\"${password}\" \n"
    fi
  done

  for worker in ${WORKERS[*]}
   do
    if [[ "${local_ip}" == "${worker}" ]];then
      temp_dest="${local_ip} ansible_ssh_user=\"root\" ansible_ssh_pass=\"${password}\" \n"
      temp_cluster="${local_ip} ansible_ssh_user=\"rancher\" ansible_ssh_pass=\"${password}\" \n"
    else
      dest_ip=${dest_ip}"${worker} ansible_ssh_user=\"root\" ansible_ssh_pass=\"${password}\" \n"
      cluster_ip=${cluster_ip}"${worker} ansible_ssh_user=\"rancher\" ansible_ssh_pass=\"${password}\" \n"
    fi
  done
  sed -i "s//${dest_ip}/g" ${base_dir}/conf/ansible_hosts
  sed -i "s//${dest_ip}${temp_dest}/g" ${base_dir}/conf/ansible_hosts
  sed -i "s//${cluster_ip}${temp_cluster}/g" ${base_dir}/conf/ansible_hosts
}

#安装ansible
function exec_ansible_config_cluster()
{
  yum localinstall ./rpm/ansible/*.rpm -y
  #ansible_home=/etc/ansible
  #配置hosts
  ansible_hosts
  /bin/cp $base_dir/conf/ansible_hosts  ${ansible_home}/hosts
  #配置初次ssh不进行校验
  sed -i "s/#host_key_checking = False/host_key_checking = False/g" ${ansible_home}/ansible.cfg 
  #执行安装
  ansible-playbook -i $ansible_home/hosts ${base_dir}/conf/playbook-config.yml --extra-vars="basedir=${base_dir}"
}


#安装rke
function init_cluster()
{
  /bin/cp $base_dir/rke /usr/local/bin/
  chmod +x /usr/local/bin/rke
  #安装集群
  chmod 775 $base_dir/cert/server.crt
  crt=$(cat $base_dir/cert/server.crt | base64 -w0)
  sed -i "s//${crt}/g" $base_dir/conf/rancher-cluster.yml

  #master节点
  for master in ${MASTERS[*]}
  do
    temp=${temp}"- address: ${master}\n    user: rancher\n    role: [controlplane,etcd,worker]\n    ssh_key_path: \/root\/.ssh\/id_rsa\n  "
  done
  #worker节点
  #WORKERS=(192.168.1.4 192.168.1.5)
  for worker in ${WORKERS[*]}
  do
    temp=${temp}"- address: ${worker}\n    user: rancher\n    role: [worker]\n    ssh_key_path: \/root\/.ssh\/id_rsa\n  "
  done
  sed -i "s//${temp%\\*}/g" $base_dir/conf/rancher-cluster.yml

  rke up --config $base_dir/conf/rancher-cluster.yml
  temp=$?
  if [ $temp=0 ];then
    echo "rke Install successed!"
  else
    echo "rke Install failed!"
    exit 1
  fi
}


#安装nginx并配置
function install_nginx()
{
  yum localinstall ./rpm/nginx/*.rpm -y
  #配置nginx
  for master in ${MASTERS[*]}
   do
    upstream_ip=${upstream_ip}"    server ${master}:80;\n"
  done

  sed -i "s//${upstream_ip}/g" ${base_dir}/conf/rancher-nginx.conf
  /bin/cp ${base_dir}/conf/rancher-nginx.conf /etc/nginx/conf.d/
  
  systemctl restart nginx
  nginx -s reload
}

function set_domain()
{
  domain=`sed '/^domain=/!d;s/.*=//' ${base_dir}/conf/config`
  echo "set the domain: ${domain}"

  #替换域名
  sed -i "s//${domain}/g" ${base_dir}/conf/rancher-cluster.yml
  sed -i "s//${domain}/g" ${base_dir}/conf/rancher-nginx.conf
  sed -i "s//${domain}/g" ${base_dir}/cert/*
  #修改替换HarborIP 
  sed -i "s/HARBOR_IP/${harbor_ip}/g" ./set_conf.sh
  sed -i "s/HARBOR_IP/${harbor_ip}/g" ./set_harbor.sh
  sed -i "s/HARBOR_IP/${harbor_ip}/g" ./conf/rancher-cluster.yml
  #修改替换密码
  sed -i "s/PASSWORD/${password}/g" ./set_conf.sh
  sed -i "s/PASSWORD/${password}/g" ./set_harbor.sh 
  #配置hosts DNS
  echo "${local_ip}  ${domain}" >> ${base_dir}/conf/hosts
}


#再次安装还原信息
function restore_conf()
{
  /bin/cp ${base_dir}/conf/ansible_hosts.bak ${base_dir}/conf/ansible_hosts
  /bin/cp ${base_dir}/conf/rancher-cluster.yml.bak ${base_dir}/conf/rancher-cluster.yml
  /bin/cp ${base_dir}/conf/rancher-nginx.conf.bak ${base_dir}/conf/rancher-nginx.conf
  /bin/cp ${base_dir}/conf/hosts.bak ${base_dir}/conf/hosts 
  /bin/cp ${base_dir}/cert/openssl.cnf.bak ${base_dir}/cert/openssl.cnf
  /bin/cp ${base_dir}/conf/set_conf.sh.bak ${base_dir}/set_conf.sh
  /bin/cp ${base_dir}/conf/set_harbor.sh.bak ${base_dir}/set_harbor.sh
}

#安装kubectl
function install_kubectl()
{
  #执行安装kubectl
  ansible-playbook -i ${ansible_home}/hosts ${base_dir}/conf/playbook-kubectl.yml
  
  #配置cattle-agent  DNS
  #kubectl -n cattle-system patch  daemonsets cattle-node-agent --patch '{"spec": {"template": {"spec": {"hostAliases": [{"hostnames":["${domain}"],"ip": "${local_ip}"}]}}}}'
  #kubectl -n cattle-system patch  deployments cattle-cluster-agent --patch '{"spec": {"template": {"spec": {"hostAliases": [{"hostnames":["${domain}"],"ip": "${local_ip}"}]}}}}'    
}

function install_harbor(){
  #配置免密
  /usr/bin/expect <<-EOF
     set timeout 20
     spawn ssh-copy-id -oStrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub root@${harbor_ip}
     expect {
        "*password:" { send "${password}\r" }
     }
     expect eof
EOF
  #节点安装harbor
  scp -r  ${base_dir}/harbor-offline-installer-v1.9.2.tgz ${base_dir}/rancher-images.tar ${base_dir}/docker-compose ${base_dir}/rpm/docker ${base_dir}/rancher-images.txt  ${base_dir}/set_harbor.sh   ${harbor_ip}:/opt 
  ssh root@"${harbor_ip}" "cd /opt;./set_harbor.sh;"
}


#从配置文件中获得IP
master_temp=`sed '/^master=/!d;s/.*=//' ${base_dir}/conf/config`
MASTERS=`get_ip $master_temp`
worker_temp=`sed '/^work=/!d;s/.*=//' ${base_dir}/conf/config`
WORKERS=`get_ip $worker_temp`
harbor_ip=`sed '/^harbor_ip=/!d;s/.*=//' ${base_dir}/conf/config`
password=`sed '/^password=/!d;s/.*=//' ${base_dir}/conf/config`
ansible_home=/etc/ansible
#close firewalld
systemctl stop firewalld
systemctl disable firewalld

#还原信息
restore_conf
#替换域名
set_domain
#生成证书
create_cert
#安装并配置nginx
install_nginx
#安装docker环境及harbor仓库
install_harbor
#通过ansible配置基础环境
exec_ansible_config_cluster
#初始化集群
init_cluster
#安装并配置kubectl
install_kubectl

如下是安装harbor仓库脚本

#!/bin/bash


#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

#关闭selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

#开启服务器转发
modprobe br_netfilter
echo "net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
sysctl -p

#关闭swap
swapoff -a
sed -i '/swap/s/^/#/g' /etc/fstab

#开启cgroups
sed -i '/GRUB_CMDLINE_LINUX/d' /etc/default/grub
echo 'GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"' >> /etc/default/grub


#安装docker
function  install_docker(){
#yum remove libcgroup -y
yum localinstall /opt/docker/*.rpm -y
cp /opt/docker-compose /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
systemctl start docker
}
#安装Harbor
function  install_harbor(){
tar -zxvf /opt/harbor-offline-installer-v1.9.2.tgz
sed -i   "s/reg.mydomain.com/HARBOR_IP/g" /opt/harbor/harbor.yml
./harbor/install.sh
}
#配置仓库
function  config_harbor_login(){
cat > /etc/docker/daemon.json <> /dev/null
usermod -G docker rancher

install_docker
install_harbor
config_harbor_login
check_harbor
docker_login

安装docker脚本

#!/bin/bash

net_int=$(ls /etc/sysconfig/network-scripts/ | grep ifcfg- | grep -v ifcfg-lo | awk -F '-' '{print $2}')
local_ip=$(ifconfig ${net_int}|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "addr:")

#设置主机名
hostnamectl set-hostname "rancher${local_ip##*.}.inspur.com"

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

#关闭selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

#开启服务器转发
modprobe br_netfilter
echo "net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
sysctl -p

#关闭swap
swapoff -a
sed -i '/swap/s/^/#/g' /etc/fstab

#开启cgroups
sed -i '/GRUB_CMDLINE_LINUX/d' /etc/default/grub
echo 'GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"' >> /etc/default/grub


#安装docker
#yum remove libcgroup -y
yum localinstall /opt/rpm/docker/*.rpm -y
systemctl start docker
#安装helm
cp /opt/helm /usr/local/bin/
chmod +x /usr/local/bin/helm 
#配置仓库
cat > /etc/docker/daemon.json <> /dev/null
usermod -G docker rancher


安装包可以通过这里下载https://download.csdn.net/download/tamako0v0/12668118

由于安装包镜像太大,不方便传输,故将所需镜像写入rancher-images.txt文件,可以通过docker pull 直接拉取

你可能感兴趣的:(Rancher)