ch3 OpenVPN的高可用配置

方案1:在Vpn 客户端使用多个配置文件实现(由用户选择拨号)类 方案1:需求分析与操作过程讲解。 基本说明: 生产场景中比较规范的做法是让所有的VPN SERVER尽可能共享同一套 server,ca证书或者连接同一个认证系统(即使是跨机房)。这样只需要一份客户端认证和文件和多份指定不同vpn client的配置文件即可实现vpn的负载均衡了。 总结结论: 1)该负载均衡方案操作简单,不引入多余服务(后面的方案都会引入服务),因此不会增加多余的单点故障,当用户连接的vpn不能使用时,用户就可以人工选择拨号其他的VPN服务器。 2)如果使用者为公司内部工作人员,此种方案是值得推荐的。老男孩老师推荐。 3)从广义上讲这是在用户端实现的负载均衡方案,类似早期的华军下载站一样,由用户选择下载站点,而不是用什么智能DNS等复杂的业务模式。 缺点:当一个vpnserver不能使用时,不能自动连上别的vpn server。 方案2:通过在客户端配置文件实现负载均衡(客户端文件里随机连接服务器) 提示:同方案1,所有VPN SERVER 需要共享同一套 server,ca证书。openvpn 服务器一套keys的多份拷贝方式式。 text 1 2 3 4 remote 10.0.0.28 52115 remote 10.0.0.552115 remote-random resolv-retry 20 implementing-a-load-balancing-failover-configuration 总结结论: 1)该负载均衡方案操作简单,不引入多余服务(后面的方案都会引入服务),因此不会增加多余的单点故障,,当用户连接的vpn不能使用时,电脑可以重新再次自动拨号连接VPN服务器。 2)如果使用者为公司内部工作人员,此种方案是值得推荐的。-老男孩老师推荐。如果是使用者为外部人员,那么这个方案依然是可以的。 3)本方案是比较标准的在VPN用户端,由客户端配置参数实现的负载均衡的方案,是非常值得推荐的方案。 4)和方案1对比,方案2的配置更简单,仅需一个配置文件多个remote参数,拨号时客户端会随机自动选择拨号,方案1则需要手动选择不同的配置文件拨号。当正在连接的VPN服务端右机时,那么此时方案2不需要人工干预,客户端的VPN会自动判断并且自动重新连接其他的可用vpn服务器。. 方案3:通过域名加DNS轮询的方式实现负载均衡(由DNS自动分配vpn) 总结结论: 1)通过dns轮询实现VPN负载均衡方案操作比较复杂,引入了DNS服务,因此增加了单点故障及维护成本,当用户连接的vpn不能使用时,用户也需要重新人工再次拨号。 2)如果使用者为公司内部工作人员,此种方案是不推荐的。如果是外部的用户可以考虑用这种方式,但是复杂度比方案1大了很多(如果存在DNS服务器加配置还可以)。 3)当机房多,配置文件多时,无需用户选择服务器,只需拨号即可。如果多个VPN在一个机房还好一些,如果多个VPN服务器不在一个机房,还需要通过IPSEC进行连接。 总之,此法很麻烦,中小型公司老男孩老师极不推荐。 4)DNS轮询会遭遇到客户端DNS缓存问题,从而导致服务切换失效。。 one-network-interface-on-a-public-network

ch2 从零开始安装OpenVPN

