模拟跳板机管理部署web项目并实现网络存储数据同步
从0开始
代号master/jump10机器远程一键脚本化部署这5台机器代号13-17
13-15部署web项目并挂载
安装nginx nfs工具,挂载nfs到nginx资源根目录
注意细节:创建系统进程用户和nfs映射用户Uid和Pid相同免映射。以便提供目录权限
服务跑起 nginx
rsync-17
安装部署rysnc服务
创建配置rsync同步备份模块目录 认证用户密码文件及600权限修改
服务跑起 rysnc
nfs-16 + lsync实时同步
安装rsync确保lsyncd能同步到备份服务器 nfs共享目录
配置nfs共享模块及映射用户和目录权限,及可挂载映射范围
lsyncd配置本地nfs共享目录检测能实时同步到rsync备份模块
服务跑起 lsync nfs
检查整体架构的应用可用性
nginx入口资源访问
写入到nfs
同步备份到rsync
部署流程图解
脚本部署
##master/jump与被管理机安全
1.master-10机器关掉密码认证,有且只能通过交换公私钥登录
2.所有主机的ssh端口全修改隐私为端口10086
3.被管理的机器关掉密码认证,只能公钥模式登录(默认开启)。且只能通过内网连接会话
PC端安装git配置ssh免密连接jump10。进行jump安全设置,关掉密码登录。
ssh-keygen.exe
ssh-copy-id root@10.0.0.10
vim /etc/ssh/sshd_config 修改为PasswordAuthentication no
logout 登出会话重新登录
ssh root@10.0.0.10
在jump10配置ssh免密到13-17
【坑】注意脚本需在测试环境跑一遍验证使用情况,检查命令代码是否有误,bash执行相对作用域权限范围小点。跑之前保证机器在线
++++++++++++vim autoPreNoPasswdSsh.sh+++++++++++++++
#!/bin/bash
#定义内网字符串数组 var=(“” “”)
servers=(“root@172.16.1.13” “root@172.16.1.14” “root@172.16.1.15” “root@172.16.1.16” “root@172.16.1.17”)
#测试为普通文件则为真
if [ -f /root/.ssh/id_rsa ];
then
echo “密钥对已经存在,请检查远端’${servers[@]}'是否已免密化”
exit 1
fi
#非交互式生成密钥对 名字尽量和默认生成名字一样这是固定默认条件,不然默认找不到密钥文件 参数 -t --type -n --newPass
ssh-keygen -t rsa -f /root/.ssh/id_rsa -N “”
#安装ssh非交互输入式密码输入工具sshpass ;
yum -y install sshpass
#【坑】字符串数组 整体引用 “
v
a
r
s
[
@
]
"
f
o
r
s
e
r
v
e
r
i
n
"
{vars[@]}" for server in "
vars[@]"forserverin"{servers[@]}”; do
#防止由于服务器名中包含空格或特殊字符""括起来
echo “正在发送公钥搭到KaTeX parse error: Expected 'EOF', got '#' at position 10: server" #̲【坑】-o StrictHos…server” -o StrictHostKeyChecking=no > /tmp/noPasswdSsh.log 2>&1
done
echo “公密钥已分发,正在验证登录******”
for server in “${servers[@]}”;do
echo “ssh $server hostname
:$server免密验证成功”
done
这里讲一讲脚本,shell环境。配置文件和alias关系
#脚本。是本质是定义变量和定义命令的集合。
#脚本执行.=source不创建独立子shell环境;bash 和文件内部#!/bin/bash指定解释器为bash则会创建独立子shell环境
#配置文件。这里讲用户配置文件用户登录时会加载系统和用户配置文件。
#理解
#运行环境:./和bash执行脚本=固定创建了指定独立的解释器shell环境。
#而source.没有新建shell会话,而source file 能直接再加载一遍当前shell系统用户配置文件
#配置文件应用范围。source .执行时共享shell解释器和及自定义配置文件内容;指定bash环境则独#立继承出一个临时的作用域shell环境。所以不会直接加载父shell配置文件定义。不会解析用户alias配置。更不会加载系统级配置文件定义。
#alias别名。原理本质上一次性解析映射对应的命令字符,所以不可以从变量中提取拼接映射,而变量提取的字符拼接可以自动为执行命令。所以alias适用用户交互式 Shell 会话,并不适用于脚本。子shell也不会解析用户alias配置,但是可以加载出变量定义
echo “alias正在为您设置快捷登录命令”
#保持配置文件备份习惯
cp /root/.bashrc{,.bak}
cat >> /root/.bashrc << ‘EOF’
alias ssh13=“ssh root@172.16.1.13 -p 10086”
alias ssh14=“ssh root@172.16.1.14 -p 10086”
alias ssh15=“ssh root@172.16.1.15 -p 10086”
alias ssh16=“ssh root@172.16.1.16 -p 10086”
alias ssh17=“ssh root@172.16.1.17 -p 10086”
EOF
#【坑】这里子shell可以起到刷新配置文件作用。如果是系统配置文件 子shell无权刷新,简而言之独立子shell作用域范围稍微低一点点
#刷新用户配置文件
source /root/.bashrc
#双数组下标引用。具体引用某一个数组元素${logmds[i]}
logcmds=(“ssh13” “ssh14” “ssh15” “ssh16” “ssh17”)
#利用下标引用俩个数组 | KaTeX parse error: Expected '}', got '#' at position 2: {#̲servers[@]}表示数组…{#servers[@]}; i++)); do
echo “
s
e
r
v
e
r
s
[
i
]
快捷登录命令:
{servers[i]}快捷登录命令:
servers[i]快捷登录命令:{logcmds[i]}设置成功”
done
#修改远端ssh端口10086,关掉端口不影响公钥模式登录,添加入口规则只有内网IP可以放行
#入口安全控制iptables Access source --package数据包协议 iptables -P INPUT DROP
#ssh13 “iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 10086 -j ACCEPT”
#ssh17 “iptables -A INPUT -s 172.16.1.10 -p tcp --dport 10086 -j ACCEPT”;“iptables-save > /etc/sysconfig/iptables”
#远程修改端口
##ssh 10.0.0.14 没有指定用户名,系统会默认使用当前本地用户的用户名来尝试连接远程主机
for ip in {13…17}; do
echo "修改172.16.1.
i
p
s
s
h
为
10086
端口中
.
.
.
"
s
s
h
172.16.1.
{ip}ssh为10086端口中..." ssh 172.16.1.
ipssh为10086端口中..."ssh172.16.1.{ip} “sed -i -r ‘/^#?Port 22/c Port 10086’ /etc/ssh/sshd_config”
done
echo ‘=端口修改完成=======’
#远程修改ssh配置文件 不允许密码登录允许公钥登录
for ip in {13…17}; do
echo "禁用密码验证登录…机器172.16.1.
i
p
"
s
s
h
172.16.1.
{ip}" ssh 172.16.1.
ip"ssh172.16.1.{ip} “sed -i -r ‘/^#?PasswordAuthentication/c PasswordAuthentication no’ /etc/ssh/sshd_config”
echo "允许公钥登录中…机器172.16.1.
i
p
"
s
s
h
172.16.1.
{ip}" ssh 172.16.1.
ip"ssh172.16.1.{ip} “sed -i -r ‘/^#?PubkeyAuthentication/c PubkeyAuthentication yes’ /etc/ssh/sshd_config”
done
echo “"
#[domain noproblem]【坑】修改监听端口绑定在本地哪个网卡ip地址,监听外界请求;部署入口流量端口控制
for ip in {13…17}; do
echo "修改程序端口在指定ip上监听中…机器172.16.1.
i
p
"
s
s
h
172.16.1.
{ip}" ssh 172.16.1.
ip"ssh172.16.1.{ip} “sed -i -r '/^#?ListenAddress 0.0.0.0/c ListenAddress 172.16.1.${ip} ’ /etc/ssh/sshd_config”
done
echo "”
#批量验证ssh修改情况
for ip in {13…17}; do
echo "请核实配置文件修改情况,正在拉取172.16.1.
i
p
s
s
h
d
安全配置如下
"
s
s
h
172.16.1.
{ip}sshd安全配置如下" ssh 172.16.1.
ipsshd安全配置如下"ssh172.16.1.{ip} “grep -E ‘^(Port|PasswordAuthentication|PubkeyAuthentication|ListenAddress)’ /etc/ssh/sshd_config”
echo ‘===================================================================’
done
echo “重启sshd服务中===================================”
for ip in {13…17}; do
#或者不重启重载配置systemctl daemon-reload&&systemctl reload sshd
ssh 172.16.1.
i
p
"
s
y
s
t
e
m
c
t
l
r
e
s
t
a
r
t
s
s
h
d
"
e
c
h
o
"
172.16.1.
{ip} "systemctl restart sshd" echo "172.16.1.
ip"systemctlrestartsshd"echo"172.16.1.{ip}重新服务成功"
done
for ip in {13…17}; do
echo "正在远程查看sshd端口情况,机器172.16.1.
i
p
"
s
s
h
−
p
10086
r
o
o
t
@
172.16.1.
{ip}" ssh -p 10086 root@172.16.1.
ip"ssh−p10086root@172.16.1.{ip} “ss -tunlp|grep sshd|grep -v grep”
echo “分割线=====”
done
echo ‘脚本执行结束==========’
++++++++++++++++++++++++++++++++++++bash+++++++++++++++++++++++++++++++++++++
bash -n autoPreNoPasswdSsh.sh
bash autoPreNoPasswdSsh.sh
#快照准备 #注意bash执行别名配置不加载
远程一键部署 rsync综合备份架构
vim rsync1.sh
++++++++++++++sh+++++++++++++++++++++++++++++++++
yum install rsync -y
cat > /etc/rsyncd.conf << ‘EOF’
uid =syncDaemon
gid = Daemon
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = nfsUser
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
配合日志看ERROR: Unknown module ‘nfs1’ Connection refused (111)等问题
rsync: failed to connect to 172.161.1.17 (172.161.1.17): Connection refused (111) 此报错是通信问题,比如地址映射正确不混肴冲突,能通rsyncd才能正确识别-传输数据
#auth failed on module nfs1 from UNKNOWN (172.28.237.65) for root: no matching rule
#rsync error: error in socket IO (code 10) at clientserver.c(126) 此报错应该是模块名或者目录问题
##这里仔细查找配置文件问题。注意模块名【坑】才是连接名,
[nfs1]
comment = nfs1
path = /nfs1
EOF
#系统软件用户
id 666
#引用上一条命令执行状态 -gt -ge -lt -le -eq -ne greater than less than
if [ $? -ne 0 ]; then
groupadd Daemon -g 666
useradd syncDaemon -g 666 -u 666 -M -s /sbin/nologin
fi
#备份模块处理
mkdir -p /nfs1
chown -R syncDaemon:Daemon /nfs1
#服务认证密码文件处理
echo ‘nfsUser:1’ > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
#服务跑起
systemctl start rsyncd
systemctl enable rsyncd
#验证端口运行
echo “查看rysnc运行Port”
netstat -tunlp|grep rsync
echo “验证密码信息。备份模块。模块权限如下”
#【坑】注意脚本是在远端执行 ssh17别名没用
cat /etc/rsync.passwd; ls -ld /nfs1 /etc/rsync.passwd
++++++++++++++++++sh++++++++++++++++++++++++++++++++++
#scpssh远程复制脚本并执行
scp -P 10086 rsync1.sh root@172.16.1.17:/opt/;
ssh17 “bash /opt/rsync1.sh”
客户端rsync处理
vim rsync2.sh
++++++++++sh+++++++++
#本端执行
echo “生成rsync客户端密码认证文件并输出验证”
ssh16 “yum -y install rsync”
ssh16 “echo ‘1’ > /etc/rsync.passwd &&chmod 600 /etc/rsync.passwd”
ssh16 “ll /etc/rsync.passwd && cat /etc/rsync.passwd”
+++++++++++sh++++++++++
nfs (nfs-utils rpcbind)网络共享存储服务一键部署
vim nfs1.sh
++++++++++++++++++++++++sh++++++++++++++++++++++++++
yum install nfs-utils rpcbind -y
创建nfs系统软件限定的用户、组。 映射用户是守护进程软件用户吗,不是,映射用户纯粹用来映射权限的。
id 666
#[ $? != 0 ] =1
if [ $? -ne 0 ] ; then
#注意同一以组名方式添加组。不统一可能就会报错
groupadd nfs -g 666
useradd nfsweb -g nfs -u 666 -M -s /sbin/nologin
fi
#创建共享目录,修改权限
mkdir /nfsweb
chown -R nfsweb.nfs /nfsweb
#创建配置文件
cat > /etc/exports << ‘EOF’
这写限制不了root用户。/nfsweb 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)所以写成如下id=必须NM。
/nfsweb 172.16.1.0/24(rw,sync,anonuid=666,anongid=666)
EOF
#启动服务
systemctl start nfs
#必要项.检查服务:共享文件系统
showmount -e 127.0.0.1
++++++++++++++++++++++sh++++++++++++++++++++++++++
nfs+lsyncd===>rysnc服务
vim nfsLsyncd.sh
+++++++++++++++++++++++++++++sh++++++++++++++++++++++++
#安装服务
yum install lsyncd -y
#生成配置文件
cat > /etc/lsyncd.conf << ‘EOF’
settings {
logfile =“/var/log/lsyncd/lsyncd.log”,
statusFile =“/var/log/lsyncd/lsyncd.status”,
inotifyMode = “CloseWrite”,
maxProcesses = 8,
}
sync {
default.rsync,
source = “/nfsweb”,
target = “nfsUser@172.16.1.17::nfs1”,
delete= true,
exclude = {“.*”},
delay=1,
rsync = {
binary = “/usr/bin/rsync”,
archive = true,
compress = true,
verbose = true,
password_file=“/etc/rsync.passwd”,
_extra={“–bwlimit=200”}
}
}
EOF
#启动
systemctl start lsyncd
#检查服务
ps -ef|grep lsyncd |grep -v grep
#测试文件
cat > /nfsweb/index.html << ‘EOF’
qwert。测试
EOF
+++++++++++++++++++++++++++++++++++++++sh++++++++++++++++++++++
#远程发送配置文件并执行
scp -P 10086 nfs1.sh nfsLsyncd.sh root@172.16.1.16:/opt/
ssh16 “bash /opt/nfs1.sh nfsLsyncd.sh”
测试rsync+nfs
ssh16 “touch /nfsweb/sss.png”;
ssh17 “ls /nfs1”
Web7/8/9机器一键部署
这里讲一下nfs的服务
mount | grep nfs #列出已经挂载的 NFS 文件系统,并在输出中显示正在使用的 NFS 版本
总之正常服务是
socket系统服务自带自启。停用会话或会话中操作会异常
rpcbind服务端必装接管各种nfs lockd等服务端口注册到映射表。客户端不装也能使用,会影响整体兼稳性,和其他功能性扩展
nfs服务端必装运行。客户端必安装作为辅助应用挂载建立nfs会话,无需运行
客户端
vim web345.sh
++++++++++++++++++++++++++++++sh++++++++++++++++++++++++
#安装服务
yum install nginx -y
#【坑】保证nginx运行用户访问权限,且与映射id相同,即免映射作用
【坑】创建系统用户要求 -r 配置到nginx最好需要一次性创建,再修改组名;不然niginx无法正常应用识别。最好组名相同不用修改,
id 666
if [ $? -ne 0 ]; then
useradd -r -u 666 -s /sbin/nologin -M -c “Nginx web server” nfsweb
else echo"用户id 666已存在"
fi
#修改配置文件
cat > /etc/nginx/nginx.conf << ‘EOF’
user nfsweb;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
#Load dynamic modules. include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr -
r
e
m
o
t
e
u
s
e
r
[
remote_user [
remoteuser[time_local] “KaTeX parse error: Double superscript at position 34: … '̲status
b
o
d
y
b
y
t
e
s
s
e
n
t
"
body_bytes_sent "
bodybytessent"http_referer” ’
‘“
h
t
t
p
u
s
e
r
a
g
e
n
t
"
"
http_user_agent" "
httpuseragent""http_x_forwarded_for”’;
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 81;
server_name localhost;
location / {
root html;
index index.html;
}
}
}
EOF
sleep 2
#检测语法
nginx -t
#启动服务
systemctl start nginx
#同步映射组名
groupmod -n nfs nfsweb
#检查服务
sleep 2
netstat -tunlp | grep nginx
#挂载目录需要装辅助工具。安装后挂载时自动调起rpcbind.socket
#注意卸载相关程序要取消nfs挂载
yum install nfs-utils -y
mount -t nfs 172.16.1.16:/nfsweb /usr/share/nginx/html
++++++++++++++++++++++++++++sh+++++++++++++++++++++++++++++++++
#远程复制脚本并运行
for server in {13,14,15};
do
scp -P 10086 ~/web345.sh root@172.16.1.
s
e
r
v
e
r
:
/
o
p
t
s
s
h
−
p
10086
r
o
o
t
@
172.16.1.
{server}:/opt ssh -p 10086 root@172.16.1.
server:/optssh−p10086root@172.16.1.{server} “bash /opt/web345.sh”
done
nfs16上资源文件修改创建 整体运行测试 备份机制测试
##nfs 共享目录,分发共享到每个人webhtml目录。
#检查数据备份情况
ssh17 “ls -l /nfs1”
#检查网站情况
for web in {13,14,15}
do
curl 172.16.1.${web}:81
done
#再次修改页面,查看数据
cat >index.html<<EOF
瓦尔特
EOF
scp -P 10086 index.html root@172.16.1.16:/nfsweb
#再次修改资源文件验证
ssh16 “echo ‘测试2’ > /nfsweb/index.html”
ssh17 “ls -l /nfs1”
#浏览器访问
http://10.0.0.13:81/
http://10.0.0.14:81/
http://10.0.0.15:81/
毕