英语的符号表达

面试 infosys 的时候是一个印度老哥做考官,他问我的问题我是一句都听不懂的,确实是听不懂。 然后他把问题在 webex 中打出来我回答的。 其中有一个问题是:如何用CLI查出系统中内存占用最高的5个进程 ps aux --sort=-%mem | head -n 5 上面一句如何用英语表达出来呢,不好说啊 所以记录一下,以备将来不时之需 . period 句号 , comma 逗号 : colon 冒号 ; semicolon 分号 ! exclamation 惊叹号 ? question 问号 - hyphen 连字符 * asterisk 星号 ' apostrophe 所有格符号,单词内部的省略 — dash 破折号 _ underscore ‘ ’ single quotation marks 单引号 “ ” double quotation marks 双引号 ( ) round brackets 圆括号 [ ] square brackets 方括号 <> Angle brackets 尖括号 {} curly brackets or braces 大括号 《 》French quotes 法文引号;书名号 ... ellipsis 省略号 ¨ tandem colon 双点号 " ditto 同上 ‖ parallel 双线号 / slash 斜线号 & ampersand = and ~ tilde 波浪号 § section; division 分节号 → arrow 箭号;参见号 | vertical bar 竖线 backslash 反斜线 % percent 百分号

2022年11月17日

阿里云IPSec与锐捷路由器得连接

现在也开始搞起桌面运维了,其实还感觉蛮有意思的。 公司的主路由器是锐捷的NBR6205-E,作为IPSec的服务端,而阿里云作为客户端。 首先先普及一下IPSec的知识,IPSec目前只支持IPv4单播: 密钥安全有 IKE 负责;数据安全方面,有 IPSec 负责。 但是IKE也是 IPSec 的 一 部分,不能独立存在。存在两个SA分别为 ISAKMP Security Association(IKE SA) IPsec Security Association(IPsec SA) 在这里注意一点就是IKE SA=ISAKMP SA IKE SA的 lifetime 默认为 86400 秒,即一天,默认没有volume limit。 用户的数据流量真正是在 IPsec SA 上传递的,而不是在IKE SA; IPsec SA直接为用户数据流服务,IPsec SA中的所有安全策略都是为了用户数据流的安全。 IPsec SA的 lifetime 默认为3600 秒,即1小时;默认volume limit为4608000 Kbytes,即4.608 Gbyte。 因为SA有两个,分为IKE SA和IPsec SA,两个SA分别定义了如何保护密钥以及如何保护数据,其实这两个SA都是由IKE建立起来的,所以将IKE的整个运行过程分成了两个Phase(阶段),即 : IKE Phase Two IKE Phase One 一、IKE Phase One第一阶段 IKE Phase One的主要工作就是建立IKE SA(ISAKMP SA),IKE SA的服务对象并不是用户数据,而是密钥流量,以及为IPsec SA服务的;IKE SA的协商阶段被称为main mode(主模式)还有 aggressive 野蛮模式,IKE也是需要保护自己的流量安全的(这些流量并非用户流量),所以IKE SA之间也需要协商出一整套安全策略,否则后续的密钥和IPsec SA的建立就不能得到安全保证; ...

2022年11月15日

L2TP VPN在CentOS7系统下的搭建

这是个很奇怪的事情,应聘了一家搞 CDN 的公司,结果上去看了一下根本不对路。就立刻辞了,但是发现它给员工开的 L2TP VPN 确实非常好用。 于是就自己也搭一个,方便自用。下面记录一下安装过程,环境是CentOS 7 一、装L2TP # yum install epel-release # yum install xl2tpd libreswan 二、修改核心参数 # vi /etc/sysctl.conf vm.swappiness = 0 net.ipv4.neigh.default.gc_stale_time=120 net.ipv4.conf.all.rp_filter=0 net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.all.arp_announce=2 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 1024 net.ipv4.tcp_synack_retries = 2 net.ipv4.conf.lo.arp_announce=2 net.ipv4.ip_forward = 1 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.default.accept_source_route = 0 # sysctl -p 三、配置 IPSEC # vi /etc/ipsec.d/l2tp_psk.conf conn L2TP-PSK-NAT rightsubnet=vhost:%priv also=L2TP-PSK-noNAT conn L2TP-PSK-noNAT authby=secret pfs=no auto=add keyingtries=3 dpddelay=30 dpdtimeout=120 dpdaction=clear rekey=no ikelifetime=8h keylife=1h type=transport left=192.168.10.232 leftprotoport=17/1701 right=%any rightprotoport=17/%any 注意上面的 left=192.168.10.232,这是服务器的ip地址,要更换为自己服务器的地址(如果在防火墙后,写内网地址,非映射后的公网IP) ...