OpenVPN安装环境需求 设备 IP 笔记本或PC (adsl上网) 10.0.0.0/24 办公室(DHCP) OpenVPN Server双网卡 eth0:10.0.0.4/24(外网) eth1:192.168.100.4(内网) IDC机房内部局域网服务器 192.168.100.0/24 IDC机房内网服务器无外网IP,又希望ADSL上网笔记本(运维人员),在不同的网络能够直接访问 实现需求:在远端通过VPN客户端(笔记本)拨号到VPN,然后在笔记本电脑上可以直接访问vpnserver所在局域网内的多个servers,进行维护管理 环境 VPN-Server eth0:10.0.0.4(外网IP)。GW:10.0.0.1, dns:10.0.0.1。 eth1:172.0.0.1(内网IP)。GW:不配 提示:检查是否可以ping通client eth0 IP。 App client Server:ethO:172.0.0.2。GW:路由器。提示:检查是否可以ping通VPN-Server eth1 IP。 OpenVPN 解决方案图解 部署OpenVPN Server Reference download lzo installing-openvpn openvpn offical releases openvpn github 安装前准备 openvpn支持的平台: Linux kernel 2.6+ OpenBSD 5.1+ Mac OS X Darwin 10.5+ FreeBSD 7.4+ Windows (WinXP and higher) 下载地址: openvpn-releases openvpn github 安装openvpn的依赖项: 0.9.8版或更高版本的OpenSSL库,对于加密是必需的 PolarSSL库,是加密的替代版本1.1或更高版本 LZO实时压缩库,连接压缩所需 bash 1 yum install openssl-devel lzo-devel pam-devel -y bash 1 2 3 4 5 6 ....

ch1 VPN与OpenVPN应用场景分析

