一个简单的局域网服务器互联案例(3) —— 一键生成新用户

接上篇。

背景

在前面的系列里我完成了服务器安装、访问配置、局域网组建和普通网段下对开发网段的访问。一个可用的雏形已经成型。

不过里面还缺少一些东西,其中一个就是开发用户的管理。共用root账号进行服务器操作,虽说可行,也简单粗暴了一些。基本的用户管理也是应该有的。

所以这一篇主要完成在4台机器中创建新用户,并快捷生成密钥的脚本。系统环境为CentOS 7.

过程

脚本的逻辑

  1. 生成一个带有默认密码的用户
  2. 将用户加入wheel组,使之拥有sudo权限(centos下wheel用户组有sudo权限)
  3. 生成密钥
  4. 生成config文件并修改文件属性
  5. 在其它服务器上生成同名账号
  6. 将生成的密钥和配置文件同步到其他服务器上去
  7. 在其他机器上修改文件用户组
  8. 修改本机文件用户组

脚本已经放到github上了:https://github.com/kelvinblood/gist/blob/master/addUser.sh

#!/bin/bash

. /etc/profile


VERSION=' Version 0.0.1, 2017年10月12日, Copyright (c) 2017 kelvinblood';

usage () {
    echo '没有帮助';
}



if [ "$#" -eq 0 ]; then
    usage
    exit 0
fi

case $1 in
    -h|h|help )
        usage
        exit 0;
        ;;
    -v|v|version )
        echo $VERSION;
        exit 0;
        ;;
esac

if [ "$EUID" -ne 0 ]; then
    echo "必需以root身份运行,请使用sudo等命令"
    exit 1;
fi

USERNAME=$1
PASSWDCH="$USERNAME:Qweewq"


if [ -e "/home/$USERNAME" ]; then
    echo '该账户home目录已存在'
    exit 0
fi

useradd $USERNAME -d /home/$USERNAME -G wheel;
echo $PASSWDCH | chpasswd

if [ -e "/home/$USERNAME/.ssh" ]; then
    rm -rf "/home/$USERNAME/.ssh"
fi


mkdir /home/$USERNAME/.ssh
cd /home/$USERNAME/.ssh

sudo ssh-keygen -b 1024 -t rsa -C $USERNAME -f "/home/$USERNAME/.ssh/$USERNAME"
touch authorized_keys
touch config

cat $USERNAME.pub >> authorized_keys
chmod 400 authorized_keys

cat >> config << EOF
# add by weikelu
Host    100
  HostName        172.10.1.100
  Port            22
  User            $USERNAME
  IdentityFile    /home/$USERNAME/.ssh/$USERNAME
Host    101
  HostName        172.10.1.101
  Port            22
  User            $USERNAME
  IdentityFile    /home/$USERNAME/.ssh/$USERNAME
Host    102
  HostName        172.10.1.102
  Port            22
  User            $USERNAME
  IdentityFile    /home/$USERNAME/.ssh/$USERNAME
Host    103
  HostName        172.10.1.103
  Port            22
  User            $USERNAME
  IdentityFile    /home/$USERNAME/.ssh/$USERNAME
EOF

###########################################################

ssh 101 "useradd $USERNAME -d /home/$USERNAME -G wheel"
ssh 101 "echo $PASSWDCH | chpasswd"

cd /home/$USERNAME/.ssh

ssh 101 "mkdir /home/$USERNAME/.ssh"
scp config 101:"/home/$USERNAME/.ssh/config"
scp $USERNAME 101:"/home/$USERNAME/.ssh/$USERNAME"
scp authorized_keys 101:"/home/$USERNAME/.ssh/authorized_keys"
ssh 101 "chown -R $USERNAME:$USERNAME /home/$USERNAME/.ssh"

###########################################################

ssh 102 "useradd $USERNAME -d /home/$USERNAME -G wheel"
ssh 102 "echo $PASSWDCH | chpasswd"

cd /home/$USERNAME/.ssh

ssh 102 "mkdir /home/$USERNAME/.ssh"
scp config 102:"/home/$USERNAME/.ssh/config"
scp $USERNAME 102:"/home/$USERNAME/.ssh/$USERNAME"
scp authorized_keys 102:"/home/$USERNAME/.ssh/authorized_keys"
ssh 102 "chown -R $USERNAME:$USERNAME /home/$USERNAME/.ssh"

###########################################################

ssh 103 "useradd $USERNAME -d /home/$USERNAME -G wheel"
ssh 103 "echo $PASSWDCH | chpasswd"

cd /home/$USERNAME/.ssh

ssh 103 "mkdir /home/$USERNAME/.ssh"
scp config 103:"/home/$USERNAME/.ssh/config"
scp $USERNAME 103:"/home/$USERNAME/.ssh/$USERNAME"
scp authorized_keys 103:"/home/$USERNAME/.ssh/authorized_keys"
ssh 103 "chown -R $USERNAME:$USERNAME /home/$USERNAME/.ssh"

###########################################################

chown -R $USERNAME:$USERNAME /home/$USERNAME/.ssh

一个简单的局域网服务器互联案例(2) —— 不同网段下的访问

接上篇。

背景

在上一篇我组建一个由4台服务器组成的局域网。然而这个局域网是有一个限制——必须要接入WiFi才能进行访问和开发。

由于这个局域网和开发人员不处在同一个网段内,每次访问都需要切换到WiFi所在的网络才能访问,非常繁琐,而且如果是在不同楼层,甚至不同地区的开发人员,基本就不能访问了。

所以这一篇的目标是在公司内网环境下可以自由接入该局域网开发环境。

搭建

组网示意图

过程

解决这样的需求有两种方式,一种是类似于花生壳的内网穿透技术,请求发送到外部服务器,外部再转发到内网里来。然而这并不是这次开发中需要的。二是在路由器上做端口映射,像aws一样配置路由即可。