2022年11月13日

Kafka的安装和验证

生产环境要用到kafka,记录一下安装过程,其实最重要的不是安装,而是使用。 时间节点是2022年7月10日,zookeeper的版本是3.4.14: wget https://mirrors.cnnic.cn/apache/zookeeper/stable/zookeeper-3.4.14.tar.gz kafka的版本是3.2,注意前面的2.13是scala的版本 wget http://archive.apache.org/dist/kafka/3.2.0/kafka_2.13-3.2.0.tgz 软件都下载好以后,找三台服务器,软件都放到 /usr/local 路径下: 服务器的ip是: 172.18.31.50 172.18.31.51 172.18.31.52 移动软件: tar zxvf zookeeper-3.4.14.tar.gz mv apache-zookeeper-3.6.3-bin /usr/local tar zxvf kafka_2.13-3.2.0.tgz mv kafka_2.13-3.2.0 /usr/local 然后得装 java 了,centos 版本 yum -y install epel-release yum -y install java-11-openjdk-devel 首先去编辑zookeeper的配置文件,然后启动 cp /usr/local/apache-zookeeper-3.6.3-bin/conf/zoo_sample.cfg /usr/local/apache-zookeeper-3.6.3-bin/conf/zoo.cfg 编辑zoo.cfg,增加几行 dataDir=/data/zookeeper metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider metricsProvider.httpPort=7000 metricsProvider.exportJvmInfo=true server.0=172.18.31.50:20881:30881 server.1=172.18.31.51:20881:30881 server.2=172.18.31.52:20881:30881 注意上面,我们的数据目录是在/data/zookeeper,所以要先建立好目录结构 然后有三台服务器么,把各自的id放到文件中,然后20881是三台服务器之间的通讯端口,30881是选举端口 mkdir /data/zookeeper -p echo 0 >/data/zookeeper/myid 三台服务器分别启动 /usr/local/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start 验证一下 /usr/local/apache-zookeeper-3.6.3-bin/bin/zkCli.sh [zk: localhost:2181(CONNECTED) 1] ls / [admin, brokers, cluster, config, consumers, controller, controller_epoch, feature, isr_change_notification, latest_producer_id_block, log_dir_event_notification, zookeeper] 看看 / 下有东西就行了,上面是已经装好了 kafka 和 cruisecontrol的情形,东西就比较多了 ...

2022年11月13日

Python下Django环境的准备

其实本身自己是比较喜欢 javascripts 的,但是 Python 也是必须掌握的一项技能。 干 devops ansible 跟 python 也脱不了干系,所以准备用 django 开发一个自动上线的系统。 先准备一下 Python 以及 Django 的环境好了。 一、准备 Python 秘籍,不要用什么 venv 之类的东西,污染环境。直接下载源代码编译安装,然后把 py 封到自己的密闭是王道,最后引用一下 $PATH ,想用哪个就用哪个。 注意以下的步骤,先装 gcc 的编译环境,然后装 openssl 的高版本,并且配置好 ldconfig,否则 py 的 ssl 会报错。 最后下载 python 3.8.15 编译安装,生产环境,最好采用最新版本往后错两个版本。 编译安装到 /export/servers/python3目录 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel wget https://www.openssl.org/source/openssl-1.1.1q.tar.gz ./config --prefix=/export/servers/openssl vi /etc/ld.so.conf /export/servers/openssl/lib ldconfig -v wget https://www.python.org/ftp/python/3.8.15/Python-3.8.15.tgz ./configure --prefix=/export/servers/python3 --with-openssl=/export/servers/openssl --with-ssl-default-suites=openssl 最后一步: ...

2022年10月27日

Gitlab的CICD实际生产环境应用

