Category Archives: linux

python 自动化运维–fabric库

1、windows拷贝文件到linux部署脚本(python)


# encoding='utf-8'

from fabric import Connection
import sys 

from fabric import Connection
import sys
packageName = sys.argv[1].replace('(','').replace(')','')
sourceDir = "C:\\tmp\\"
destDir = "/usr/local/src/"

with  Connection(host="122.226.107.154", port=2024, user="root", connect_kwargs={"password":"xxxx"}) as c:
    c.put(sourceDir + sys.argv[1], destDir + packageName)
    c.run('rm -rf /usr/local/src/dist')
    c.run('rm -rf /usr/local/app/szzj-portal-pc/*')
    c.run('unzip -o /usr/local/src/%s -d /usr/local/src/' %(packageName))
    c.run('/usr/bin/mv -f /usr/local/src/dist/* /usr/local/app/szzj-portal-pc/')

fabric 官网已经更新到2.6版,阿里镜像下载也已经是2.5的版本,但是网络上搜索到的案例大部分是按照1.X版本编写的。今天查看了下官网的文档,一些用法记录下。

2、基本上只要使用Connection这个api :

fabric.connection.Connection

这个类是从 Invoke 的Context 继承过来的,另外它还封装了Paramiko SSHClient 。可用参数如下:
Connection(hostuser=Noneport=Noneconfig=Nonegateway=Noneforward_agent=Noneconnect_timeout=Noneconnect_kwargs=Noneinline_ssh_env=None)

这里主要说明下connect_kwargs这个参数,它的值是字典(dict),比如密码,密钥key只能设置在这里。这个字典会直接传递给paramiko.client.SSHClient.connect解析,完整的可用字段如下:connect(hostnameport=22username=Nonepassword=Nonepkey=Nonekey_filename=Nonetimeout=Noneallow_agent=Truelook_for_keys=Truecompress=Falsesock=Nonegss_auth=Falsegss_kex=Falsegss_deleg_creds=Truegss_host=Nonebanner_timeout=Noneauth_timeout=Nonegss_trust_dns=Truepassphrase=Nonedisabled_algorithms=None)