什么是VPN VPN ( Virtual Private Network) 虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信网络的技术,可以为企业与企业之间或者个人与企业之间提供安全的数据传输隧道服务。在VPN中任意两点之间的连接并没有传统专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有同样功能的点到点的专线技术,所谓虚拟是指不需要去拉实际的长途物理线路,而是借用了公共Internet网络实现。 vpn直观的形象图: VPN Server/Client <---------------------------------> VPN Server/Client VPN的作用 VPN功能可以帮助公司里的远程用户(出差,家里)、公司的分支机构、商业合作伙伴及供应商等公司和自己的公司内部网络之间建立可信的安全连接或者是局域网连接,确保数据的加密安全传输和业务访问,对至运维工程师来说,还可以连接不同的机房为局域网,处理相关的业务流。我们可以通过一张网络逻辑图来描述VPN的作用。 图:OpenVPN架构 Source:https://www.slideteam.net/vpn-tunnel-architecture-connecting-corporate-and-branch-office.html VPN的分类 我们根据VPN的常见企业应用,将VPN分为以下4类应用 远程访问VPN服务 即通过个人电脑远程拨号到企业办公网络。 一般为企业内部员工出差、休假或特殊情况下在远离办公室的时候,又有需求访问公司的内部网络获取相关资源,就可以通过VPN拨号到公司内部.此时远程拨号的员工和办公室内的员工以及其他拨号的员工之间都相当于一个局域网络内。例如:访问内部的域控制器,文件服务器,OA系统,ERP, HTTP服务,内网聊天工具等局域网服务应用。 对于运维人且就是需要个人电脑远程拨号到企业网站IDC机房,远程维护内网服务器(一般无外网IP)。 此点是技术人员特别是运维人且在工作中会经常用这个方法维护大量的机房内无外网的服务器及网络设备。 企业内部网络之间VPN服务 在公司的分支机构的局域网和公司总部LAN之间的VPN连接。通过公网Internet建立VPN将公司在各地的分支机构的LAN连接到公司总部的LAN。例如:各大超市之间业务结算等。 这是由于地域的原因而产生的VPN的需求,通过VPN让不同地域内的机器可以互相访问,就好像是一个局域网一样。例如:办公室互联协同办公,机房互联数据同步及业务访问等。 互联网公司多IDC机房之间VPN服务 此处是运维架构人员需要考虑的问题。不同机房之间业务管理和业务访问,数据流动。 企业外部VPN服务 在供应商、合作伙伴的LAN和本公司的LAN之间建立的VPN服务。 访问外国网站 翻墙的应用 常贝隧道协议介绍 PPTP 点对点隧道协议(PPTP)是由包括微软和3Com等公司组成的PPTP论坛开发的一种点对点隧道协议,基于拨号使用的PPP协议,使用PAP或CHAP之类的加密算法,或者使用Microsoft的点对点加密算法MPPE。其通过跨越基于TCP/IP的数据网络创建VPN。实现了从远程客户端到专用企业服务器之间数据的安全传输。PPTP支持通过公共网络(例如Internet)建立按需的、多协议的、虚拟专用网络。PPTP允许加密IP通讯,然后在要跨越公司IP网络或公共IP网络(如Internet)发送的IP头中对其进行封装。典型的linux平台的开源软件为pptp。 PPTP属于点对点方式的应用,比较适合远程的企业用户拨号到企业进行办公等的应用。 L2TP L2TP第2层隧道协议(L2TP)是IETF基于L2F (Cisco的第二层转发协议)开发的PPTP的后续版本。是一种工业标准Internet隧道协议,其可以为跨越面向数据包的媒体发送点到点协议(PPP)框架提供封装。PPTP和L2TP都使用PPP协议对数据进行封装,然后添加附加包头用于数据在互联网络上的传输。PPTP只能在两端点间建立单一隧道。L2TP支持在两端点间使用多隧道,用户可以针对不同的服务质量创建不同的隧道。L2TP可以提供隧道验证,而PPTP则不支持隧道验证。但是当L2TP或PPTP 与 IPSEC 共同使用时,可以由IPSEC提供隧道验证,不需要在第2层协议上验证隧道使用L2TP。PPTP要求互联 网络为IP网络。L2TP只要求隧道媒介提供面向数据包的点对点的连接,L2TP可以在IP(使用UDP),帧中继永久虚拟电路(PVCs),X.25虚拟电路(VCs)或ATM VCs网络上使用。 L2TP (Layer 2 Tunneling Protocol) 在计算机网络中,第2层隧道协议(L2TP)是一种隧道协议,用于支持虚拟专用网络(VPN)或作为ISP提供服务的一部分。它本身不提供任何加密或机密性。相反,它依靠它在隧道内传递的加密协议来提供隐私。 由于L2TP协议缺乏固有的机密性,因此通常与IPsec一起实施。这被称为L2TP / IPsec,并在IETF RFC 3193中进行了标准化。 Reference L2TP IPSec IP安全协议(IPSec: IP Security)实际上是一套协议包而不是一个独立的协议。从1995年开始IPSec的研究以来,IETF IPSec工作组在它的主页上发布了几十个Internet草案文献和12个RFC文件。其中,比较重要的有RFC2409 IKE(互连网密钥交换)、RFC2401 IPSec协议、RFC2402 AH验证包头、RFC2406 ESP加密数据等文件。 IPSec隧道模式隧道是封装、路由与解封装的整个过程。隧道将原始数据包隐藏(或封装)在新的数据包内部。该新的数据包可能会有新的寻址与路由信息,从而使其能够通过网络传输。隧道与数据保密性结合使用时,在网络上窃听通讯的人将无法获取原始数据包数据(以及原始的源和目标)。封装的数据包到达目的地后,会删除封装,原始数据包头用于将数据包路由到最终目的地。 隧道本身是封装数据经过的逻辑数据路径,对原始的源和目的端,隧道是不可见的,而只能看到网络路径中的点对点连接。连接双方并不关心隧道起点和终点之间的任何路由器、交换机、代理服务器或其他安全网关。将隧道和数据保密性结合使用时,可用于提供VPN。...

Ceph集群安装 - ceph-deploy