Gitlab 和 Jenkins 一样,都是很流行的 CI/CD 工具,当然,本站之前推过国人自产的东西 onedev,那个也相当不错,但是用的人毕竟还是少,这回还是用大家都耳熟能详的东西。 本篇就是 Giblab 在生产环境打包发布的一个全流程。 解释一下上图: 首先有两套Git,一套是程序员的Code仓库,另一套是运维的操作代码,里面是一些yaml啊,一些ansible脚本啊 然后流程就是先取出程序员的Code,build出来jar,然后打成镜像推到仓库,然后再取出运维的代码,进行合并,生成k8s的yaml文件,最后推到 kubernetes 中去,这样整个 GitOPS 的流程就完备了 在 gitlab 中非常简单,就是编辑 .gitlab-ci.yaml 文件 image: docker:19.03.12 variables: DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "" MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" TIMEZONE: "Asia/Shanghai" http_proxy: "" https_proxy: "" no_proxy: "" cache: paths: - .m2/repository/ - target/ stages: - build - push - deploy Build: stage: build image: maven:3.5-jdk-8-alpine before_script: - export COMMIT_TIME=$(TZ=CST-8 date +%F-%H-%M) - echo $COMMIT_TIME - echo "COMMIT_TIME=$COMMIT_TIME" >> build.env script: - ./mvnw package artifacts: reports: dotenv: build.env tags: - yunwei Push: stage: push before_script: - docker info || true - echo "$HARBOR_REGISTRY $HARBOR_USERNAME $HARBOR_PASSWORD" - echo "echo Dingfangwen | docker login 172.18.31.28 -u dingfangwen --password-stdin" - echo -n $HARBOR_PASSWORD | docker login $HARBOR_REGISTRY -u $HARBOR_USERNAME --password-stdin script: - docker pull $HARBOR_REGISTRY_IMAGE:latest || true - > docker build --cache-from $HARBOR_REGISTRY_IMAGE:latest --build-arg http_proxy=$http_proxy --build-arg https_proxy=$https_proxy --build-arg no_proxy=$no_proxy --cache-from HARBOR_REGISTRY_IMAGE:latest --tag $HARBOR_REGISTRY_IMAGE:$COMMIT_TIME --tag $HARBOR_REGISTRY_IMAGE:latest . - docker push $HARBOR_REGISTRY_IMAGE:$COMMIT_TIME - docker push $HARBOR_REGISTRY_IMAGE:latest - docker logout $HARBOR_REGISTRY dependencies: - Build tags: - yunwei Deploy: stage: deploy cache: {} image: cnych/kustomize:v1.0 script: - echo $COMMIT_TIME - git config --global user.email "gitlab@git.k8s.local" - git config --global user.name "GitLab CI/CD" - git clone git://172.18.31.50:30000/test-k8s.git - cd test-k8s/prod - kustomize edit set image $HARBOR_REGISTRY_IMAGE:$COMMIT_TIME - cat kustomization.yaml - git commit -am 'PROD image update' - git push origin master dependencies: - Build tags: - yunwei only: - master when: manual 先不着急看这个文件,再普及一下 gitlab 的运行机制,它是通过 gitlab-runner 来执行cd的过程的。配置gitlab runner其实也是一项非常复杂的工作,里面可以配的东西太多了,不是本篇的范畴。我们这里简单来说,runner就是一个Docker容器。更准确的说,就是Docker in Docker。 ...

2022年10月25日

sed的进阶用法

sed 和 awk 以及 cut 算是常用工具了,sed的高级用法也需要知道一下 sed 里面有2个空间,一个是pattern space,一个是hold space,默认都是空的 开始处理的时候,就从文件里一行一行读入 pattern space ,进行处理,hold space 只在你需要用到它的时候才会出现: d : 清空pattern space中的内容,立即开始下个循环(意思是跳过默认的输出pattern space内容的阶段???不知理解的对不对) h : 用pattern space中的内容替换hold pattern中的内容 H : 在hold space中的内容后面追加一个换行,把pattern space中的内容追加到hold space中 g : 用hold space中的内容替换pattern space中的内容 G : 在pattern space中的内容后面追加一个换行,把hold space中的内容追加到pattern space中 h, g会替换(可以理解为先清空,再复制), H, G是追加。 hH是放过去,gG是拿过来,小写是替换,大写是追加 分析一下经典的将文件内容反向打印 cat 1.txt 1 2 3 cat 1.txt | sed -n '1!G;h;$p' 3 2 1 ‘1!G;h;$p’ 分析一下,1!G就是说第一行不执行G,从第二行开始执行G;然后h是每行都执行,最后一行的时候执行p input | pattern | hold | command | pattern | hold | command | pattern | hold 1 | 1 | 空行 | | 1 | 空行 | h | 1 | 1 2 | 2 | 1 | G | 21 | 1 | h | 21 | 21 3 | 3 | 21 | G | 321 | 21 | h | 321 | 321 ...

2022年10月24日

iptables的基本用法