3、另外是多主机的操作api

  1. fabric.group.Group(*hosts**kwargs) /**抽象类,无法直接使用,只能选用下面两个
  2. fabric.group.SerialGroup(*hosts**kwargs)
  3. fabric.group.ThreadingGroup(*hosts**kwargs)

因为本机测试不支持put (2.5版本)。group.py也看了,确实没有put ,不好用。
还是选择了for 循环IP列表调用Connection 来实现多主机操作。

其它

1、参数传递 :

python 的参数传递到 shell 脚本 c.run('/root/test.sh %s' %(sys.argv[1]))
实现上类是print函数传参。

linux优化

系统允许一个进程打开的文件数

修改文件/etc/security/limits.conf,在文件尾部添加如下代码(如果已经存在则修改相应数值):

root soft nofile 65535
root hard nofile 65535
 * soft nofile 65535
 * hard nofile 65535

    注:只配置最后两行不就可以了吗,为啥还要单独为root用户配置呢?查了网上资料,说是*这样的通配符对root用户无效,所以root需要单独配置(嗯,阿里云ECS就配置了上面这4行)。

数据库综述

关系型数据库

关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据。
主流的 oracle、DB2、MS SQL Server 和 mysql 都属于这类传统数据库。

NoSQL 数据库

NoSQL 数据库,全称为 Not Only SQL,意思就是适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为

  • 临时性键值存储(memcached、Redis)、
  • 永久性键值存储(ROMA、Redis)、
  • 面向文档的数据库(MongoDB、CouchDB)、
  • 面向列的数据库(Cassandra、HBase),

每种 NoSQL 都有其特有的使用场景及优点。

git flow规范

简介

•Git Flow是一套使用Git进行源代码管理时的一套行为规范
•Git Flow是构建在Git之上的一个组织软件开发活动的模型,是在Git之上构建的一项软件开发最佳实践
•Git Flow重点解决的是由于源代码在开发过程中的各种冲突导致开发活动混乱的问题
•Git Flow通过创建和管理分支,为每个分支设定具有特定的含义名称,并将软件生命周期中的各类活动归并到不同的分支上。实现了软件开发过程不同操作的相互隔离

Git Flow中的分支

•主分支

•master:随时可供在生产环境中部署的代码的分支
•develop:保存当前最新开发成果的分支

辅助分支

  • feature:用于开发新功能时所使用的分支
  • release:用于辅助版本发布的分支
  • hotfix:用于修正生产代码中的缺陷的分支

feature分支

接到一个新的功能的开发任务后,从develop分支发起,并push成为远程分支

命名规范:例如开发一个项目信息的功能,则创建的分支名为:feature-project-info

每天下班前push代码到远程,进行备份,防止本地电脑故障导致代码丢失。一般feature分支由单人开发维护,可视为个人分支,所以push的代码不稳定也不会影响他人

每个人只需要维护好自己的功能分支,无需与他人进行频繁的合并,极大的降低了冲突概率,降低了代码互相覆盖的风险,从而实现多人多功能的并行开发

若不同的feature分支之间有依赖关系,则等目标feature分支开发完成以后,直接pull目标feature分支即可,若需要协同开发,则多人使用同一条feature分支即可

功能相关的代码开发完毕,并通过自测稳定以后,合并回develop分支,并可以删除feature分支,feature分支的生命周期到此结束

注意事项:所有merge操作,必须使用–no-ff参数禁止fast forward合并,防止丢失合并历史信息,例:git merge –no-ff feature-project-info

feature分支额外自定义规范

  • 开发经理创建公共集成feature分支
  • 开发人员创建自己的feature分支,并进行开发
  • 开发完成并自测稳定以后,合并到公共集成feature分支上
  • 再由开发经理统一合并到develop分支上

release分支

•release分支是为发布新版本提供支持的分支,从最新的develop分支发起(已合并所有此次要上线的feature) •命名规范:一般以发布日期为分支名,如7月15日计划上线,则分支名为:release-0715或release-7.15 •发布测试环境应拉取此分支的代码进行打包(结合jenkins自动化部署) •测试中发现的bug,也直接在此分支进行修复,与可能还在往前演进的develop分支隔离并行,控制发布的代码范围,防止多余的功能代码被意外的发布上线 •测试通过后,由开发经理合并到master(master分支受保护,合并需要权限),然后使用master的代码进行打包,发布生产环境,发布后,并打上版本号的tag •发布上线后,需要将master合并回develop,将release分支中修改的bug同步,防止bug重现

release分支额外自定义规范

•多版本上线时间相近,并且需要进行功能点隔离时
•创建多条release分支,不同的公共集成feature分支直接合并到对应的release分支上
•而不是全部合并到develop分支上,从而达到不同的发布版本功能范围隔离的效果

hotfix分支

  • hotfix分支是版本上线后,在线上发现了bug,从master分支发起的紧急修复bug的分支
  • 由于它的发布属性,可以把它看作是计划外的release分支,也就是紧急发布分支
  • bug修复后,不但要合并到master,还要合并回develop,防止bug重现

Git Flow闭环全流程概览

  • 接到一个功能开发任务,创建对应的feature分支
  • 功能开发完成后,合并回develop
  • 从最新的已包含所有功能的develop上发起release分支
  • 从release分支打包发布测试环境,开始测试,修复bug
  • 测试完毕,合并回develop,合并到master,发布上线, 打tag
  • 线上发现bug,从master发起hotfix分支,修复后,合并回master与develop,在master上打上tag,方便回溯
  • 开启下一个流程

gitlab

部署

官网文档:https://about.gitlab.com/install/?test=capabilities#centos-8

以下为centos 8平台安装步骤:

#安装依赖,一般服务器openssh-server都已经安装并且启动
sudo dnf install -y curl policycoreutils openssh-server perl
##防火墙开启 80,443端口
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
systemctl reload firewalld

# 添加gitlab repo
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
##如果有外网地址解析,添加变量
EXTERNAL_URL="https://gitlab.example.com"

# 安装
dnf install -y gitlab-ee

##基础信息
配置文件 /etc/gitlab/gitlab.rb
安装目录/opt/gitlab   /var/opt/gitlab

备份还原

官方参考https://docs.gitlab.com/ee/raketasks/backup_restore.html

备份

gitlab-rake gitlab:backup:create #备份,默认位置/var/opt/gitlab/backups
gitlab-backup create ##GitLab 12.2 起使用这个命令

##备份配置文件
/etc/gitlab/gitlab-secrets.json
/etc/gitlab/gitlab.rb
##可以运行如下命令备份配置文件,
##配置文件会保存在/etc/gitlab/config_backup/,
gitlab-ctl backup-etc

还原

还原前

sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq
# Verify
sudo gitlab-ctl status

gitlab-rake gitlab:backup:restore #还原,恢复的gitlab要和备份的版本完全相同

以上是12.1以前的版本。之后的是gitlab-backup create ;gitlab-backup restore

恢复后

sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo gitlab-rake gitlab:check SANITIZE=true

重置root 密码

gitlab-ctl start 保证gitlab处于启动状态,&保证redis处于启动状态

gitlab-ctl start            #保证gitlab处于启动状态,&保证redis处于启动状态
gitlab-rails console production
irb(main):001:0>user = User.where(id: 1).first   #定位到gitlab 数据库中Users表中的一个用户,通常就是管理员用户admin@local.host
irb(main):002:0> user.password=12345678          #重置管理员密码为12345678
irb(main):003:0> user.password_confirmation=12345678   #确认管理员密码为12345678
irb(main):004:0> user.save!    #保存更改信息

用户权限

Guest:可以创建issue、发表评论,不能读写版本库

Reporter:可以克隆代码,不能提交,可以赋予测试、产品经理此权限

Developer:可以克隆代码、开发、提交、push,可以赋予开发人员此权限

MainMaster:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,一般GitLab管理员或者CTO才有此权限

linux swap分区

首先划分一个分区做swap

fdisk /dev/vdb

分区类型按”t“修改为82 Linux swap,保存

格式化分区 mkswap /dev/vdb2

启动swap分区 swapon /dev/vdb2

查看swap分区UUID blkid

/etc/fstab永久挂载 UUID=04820cf8-90b3-4bf9-8402-071352674b73 swap swap defaults 0 0

查看 free -h swapon -s

nfs 搭建

环境A,B两台centos7,A ip 192.168.1.2 服务端,B ip 192.168.1.3客户端

A服务器端

##安装
yum install -y nfs-utils rpcbind
##依次启动
systemctl start rpcbind
systemctl start nfs-server
#建立共享目录
mkdir /share
chmod 777 /share
##编辑配置文件 /etc/exports
#括号后默认参数 (ro, root_squash)
#root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户
/share  192.168.1.0/24(rw,no_root_squash,async)
##重新读取配置使之生效
systemctl reload nfs-server

B 客户端

##查看
[root@m1 ~]# showmount -e 192.168.1.2
Export list for 192.168.1.2:
/share 192.168.1.0/24
##挂载
[root@m1 ~]# mkdir /mnt/pub
[root@m1 ~]# mount -t nfs 192.168.1.2:/share  /mnt/pub

fail2ban

最近查看自己搭建的一台邮件服务器的日志,发现不停的有IP在测试登录密码,就想着把这些恶意连接的IP给封了。记得以前了解有个fail2ban的工具,可以不用从头到脚写脚本,直接简单配置即可实现我的需求,于是就来部署试试。

我的centos7上已经安装了epel源,直接yum安装

yum install fail2ban -y 

安装完成后,需要到配置目录(/etc/fail2ban/)做下配置。配置文件功能说明下:

fail2ban.conf   这个是程序运行相关的配置,不用动
jail.conf       这个是系统预装的相关服务检测规则,然后封禁的相关配置,因程序升级会
                覆盖此文件,因此需要在同目录新建 jail.local来做个性化配置
jail.d/         个性化配置也可在此目录下新建文件,效果与jail.local相同
filter.d/       预置的可以jail的服务

配置文件编写规则说明:

1、默认配置文件jail.conf为总[default] ,分[sshd]   [nginx]这种层次
2、个人配置文件jail.local 可以只写具体要jail的服务模块,如[sshd] ,它会自动继承 
   [defualt]中的所有配置,如果sshd中有default相同的命令,会重写(override)default
   中的命令
3、默认所有的jail模块都是未开启的
4、如果要启动sshd 可以只写
  [sshd]
  enabled = true
  所有预置的服务(在filter.d/目录下)都可以只写上面格式的两行就可开启对于服务的监控拦截功能

我安装的是fail2ban-0.11.1-10.el7.noarch版本,预装的配置文件[default]如下

[DEFAULT]
ignorecommand =
bantime  = 10m
findtime  = 10m
maxretry = 5
maxmatches = %(maxretry)s
backend = auto
usedns = warn
logencoding = auto
enabled = false
mode = normal
filter = %(__name__)s[mode=%(mode)s]
destemail = root@localhost
sender = root@
mta = sendmail
protocol = tcp
chain = 
port = 0:65535
fail2ban_agent = Fail2Ban/%(fail2ban_version)s
banaction = iptables-multiport
banaction_allports = iptables-allports
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
            %(mta)s-whois[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
             %(mta)s-whois-lines[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
action_xarf = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
action_blocklist_de  = blocklist_de[email="%(sender)s", service=%(filter)s, apikey="%(blocklist_de_apikey)s", agent="%(fail2ban_agent)s"]
action_badips = badips.py[category="%(__name__)s", banaction="%(banaction)s", agent="%(fail2ban_agent)s"]
action_badips_report = badips[category="%(__name__)s", agent="%(fail2ban_agent)s"]
action_abuseipdb = abuseipdb
action = %(action_)s

我的配置文件/etc/fail2ban/jail.local

[sshd]
enabled = true
[sendmail-auth]
enabled = true
[dovecot]
enabled = true

接着运行下面相关命令开启fail2ban,查看相关的状态信息

#开启服务
systemctl start fail2ban
#查看配置 
fail2ban-client -d
#重新载入配置
fail2ban-client reload
#查看jail
fail2ban-client status
#查看某个jail状态
fail2ban-client status sshd

更高级些的用法可以添加上面default段的命令来重写,如

[nginx-auth-path]
port = 8080     ;nginx端口为8080
logpath = /usr/local/nginx/logs/errors.log
bantime = 30m   ;ban30分钟
maxretry = 6    ;连续错误6次就会被ban
enabled = ture

邮件服务器的几个端口

最早的几个

25: SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),是用于发送邮件,国内公有云服务器都会关闭云主机25端口出去的流量,也就禁止向外发邮件。

110:POP3(Post Office Protocol Version 3,邮局协议3),是用于接收邮件的。

143:IMAP(INTERNET MESSAGE ACCESS PROTOCOL),是用于接收邮件的。区别与110,它可以只收取邮件头

增加SSL协议后的

465:SMTPS(SMTP-over-SSL),这是SMTP协议基于SSL安全协议之上的一种变种协议

995:POP3S(POP3-over-SSL),这是POP3协议基于SSL安全协议之上的一种变种协议

993:IMAPS(IMAP-over-SSL),这是IMAP协议基于SSL安全协议之上的一种变种协议