本文是Ceph集群部署系列第3章 使用cephadm纯离线安装Ceph集群 使用cephadm纯离线安装Ceph集群 2 Ceph集群安装 - ceph-deploy Ceph集群安装 - ceph-deploy下线rgw 环境配置 Ceph 是一个开源去中心化存储平台,专为满足现代存储需求而设计。 Ceph可扩展至 EB 级,并且设计为无单点故障,使其成为需要高度可用的灵活存储的应用程序的理想选择。 下图显示了具有 Ceph 存储的示例 3 节点集群的布局。 两个网络接口可用于增加带宽和冗余,这有助于保持足够的带宽来满足存储要求,而不影响客户端应用程序。 图:Ceph存储集群 Source:https://www.jamescoyle.net/how-to/1244-create-a-3-node-ceph-storage-cluster 图中架构表示了一个无单点故障的 3 节点 Ceph 集群,以提供高度冗余的存储。 每个节点都配置了两个磁盘; 一台运行 Linux 操作系统,另一台将用于 Ceph 存储。 下面的输出显示了可用的存储空间,每个主机上的存储空间完全相同。 /dev/sda 是包含操作系统安装的根分区, /dev/sdb 是一个未触及的分区,将用于部署 Ceph 集群,对应的硬件信息如下表所示。 主机名 public IP cluster IP 数据盘 ceph-nautilus01 10.0.0.50 10.0.0.50 /dev/sda /dev/sdb ceph-nautilus02 10.0.0.51 10.0.0.51 /dev/sda/dev/sdb ceph-nautilus03 10.0.0.52 10.0.0.52 /dev/sda/dev/sdb ceph-control 10.0.0.49 10.0.0.49 /dev/sda 部署工具 ceph-deploy 工具是在 “管理节点” (ceph-admin) 上的目录中运行。...

kubernetes应用 - Traefik Ingress Controller

Kubernetes Ingress Kubernetes Ingress是路由规则的集合,这些规则控制外部用户如何访问Kubernetes集群中运行的服务。 在Kubernetes中,有三种方式可以使内部Pod公开访问。 NodePort:使用Kubernetes Pod的NodePort,将Pod内应用程序公开到每个节点上的端口上。 Service LoadBalancer:使用Kubernetes Service,改功能会创建一个外部负载均衡器,使流量转向集群中的Kubernetes Pod。 Ingress Controller: Node Port是在Kubernetes集群中每个节点(Node)上开放端口,Kubernetes直接将流量转向集群中Pod。Kubernetes集群中使用NodePort,则需要编辑防火墙规则,但是NodePort是范围在Kubernetes集群中默认设置的范围为 30000–32767,最终导致流量端口暴露在非标准端口之上。 LoadBalancer一般应用于云厂商提供的Kubernetes服务,如果自行在机器上部署Kubernetes集群,则需要自行配置LoadBalancer的实现, Kubernetes Ingress,为Kubernetes中的抽象概念,实现为第三方代理实现,这种三方实现集合统称为Ingress Controller。Ingress Controller负责引入外部流量并将流量处理并转向对应的服务。 Kubernetes IngressController功能实现 上面只是说道,在Kubernetes集群中,如何将外部流量引入到Kubernetes集群服务中。 负载均衡 无论在Kubernetes集群中,无论采用什么方式进行流量引入,都需要在外部负载均衡完成,而后负载均衡将流量引入Kubernetes集群入口或内部中, 通常情况下,NodePort方式管理繁琐,一般不用于生产环境。 服务的Ingress选择 Kubernetes Ingress是选择正确的方法来管理引入外部流量到服务内部。一般选择也是具有多样性的。 Nginx Ingress Controller,Kubernetes默认推荐的Ingress,弊端①最终配置加载依赖config reload,②定制化开发较难,配置基本来源于config file。 Envoy & traefik api网关,支持tcp/udp/grpc/ws等多协议,支持流量控制,可观测性,多配置提供者。 云厂商提供的Ingress。AWS ALB,GCP GLBG/GCE,Azure AGIC Traefik介绍 traefik-现代反向代理,也可称为现代边缘路由;traefik原声兼容主流集群,Kubernetes,Docker,AWS等。官方的定位traefik是一个让开发人员将时间花费在系统研发与部署功能上,而非配置和维护。并且traefik官方也提供自己的服务网格解决方案 作为一个 modern edge router ,traefik拥有与envoy相似的特性 基于go语言研发,目的是为了简化开发人员的配置和维护 tcp/udp支持 http L7支持 GRPC支持 服务发现和动态配置 front/ edge prory支持 可观测性 流量管理 … traefik 术语 要了解trafik,首先需要先了解一下 有关trafik中的一些术语。 EntryPoints 入口点,是可以被下游客户端连接的命名网络位置,类似于envoy 的listener和nginx的listen services 服务,负载均衡,上游主机接收来自traefik的连接和请求并返回响应。 类似于nginx upstream envoy的clusters Providers 提供者,提供配置文件的后端,如file,kubernetes,consul,redis,etcd等,可使traefik自动更新 routers 路由器,承上启下,分析请求,将下游主机的请求处理转入到services middlewares: 中间件,在将下游主机的请求转入到services时进行的流量调整 在Kubernetes中使用traefik网关作为Ingress Traefik于2019年9月发布2....