面试的时候经常会被问到 iptables 的问题,那么下面就运维角度来总结一下基本的用法。 看晕了吧,不要紧,我们关注上面的5个红色,5个链条,然后继续看下面的表,详细解释了上面的流程: 两张图结合起来看,意思就是整个 iptables 可以动手的地方太多了。 我们完全没必要关注那么多的细节,常用的地方就2个: 一、最后的出口nat postrouting iptables -t nat -A POSTROUTING -s 10.11.0.0/16 -j SNAT --to 172.16.8.1 上面是做 openvpn 时常用的,一定记得不要乱用 MASQUERADE,而要指定 特定网段(10.11.0.0/16) 从 特定IP(172.16.8.1) 出去。 二、filter表 filter表是 iptables 缺省不带参数查看的表,用于过滤数据包,这是我们操作的最多的地方 iptables -I INPUT -s 185.207.178.236/32 -p tcp --dport 12530 -j ACCEPT iptables -A INPUT -p tcp --dport 12530 -j DROP 上面就只开放了一个IP 185.207.178.236可以访问本机的12530端口,其余的统统封掉,这是最常用的脚本了。 OK,以上两点是最常用的。其余的端口转发之类的,最好中间用haproxy和nginx进行代理,否则查看 iptables 系统的架构就变得不清晰了。 下面贴上常用的参数: -p tcp/udp/icmp/all 匹配协议,all会匹配所有协议 -s addr[/mask] 匹配源地址 -d addr[/mask] 匹配目标地址 --sport 匹配源端口(可指定连续的端口)如--sport80 --dport 匹配目的端口(可指定连续的端口)如--dport80 -o interface 匹配出口网卡,只适用于FORWARD、POSTROUTING、OUTPUT(例:iptables -A FORWARD -o eth0) -i interface 匹配入口网卡,只适用于PREROUTING、INPUT、FORWARD --icmp-type 匹配icmp类型(使用iptables -p icmp -h可查看可用的icmp类型) --tcp-flags mask comp 匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记(例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT 表示匹配SYN和ACK标记的数据包) -j DROP/ACCEPT/REJECT/LOG 拒绝/允许/拒绝并发出消息/在/var/log/messages中登记分组匹配的记录 -m mac -mac 绑定MAC地址 -m limit -limit 1/s 1/m 设置时间策略 -s 192.168.1.153或192.168.1.0/24 指定源地址或地址段 -d 192.168.1.153或192.168.1.0/24 指定目标地址或地址段 -s ! 192.168.1.0 指定源地址以外的 基本的2个用法足够满足日常运维的需要了。 ...

2022年10月24日

systemd与journalctl的双剑合璧

时代已经进化到 systemd 的年代了,service 应该是彻底没有市场了 systemd 的好处是写程序的时候再也不用 fork 甩脱父进程了,日志直接输出终端即可 对 java 来说也是个好事,所有的日志比如WARN ERROR INFO都可以交给journal来管理,这样要查找日志也非常方便了。 举个例子,我们要把一个java启动的程序做成 systemd 的: vim /etc/systemd/system/circle.service [Unit] After=network.target Wants=network.target [Service] WorkingDirectory=/export/prod/server Type=simple ExecStart=/usr/bin/java -jar -Dspring.config.location=application.properties -Dlog4j2.formatMsgNoLookups=true server.jar Restart=on-failure RestartSec=1s [Install] WantedBy=multi-user.target 然后就可以运行了: systemctl daemon-reload systemctl start circle 注意上面的WorkingDirectory,因为下面java启动指定 application.properties 配置文件的时候没有用绝对路径,那么这里就要指定当前工作目录了。 另外RestartSec=1s也改了,缺省是10ms,太快了 当然这只是第一步,日志是归journal管了,journal还是需要进一步配置的 首先必须要持久化存储到磁盘,否则只会在/run/log/journal内存中存放,重启就没了 #disk-usage查看的是: 内存+/var/log/journal的加起来的总和大小 journalctl --disk-usage 然后我们需要修改配置,让它持久化 vi /etc/systemd/journald.conf Storage=persistent 修改重启 mkdir /var/log/journal systemd-tmpfiles --create --prefix /var/log/journal systemctl restart systemd-journald 最后刷一下,把内存的文件刷到磁盘中 journalctl --flush 还可以设置保存天数: journalctl --vacuum-time=31d 查看是从那一天开始保存的,进目录查看时间戳即可 cd /var/log/journal ls -lha 最后就是一个秘籍了,如果把日志弄出来查看 journalctl -u circle --since "2022-10-19 14:30:00" --until "2022-10-19 15:00:00" 开发人员经常问我要日志,这样就特别方便快捷了,比从log4j的日志目录里拉方便的多。 ...

2022年10月19日

awk的用法

awk 是比较强力的工具,跟cut和sed组合起来,会有意想不到的作用 举个简单例子,我们nginx的access.log如下: 110.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 10616 "http://my.jjwxc.net/" 220.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 20616 "http://my.jjwxc.net/" 330.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 30616 "http://my.jjwxc.net/" 410.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 10616 "http://my.jjwxc.net/" 530.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 10616 "http://my.jjwxc.net/" 650.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 50616 "http://my.jjwxc.net/" 760.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 60616 "http://my.jjwxc.net/" 第一个字段是ip,然后倒数第3个是200,表示200 OK,后面的就是传输了多少数据两给客户端 我们要统计一下流量大的前5名是谁。 ...

2022年9月25日