Hero Image
用 iptables 和 ip rule 做负载均衡

用 iptables 和 ip rule 做负载均衡 操作 这里以一台通过有线 + 无线出口连接到互联网的 Arch Linux 设备为例。其中共有两个出口,分别使用网卡 eth0 和 eth1。大概的对应关系是: 标记 10 (0xa) - 路由表 #110 - 使用 eth0 出口 标记 11 (0xb) - 路由表 #111 - 使用 eth1 出口 我们会根据数据包上包含的标记值来判断它应该走什么出口。首先,使用 ip rule 为每个标记值指定一张使用的路由表。 通常默认路由表的权重是 32768。为了让我们的路由表用得上,我们需要把它们的权重调得高一些(例如 31000)。 # 让带标记 10 (0xa) 的数据包使用 110 号路由表,权重 31000 ip rule add fwmark 10 table 110 prio 31000 # 让带标记 11 (0xb) 的数据包使用 111 号路由表,权重 31000 ip rule add fwmark 11 table 111 prio 31000 # 如果你的连接更多,可以继续添加标记 <-> 路由表的对应关系 # #110 路由表的路由 ip route add 10.20.0.0/24 dev eth0 table 110 ip route add default via 10.20.0.254 table 110 # #111 路由表的路由 ip route add 10.25.0.0/24 dev eth1 table 111 ip route add default via 10.25.0.254 table 111 # 如果这条连接已经被标记,那么把标记设置到数据包上 iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark # 如果数据包已经有标记,直接放行 iptables -t mangle -A OUTPUT -m mark ! --mark 0 -j ACCEPT # 如果数据包没被标记的话 # 把数据包包的标记设置为 11 (0xb)... iptables -t mangle -A OUTPUT -j MARK --set-mark 10 # 并且每 2 个包就把一个包的标记设置为 10 (0xa) iptables -t mangle -A OUTPUT -m statistic --mode nth --every 2 --packet 0 -j MARK --set-mark 11 # 如果你有三条出口的话,这里可以类似于 # iptables -t mangle -A OUTPUT -j MARK --set-mark 10 # iptables -t mangle -A OUTPUT -m statistic --mode nth --every 3 --packet 0 -j MARK --set-mark 11 # iptables -t mangle -A OUTPUT -m statistic --mode nth --every 3 --packet 1 -j MARK --set-mark 12 # 把数据包的标记存储到整条连接上,这样整个连接过程都会使用同一条出口 iptables -t mangle -A OUTPUT -j CONNMARK --save-mark # 我们还需要让数据包上标示的出口是我们为其选择的出口 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE 之后可以用 iptables -L OUTPUT -t mangle 看一下自己所设置的规则是否正确。然后就可以用 Wiresharks 看一看自己的连接是不是真的分流啦。

Hero Image
Hero Image
Some Jenkinsfile examples

Some Jenkinsfile examples Parallel #!/usr/bin/env groovy pipeline { agent any stages { stage("Build") { steps { sh 'mvn -v' } } stage("Testing") { parallel { stage("Unit Tests") { agent { docker 'openjdk:7-jdk-alpine' } steps { sh 'java -version' } } stage("Functional Tests") { agent { docker 'openjdk:8-jdk-alpine' } steps { sh 'java -version' } } stage("Integration Tests") { steps { sh 'java -version' } } } } stage("Deploy") { steps { echo "Deploy!" } } } } When #!/usr/bin/env groovy pipeline { agent any environment { VALUE_ONE = '1' VALUE_TWO = '2' VALUE_THREE = '3' } stages { // skip a stage while creating the pipeline stage("A stage to be skipped") { when { expression { false } //skip this stage } steps { echo 'This step will never be run' } } // Execute when branch = 'master' stage("BASIC WHEN - Branch") { when { branch 'master' } steps { echo 'BASIC WHEN - Master Branch!' } } // Expression based when example with AND stage('WHEN EXPRESSION with AND') { when { expression { VALUE_ONE == '1' && VALUE_THREE == '3' } } steps { echo 'WHEN with AND expression works!' } } // Expression based when example stage('WHEN EXPRESSION with OR') { when { expression { VALUE_ONE == '1' || VALUE_THREE == '2' } } steps { echo 'WHEN with OR expression works!' } } // When - AllOf Example stage("AllOf") { when { allOf { environment name:'VALUE_ONE', value: '1' environment name:'VALUE_TWO', value: '2' } } steps { echo "AllOf Works!!" } } // When - Not AnyOf Example stage("Not AnyOf") { when { not { anyOf { branch "development" environment name:'VALUE_TWO', value: '4' } } } steps { echo "Not AnyOf - Works!" } } } }

Hero Image
Shell脚本学习笔记

Shell 脚本学习笔记 执行算术运算 val=`expr $a + $b` 运算符 符号 说明 示例 ! 非运算 [ ! false ] -o 或运算 [ $a -lt 20 -o $b -gt 20 ] -a 与运算 [ $a -lt 20 -a $b -gt 20 ] = 相等检测 [ $a = $b ] != 不相等检测 [ $a != $b ] -z 字符串长度是否为 0,为 0 则返回 true [ -z $a ] -n 字符串长度不为 0, 不为 0 返回 true [ -n $a ] str 检测字符串是否为空,不为空返回 true [ $a ] -b 检测文件是否是块设备文件 [ -b $file ] -c 检测文件是否是字符设备 .. -d 检测文件是否为目录 [ -d $file ] -f 检测文件是否为普通文件 [ -f $file ] -r 检测文件是否可读 .. -w 检测文件是否可写 .. -x 检测文件是否可执行 .. -s 检测文件是否为空 .. -e 检测文件是否存在 .. 特殊变量 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数 $# 传递给脚本或函数的参数个数 $* 传递给脚本或函数的所有参数,所有参数被当做一个词,例如 “1 2 3” $@ 传递给脚本或函数的所有参数,每个参数当做一个词,用双引号包含,例如"1" “2” “3” $? 上个命令的退出状态,或函数的返回值 $$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID POSIX 程序退出状态 状态码 含义 0 命令成功退出 > 0 在重定向或者单词展开期间(~、变量、命令、算术展开以及单词切割)失败 1 - 125 命令不成功退出。特定的退出值的含义,有各个命令自行定义 126 命令找到了,但是文件无法执行 127 命令没有找到 > 128 命令因收到信号而死亡 输入输出重定向 命令 说明 command > file 将输出重定向到 file。 command > file 将输出以追加的方式重定向到 file。 n > file 将文件描述符为 n 的文件重定向到 file。 n » file 将文件描述符为 n 的文件以追加的方式重定向到 file。 n >& m 将输出文件 m 和 n 合并。 n <& m 将输入文件 m 和 n 合并。 « tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 文件包含 使用.或者source包含文件