Pipeline支撑运维自动化:sftp原子模块

543 阅读3分钟

需求

如果我们某个业务平台需要和很多第三方渠道对接sftp来交互传输文件,而且要求各三方渠道的目录是相互安全隔离的,那么在配置sftp时需要考虑以下几个问题:

  • 一个业务平台账户可能对应多个三方渠道账户
  • 平台用户、各三方渠道用户对同一个文件读写分离,要么读、要么写
  • 各三方渠道用户目录相互安全隔离

如此看来每新增一个平台或渠道用户可能需要经过一系列的繁琐操作,这对运维来说太不友好了,因此经过总结梳理我们的Pipeline又有了一个原子模块:sftp

sftp配置规范

不要着急,我们依据 先自动化,再标准化;边自动化,边标准化;既自动化,又标准化 思想,先确定sftp的配置管理规范,做到有章可循、有规可依。

1.目录命名规范

(1)三方渠道用户目录

一个三方渠道用户仅对应一个目录。

命名规则:平台名_渠道名

(2)平台用户目录

平台用户因需访问多个三方渠道用户目录,所以权限较高。

命名规则:平台名_渠道名1、平台名_渠道名2 等等

2.sftp配置

# 匹配bigsftp组
vim /etc/ssh/sshd_config
port 22
Subsystem sftp internal-sftp
Mathch Group bigsftp
  ChrootDirectory /data/sftp
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

配置sftp时需要注意:

  • sftp用户必须使用chroot,否则登录后可以自由切换系统目录,因此需要通过match group匹配
  • 如果使用keepalived高可用,需要保证各主机的uid和gid一致,否则会出现权限问题

3.添加用户

(1)三方渠道用户

# 渠道用户test1,匹配bigsftp组
useradd -u 1111 -G bigsftp -s /sbin/nologin -d /data/sftp/big_test1  test1
passwd xxxxxxxx

# 渠道用户test2,匹配bigsftp组
useradd -u 1112 -G bigsftp -s /sbin/nologin -d /data/sftp/big_test2  test2
passwd xxxxxxxx

默认情况下,用户家目录为700,由于还需要平台用户访问,因此还需进一步授权

cd /data/sftp
chmod 770 big_test1
chmod 770 big_test2

(2)平台用户

# 平台用户big, 匹配bigsftp组
useradd -u 1110 -G bigsftp -s /sbin/nologin -d /data/sftp/big  big
passwd xxxxxxxx

由于平台用户要访问渠道用户目录,因此平台用户需进一步隶属于渠道用户属组

usermod -G test1,test2 big

(3)登录验证

sftp -oPort=22  test1@192.168.3.xxx
sfpt> ls
big_test1  big_test2
# 验证进入其他渠道目录
sftp> cd big_test2
sfpt> ls
# 无权限访问
Couldn't get handle: Permission denied

sftp原子模块

随着对接的渠道越来越多,繁杂的sftp的权限配置将成为我们的一个负担,因此我们将此需求提取成一个原子模块,通过Pipeline编排的形式来处理。

image.png

1.参数化构建

image.png

注意:

  • PLATFORM 使用"Choice Parameter"参数
  • WORKHOME 使用"Actiate Choices Reactive Parameter"参数,其根据PLATFORM、CHANNEL参数动态变化
switch(PLATFORM) {
    case "big":
        return ["big_${CHANNEL}"]
        break
    case "small":
        return ["small_${CHANNEL}"]
        break
    default:
        return ["非指定平台"]
        break
}

如有特殊规则,需要启用开启"Use Groovy Sandbox",否则最终结果无法进行动态调整。

2.流水线

@Library('shared-library') _
pipeline {
    agent any
    options {
        timestamps()
    }
    stages{
        stage('平台用户检查') {
            steps {
                script {
                    sftp.NewPlatform("$SFTP", "$PLATFORM", "$PASSWORD", "$WORKHOME")
                }
            }
        }
        stage('渠道用户创建') {
            steps {
                script {
                    sftp.NewChannel("$SFTP", "$CHANNEL", "$PASSWORD", "$PLATFORM", "$WORKHOME")
                }
            }
        }        
    }
}

3.流程图

2.png

总结

随着sftp原子模块的完成,我们能够通过自动化完成的运维场景又多了一个:

image.png