正则表达式在go中使用

正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活。按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合。 Go语言通过regexp(regular expression)标准包为正则表达式提供了官方支持,包名采用regular expression的每个单词的前三个首字母组成。 Go语言的正则表达式实现的是RE2标准,Go语言的正则表达式与其他编程语言之间也有一些小的差异。 正则表达式规则 go语言中regexp包使用 简单来说,Go语言中使用正则表达式只需要两步即可: 解析、编译正则表达式 regexp.MustCompile() 返回一个regexp结构体 根据解析好的规则(结构体形式),从指定字符串中提取需要的信息。如 MatchString() FindAllSubmatch()等 go 1 2 3 4 5 6 7 8 9 10 11 12 13 package main import ( "fmt" "regexp" ) func main() { rege := regexp.MustCompile(`(\d{1,3}\.){3}\d{1,3}`) str := rege.FindAllString("SLAJDLKAJ192.168.0.1DASDASA1231", -1) fmt.Println(str) }

通过Go语言中阐述TCP Handshake

TCP的三次握手 所谓三次握手 Three-Way Handshake 是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。好比两个人在打电话: 当连接被建立或被终止,交换的报文段只包含TCP头部,而没有数据。 tcp报文头部结构 序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。 确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,确认方ack=发起方seq+1,两端配对。 标志位 ACK:确认序号有效。 FIN:释放一个连接。 RST:重置连接。 SYN:发起一个新连接。 PSH:接收方应该尽快将这个报文交给应用层。 URG:紧急指针(urgent pointer)有效。 第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号ISN(比如是100),那客户端向服务端发送的报文段包含SYN标志位(也就是SYN=1),序列号seq=100。 第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号100存起来,并且随机生成一个服务端的起始序列号(比如是300)。然后给客户端回复一段报文,回复报文包含SYN和ACK标志(也就是SYN=1,ACK=1)、序列号seq=300、确认号ack=101(客户端发过来的序列号+1)。 第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=101,于是知道服务端已经收到了序列号为100的那段报文;同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号300给存下来。然后客户端再回复一段报文给服务端,报文包含ACK标志位(ACK=1)、ack=301(服务端序列号+1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次seq就从101开始,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时seq还是101)。当服务端收到报文后发现ACK=1并且ack=301,就知道客户端收到序列号为300的报文了,就这样客户端和服务端通过TCP建立了连接。 四次挥手 比如客户端初始化的序列号ISA=100,服务端初始化的序列号ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。 第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=1101(100+1+1000,其中的1是建立连接时占的一个序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。 第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=1102(客户端FIN报文序列号1101+1)、序列号seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。 第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=1102、序列号seq=2350(2300+50)。 第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=2351、序列号seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。

使用go语言颁发CA证书

本篇文章中,将描述如何使用go创建CA,并使用CA签署证书。在使用openssl创建证书时,遵循的步骤是 创建秘钥 > 创建CA > 生成要颁发证书的秘钥 > 使用CA签发证书。这种步骤,那么我们现在就来尝试下。 创建证书的颁发机构 首先,会从将从创建 CA 开始。CA 会被用来签署其他证书 go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // 对证书进行签名 ca := &x509.Certificate{ SerialNumber: big.NewInt(2019), Subject: pkix.Name{ CommonName: "domain name", Organization: []string{"Company, INC."}, Country: []string{"US"}, Province: []string{""}, Locality: []string{"San Francisco"}, StreetAddress: []string{"Golden Gate Bridge"}, PostalCode: []string{"94016"}, }, NotBefore: time.Now(), // 生效时间 NotAfter: time.Now().AddDate(10, 0, 0), // 过期时间 年月日 IsCA: true, // 表示用于CA // openssl 中的 extendedKeyUsage = clientAuth, serverAuth 字段 ExtKeyUsage: []x509....

如何使用golang通过进程ID找到进程名称

一个很好的问题:How golang to get process name by process id (pid)? 目前看来go api并没有提供通过pid获取进程名称的方法,可以通过 /proc/<pid>/cmdline来获取对应的进程名称,也可以通过 readlink /proc/6530/exe 来获取 /proc/<pid>/cmdline 获取的为运行进程的名称,通常包含一些特殊字符。例如 "-bash\x00",sshd: root@pts/0 readlink /proc/6530/exe 获取的为对应进程运行的程序的路径 go 1 2 pid := os.Getppid() contents, err := ioutil.ReadFile(fmt.Sprintf("/proc/%d/cmdline",pid)) go 1 2 pid := os.Getppid() contents, err := os.Readlink(fmt.Sprintf("/proc/%d/cmdline",pid)) Reference process name from pid

zimbra用户管理员脚本

sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #!/bin/bash # $1 domain # $2 email zmprov ma $2 zimbraIsDelegatedAdminAccount TRUE zmprov ma $2 zimbraAdminConsoleUIComponents cartBlancheUI zimbraAdminConsoleUIComponents domainListView zimbraAdminConsoleUIComponents accountListView zimbraAdminConsoleUIComponents DLListView zmprov ma $2 zimbraDomainAdminMaxMailQuota 0 zmprov grantRight domain $1 usr $2 +createAccount zmprov grantRight domain $1 usr $2 +createAlias zmprov grantRight domain $1 usr $2 +createCalendarResource zmprov grantRight domain $1 usr $2 +createDistributionList zmprov grantRight domain $1 usr $2 +deleteAlias zmprov grantRight domain $1 usr $2 +listDomain zmprov grantRight domain $1 usr $2 +domainAdminRights zmprov grantRight domain $1 usr $2 set....

zimbra修改ServerName

文章概述了如何使用 zmsetservername 更改 Zimbra 服务器的主机名。请注意,此 CLI 命令的用法因您运行的 ZCS 版本而异。 语法: bash 1 ./zmsetservername [-h] [-d] [-f] [-s] [-o <上一个服务器名称>] [-v+] -n <服务器名称> 参数说明 Name Description –help 显示 zmsetservername 的使用选项。 –force 强制重命名,绕过安全检查。 –oldServerName 服务器以前的名称。默认为 LC zimbra_server_hostname。 –newServerName 服务器的新名称。 –deletelogger 删除旧服务器的记录器数据库。默认是将其数据重新映射到新主机名。 –skipusers 跳过使用新服务器修改用户数据库。 –usersonly 仅更新用户数据库。这样,您可以运行一次来完成所有服务器更新,然后运行第二次来更新帐户。可能需要 --force。 –verbose 设置详细级别。可以多次指定以提高级别。 Reference zm设置服务器名称

zimbra安装ssl证书

zimbra在后台安装证书签发机构签发证书出现时候出现错误:{RemoteManager: mail.domain.com->zimbra@mail.domain.com:22} text 1 2 3 com.zimbra.common.service.ServiceException: system failure: exception during auth {RemoteManager: mail.domain.com->zimbra@mail.domain.com:22} ExceptionId:qtp1068934215-357:https:https ://mail.domain.com:7071/service/admin/soap/GetMailQueueRequest: Code:service.FAILURE text 1 2 3 4 5 6 7 8 9 10 11 12 13 14 com.zimbra.common.service.ServiceException: system failure: exception during auth {RemoteManager: mail.domain.com->zimbra@mail.domain.com:22} ExceptionId:qtp1068934215-357:https:https ://mail.domain.com:7071/service/admin/soap/GetMailQueueRequest: Code:service.FAILURE at com.zimbra.common.service.ServiceException.FAILURE(ServiceException.java:286) at com.zimbra.cs.rmgmt.RemoteManager.getSession(RemoteManager.java:209) at com.zimbra.cs.rmgmt.RemoteManager.execute(RemoteManager.java:139) at com.zimbra.cert.GetCert.addCertsOnServer(GetCert.java:112) at com.zimbra.cert.GetCert.handle(GetCert.java:75) Caused by: java.io.IOException: There was a problem while connecting to mail.domain.com:22 at ch.ethz.ssh2.Connection.connect(Connection.java:699) at ch.ethz.ssh2.Connection.connect(Connection.java:490) at com.zimbra.cs.rmgmt.RemoteManager.getSession(RemoteManager.java:200) ....

powercli创建虚拟机步骤及批量创建脚本

文档中心 https://pubs.vmware.com/vsphere-51/index.jsp?topic=%2Fcom.vmware.powercli.cmdletref.doc%2FSet-OSCustomizationSpec.html https://blogs.vmware.com/PowerCLI/2014/05/working-customization-specifications-powercli-part-1.html http://powershelldistrict.com/powercli-oscustomizationspec/ https://powercli-core.readthedocs.io/en/latest/cmd_new.html#new-oscustomizationspec 官方文档中心 添加一块新硬盘 text 1 get-vm {vmname}|New-HardDisk -CapacityGB 300 批量设置硬件 text 1 Get-VM -name {hostname}*|set-VM -MemoryGB 4 -NumCPU 2 基于模板创建虚拟机 text 1 new-VM -Name {hostname} -Template template-centos76 -VMHost 10.112.131.5 -OSCustomizationspec TestLinux 设置规范模板 text 1 2 3 4 5 6 7 8 9 10 11 Get-OSCustomizationSpec TestLinux|Get-OSCustomizationNicMapping|Set-OSCustomizationNicMapping \ -IpMode UseStaticIP \ -SubnetMask 255.255.255.0 \ -DefaultGateway 10.11.121.254 \ -IpAddress 10.11.121.203 Get-OSCustomizationSpec TestLinux|Get-OSCustomizationNicMapping|Set-OSCustomizationNicMapping \ -IpMode UseStaticIP \ -SubnetMask 255....

powercli常用命令

pwsh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 Connect-VIServer -Server 10.11.17.20 -User administrator@vsphere.local -Password DC02@123456 Get-OSCustomizationSpec linux1|Get-OSCustomizationNicMapping|Set-OSCustomizationNicMapping -IpMode UseStaticIP -SubnetMask 255.255.255.0 -DefaultGateway 10.10.12.254 -IpAddress 10.10.12.114 new-VM -Name zy-ntw-prod-dbvm-pushredis01 -Template template-centos76 -VMHost 10.10.12.14 -OSCustomizationspec linux1 Get-VM -name zy-ntw-prod-dbvm-pushredis01|set-VM -MemoryGB 96 -NumCPU 16 get-vm zy-ntw-prod-dbvm-pushredis01|New-HardDisk -CapacityGB 100 New-Snapshot -Name "20200622" Connect-VIServer -Server 10....

powercli The SSL connection could not be established, see inner exception. 问题解决

text 1 Connect-VIServer -Server 这里是“SSL连接不能建立……”这实际上意味着你没有一个有效的证书。如果你想连接到vCenter没有一个有效的证书,您必须允许可以改变你的vCenter证书到受信任的一个,这是正确的解决方案,也可以忽略无效的证书,以规避所有的安全性,但使它现在的工作。 忽略无效证书 text 1 Set-PowerCLIConfiguration -InvalidCertificateAction:ignore 再次登陆可正常登陆

lua nginx module

lua 1 2 3 4 5 6 7 8 9 10 package1 = {} package1.const = "测试常量" function package1.func1() io.write("this is public func\n") end return package1 req.lua lua 1 2 3 require "package1" package1.func1() print(package1) text 1 2 3 lc@lc-virtual-machine:~/lua$ lua pack1.lua this is public func table: 0x5575766224a0 注意事项: 测试文件是和封装好的模块在同一个目录,否则引用时需要设置路径。 lua 1 2 3 4 5 6 7 package.path = '/home/lc/lua/1/package1.lua;'; require "package1" package1.func1() print(package1) 模块名称和文件名称必须相同

lua nginx api

lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 location = /reqq { default_type text/plain; content_by_lua_block { ngx.req.read_body() local data = ngx.req.get_body_data() local args, err = ngx.req.get_uri_args() if not args then ngx.say('post fail') return end for key,v in pairs(args) do ngx.say(key,"::",v,"--") end ngx.say(data) } } ngx.exec 内部重定向 lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 location = /bb { default_type text/plain; content_by_lua_block{ ngx....

lua cjson使用

cjson下载 https://github.com/mpx/lua-cjson.git 下载解压后,编译需要根据自己的lua环境以及操作系统修改Makefile的一些配置,不然容易出错。 以下是Makefile中的一些配置。 c 1 2 3 4 5 6 7 8 LUA_VERSION = 5.2 TARGET = cjson.so PREFIX = /usr/local CJSON_LDFLAGS = -shared LUA_INCLUDE_DIR = $(PREFIX)/include LUA_CMODULE_DIR = $(PREFIX)/lib/lua/$(LUA_VERSION) LUA_MODULE_DIR = $(PREFIX)/share/lua/$(LUA_VERSION) LUA_BIN_DIR = $(PREFIX)/bin https://blog.gezhiqiang.com/2017/08/24/lua-cjson/ lua 1 2 3 4 5 6 7 8 9 10 11 12 13 local cjson = require("cjson") local obj = { id = 1, name = "zhangsan", age = nil, is_male = false, hobby = {"zhangsan","lisi","wangwu"} } local str = cjson....

jenkins在Mac OS下的迁移记录

修改启动用户 先停止jenkins服务 sh 1 2 sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist sudo vim /Library/LaunchDaemons/org.jenkins-ci.plist 授权jenkins工作目录和临时目录 text 1 2 sudo chown -R zhulangren:wheel /Users/Shared/Jenkins/ sudo chown -R zhulangren:wheel /var/log/jenkins/ 启动jenkins text 1 sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist jenkins自启动文件路径 text 1 /Library/LaunchDaemons/org.jenkins-ci.plist 卸载脚本文件 text 1 /Library/Application\ Support/Jenkins/Uninstall.command 修改jenkins启动端口 text 1 sudo defaults write /Library/Preferences/org.jenkins-ci httpPort '9999' 读取jenkins配置文件 text 1 defaults read /Library/Preferences/org.jenkins-ci 设置自启动 text 1 sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plis 取消自启动 text 1 sudo launchctl unload /Library/LaunchDaemons/org....

jenkins历史比较

文中的代码来自可以从github下载: https://github.com/ciandcd 插件 jobConfigHistory,可以查看job配置的修改历史。 安装后重启jenkins,然后对job的配置修改后,可以点击job config history连接查看修改历史。 选择需要比较的版本,可以diff两个版本间的差别。