端口映射

如上图配好映射后,同网段内的电脑访问开发机的方式变为:

ssh root@xx.xx.xx.39:10100
ssh root@xx.xx.xx.39:10101
ssh root@xx.xx.xx.39:10102
ssh root@xx.xx.xx.39:10103

今后每当服务器启动某些对外的服务时,通过路由器的这个设置,打开对应的端口映射即可。


一个简单的局域网服务器互联案例(1)

用了一天时间安装服务器和组建局域网,记录一下过程。

背景

组建一个由4台服务器组成的局域网,提供给开发人员使用,要求安装CentOS 7系统,部署好docker环境。

搭建

组网示意图

安装CentOS

最简便的方法是,在官网下载好CentOS镜像,写入U盘,从U盘启动的方式,将系统安装到目标的服务器中。

配置路由器

  1. 配置LAN地址

    为了不和上一级路由器冲突,局域网内最好避免选择诸如192.168.1.1这样的IP地址段。

    想了一下最后用了“172.10.1.1”的IP段。

    配置LAN地址

  2. 配置IP与Mac映射

    在路由器不设定IP与Mac映射时,每当有新的设备连接到网络是,路由器DHCP会随机选择一个可用的IP提供给设备。

    开发环境里我们尽量避免这种不确定性带来的麻烦。

    配置IP与Mac映射

    在这里我配置了100-103,一共4台机器。

配置第一台服务器 - 100

  1. docker ce

    CentOS 下使用的是 yum 命令,更新一下。

     yum update
    

    发现速度不慢,就不更改源地址了。

    然后安装docker ce

     yum install -y yum-utils device-mapper-persistent-data lvm2
     yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
     yum-config-manager --enable docker-ce-edge
     yum-config-manager --enable docker-ce-test
     yum install docker-ce
    

linux硬盘分区、格式化与挂载

给手上的一台 Windows 安装 CentOS 后,发现 1T 的硬盘没有利用上。所以这一篇介绍怎么将它配置好。

主要用到一下知识点:

  1. 对磁盘进行分区,以创建可用的分区;
  2. 对分区进行格式化 (format);
  3. 创建挂载点 ,将磁盘挂载上来;

分区

查看磁盘列表lsblk

lsblk 是 “list block device ” 的缩写,就是列出所有储存设备的意思

lsblk [-dfimpt] [device]
选项与参数:
-d  :仅列出磁盘本身,并不会列出该磁盘的分区数据
-f  :同时列出该磁盘内的文件系统名称
-i  :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
-m  :同时输出该设备在 /dev 下面的权限数据 (rwx 的数据)
-p  :列出该设备的完整文件名!而不是仅列出最后的名字而已。
-t  :列出该磁盘设备的详细数据,包括磁盘伫列机制、预读写的数据量大小等

lsblk

从图片中可以目标磁盘是sdb,并且没有挂载进来。

列出磁盘的分区表类型parted

磁盘分区时要注意的是:“MBR 分区表需要使用 fdisk 分区, GPT 分区表需要使用 gdisk 分区”。搞错的话会分区失败的。

我们可以使用 parted 查看分区表类型。可以看到这块硬盘的格式是NTFS,windows默认的硬盘格式,分区表是MBR。

parted

parted /dev/sdb print

msdos 可以把它当成 MBR。MBR equals msdos for gparted?

你也可能遇上这样的分区表类型:

parted

关于loop类型在这里有一篇讨论,可以参考 Is partition table type “loop” a good or bad idea on BTRFS?

总之不确定的话,你可以简单按照 gpt 进行操作。

然后就可以开始分区了。

分区fdisk gdisk

参照 parted 的结果,如果是mbr格式则使用fdisk命令

fdisk

fdisk

fdisk /dev/sdb后使用p查看,可以看到当前磁盘被分为了4个区。使用d全部删掉。

fdisk

默认会从最后一个分区开始删除,一路按,就能把所有分区全部删掉。

接下来使用n新建分区。默认新建的分区会把整个磁盘用完,嗯,正是我们想要的效果。

fdisk

最后使用w将刚才的操作写入硬盘。此时再重新lsblk,可以看到已经分区好了。

fdisk

gdisk

和fdisk操作基本相同:

gdisk

gdisk /dev/sdb

格式化mkfs

分区之后就是格式化。这里磁盘格式化为Linux默认格式xfs。

fdisk

mkfs.xfs -f /dev/sdb

注意: 你的系统可能没有mkfs.xfs的命令,我的Ubuntu通过安装xfsprogs即可使用 apt-get install xfsprogs

挂载

这里我将硬盘挂载到/mnt/sdb文件夹上去。

mkdir -p /mnt/sdb

-p, –parents 此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录;

查看sdb的uuid:

blkid /dev/sdb

blkid

然后使用mount命令进行挂载:

blkid

mount UUID="fd4b9aaa-3faf-487f-8ffc-c25534c9c569" /mnt/sdb
df -h

此时使用df -h,可以看到硬盘已经正确挂载了。

df -h

目前只是临时挂载上了,可以修改/etc/fstab文件,使系统在启动时便自动挂载硬盘。

/etc/fstab

结束

最后以 MBR 分区表为例,用命令总结一下刚才的步骤

  • lsblk
  • parted /dev/sdb print
  • fdisk /dev/sdb
  • mkfs.xfs -f /dev/sdb
  • blkid /dev/sdb
  • mount UUID=”fd4b9aaa-3faf-487f-8ffc-c25534c9c569” /mnt/sdb
  • vi /etc/fstab

经过上面的步骤,便可以正常使用这一块硬盘了。

参考资料


1 2 46 47 48 49 50 94 95