落羽杉
这个https://www.cnblogs.com/6262lonely/articles/11119625.html里收集了在kt工作时遇到问题后查找的一些链接。那时的自己,问题解决了就行,未将每一个问题仔细整理。在魔兽世界吧里面看到了几篇很老的帖子,那时的网友大部分还是很可爱。这一篇只能是杂记了……
docker inspect --format
看到了一个运维开发的博客,看到了docker inspect --format这篇。
https://www.escapelife.site/posts/8bf741fb.html#toc-heading-2
之前看和k8s有关的视频的时候,看到docker inspect --format这块,只是用了下。后面的工作中就用如下格式了:
1 docker inspect containerID | grep -i network
docker inspect 输出的是json格式的数据,而docker inspect --format则使用给定的Go模板格式化输出。
1 -f, --format string Format the output using the given Go template
JSON中的数据类型:(插入的是Python格式的,需要现在前面加#号)
# number:和JavaScript的number完全一致; # boolean:就是JavaScript的true或false; # string:就是JavaScript的string; # null:就是JavaScript的null; # array:就是JavaScript的Array表示方式——[]; # object:就是JavaScript的{ ... }表示方式。
并且,JSON还定死了字符集必须是UTF-8,表示多语言就没有问题了。为了统一解析,JSON的字符串规定必须用双引号"",Object的键也必须用双引号""。
参考:https://www.liaoxuefeng.com/wiki/1022910821149312/1023021554858080
Go模板语法:
1 # 输出文本:{{ . }},其中 . 表示当前的数据对象。 2 # 输出变量:{{ .variable }},其中 variable 表示要输出的变量名。 3 # 输出变量的某个字段:{{ .variable.field }},其中 field 表示要输出的字段名。 4 # 条件判断:{{ if condition }} ... {{ end }},其中 condition 表示要判断的条件,如果条件成立,会执行 ... 中的代码。 5 # 条件判断和 else:{{ if condition }} ... {{ else }} ... {{ end }},其中 else 表示条件不成立时要执行的代码。 6 # 循环:{{ range array }} ... {{ end }},其中 array 表示要循环的数组或切片,... 中的代码会对数组或切片中的每个元素进行渲染。 7 # 变量赋值:{{ $variable := value }},其中 variable 表示要赋值的变量名,value 表示要赋给变量的值。 8 # 模板嵌套:{{ template "name" . }},其中 name 表示要嵌套的模板名称,. 表示要传递给模板的数据对象。 9 # 函数调用:{{ function parameter }},其中 function 表示要调用的函数名,parameter 表示要传递给函数的参数。
ChatGPT给的答案。
Go官方:https://golang.org/pkg/text/template/
docker network inspect bridge
[
{
"Name": "bridge",
"Id": "bec9bbf537fd27653663bb7e8da59945280f4d60a48b6eb9f2094507eca56ecb",
"Created": "2023-04-08T09:35:40.370935879+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0d12098b1009edcdeb1a7e3d124a124e0d20bc16aa480f64212fac1e6096a97d": {
"Name": "inspiring_curie",
"EndpointID": "a3dadd39d62010ebb1a0e4f32687033780156e385f462b3ee6734a6c36b05155",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"fccb368b8e7d4b50c66c8057bf344fad049f17d3f46415a97b6c79cd30473671": {
"Name": "ecstatic_dijkstra",
"EndpointID": "525ebea7378729afd888c5e62f77ea2af0e4744fc848b7d24a7bdbfe9bb708bd",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
点号表示当前对象及上下文,和Java、C++中的this类似,可以直接通过点来获取当前对象。另外,如果返回结果也是一个Struct对象(Json中以花括号大括号包含),则可以直接通过点号级联调用,获取子对象的指定属性值。
[root@k8s-rancher ~]# docker network inspect -f '{{.Name}}' bridge bridge
如果需要获取的属性名称包含点号(比如下列示例数据)或者以数字开头,则不能直接通过级联调用获取信息。因为属性名称中的点号会被解析成级联信息,进而导致返回错误结果。即便使用引号将其包含也会提示语法格式错误。此时,需要通过index来读取指定属性信息。
index是Go语言的内置函数,用于获取一个数组或切片(.Options)中指定索引位置(com.docker.network.bridge.name)的元素。
[root@k8s-rancher ~]# docker inspect -f '{{/*读取网络在hosts上的名称*/}}{{index .Options "com.docker.network.bridge.name"}}' bridge
docker0
# 自定义变量
[root@k8s-rancher ~]# docker inspect -f '{{println}}{{range $p,$conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}}{{println}}{{end}}' fcc
443/tcp -> 443
80/tcp -> 80
# range
[root@k8s-rancher ~]# docker inspect --format '{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}' bridge
inspiring_curie
ecstatic_dijkstra
[root@k8s-rancher ~]# docker inspect --format '{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}' none
With No Containers
# index(Config属性一个Map)
[root@k8s-rancher ~]# docker inspect bridge -f '{{(index .IPAM.Config 0).Gateway}}'
172.17.0.1
[root@k8s-rancher ~]# docker inspect bridge -f '{{(index .IPAM.Config 0).Subnet}}'
172.17.0.0/16
# else
1)not
[root@k8s-rancher ~]# docker inspect -f '{{if not .State.Restarting}}容器没有配置重启策略{{end}}' $(docker ps -q)
2023.04.09
./configure
./configure make make install
这三行自己应该用了很多次,大多时候是看着编译时屏幕的输出,偶尔处理下其中的异常。
configure(配置)脚本负责在你使用的系统上准备好软件的构建环境。确保接下来的构建和安装过程所需要的依赖准备好,并且搞清楚使用这些依赖所需要的东西。
安装samba时需要的其他安装包的.so包其实应该就是samba的依赖。
make(构建)当configure配置完毕后,可以使用make命令执行构建。这个过程会执行在Makefile文件中定义的一系列任务将源代码编译成可执行文件。
你下载的源码包一般没有一个最终的Makefile文件,一般是一个模版文件Makefile.in文件,然后configure根据系统的参数生成一个定制化的Makefile文件。
make install(安装)现在软件已经被构建好并且可执行,接下来要做的就是将可执行文件复制到最终的路径。make install命令就是将可执行文件、第三方依赖包和文档复制到正确的路径。
这通常意味着,可执行文件被复制到某个PATH包含的路径,程序的调用文档被复制到某个MANPATH包含的路径,还有程序依赖的文件也会被存放在合适的路径。
因为安装这一步也是被定义在Makefile中,所以程序安装的路径可以通过configure命令的参数指定,或者configure通过系统参数决定。
如果要将可执行文件安装在系统路径,执行这步需要赋予相应的权限,一般是通过sudo。
参考:https://zhuanlan.zhihu.com/p/77813702
Python定时刷新页面
import time from selenium import webdriver # 指定要打开的网页 url = "https://www.cnblogs.com/6262lonely/p/17284705.html" # 使用webkdriver.Chrome()创建一个Chrome浏览器的实例 driver = webdriver.Chrome() driver.get(url) # 在一个无限循环中,使用time.sleep(10)等待10s钟,然后使用driver.refresh()刷新页面 while True: time.sleep(10) driver.refresh() # 需要注意的是,这种方式刷新网页可能会受到网页本身的限制,有些网站可能会限制频繁的刷新请求,或者会提示验证码等验证信息。 # 因此,使用这种方式时需要注意遵守网站的使用规则,以避免被封禁或者触发安全策略。
参考:https://juejin.cn/s/python%20%E5%AE%9A%E6%97%B6%E5%88%B7%E6%96%B0%E9%A1%B5%E9%9D%A2
是因为没事就要刷新工单页面,所以就在网上找到了这个链接。但功能太过单一,是在新的页面打开然后进行刷新,不是在已打开的页面,也不能自动登录。
pyinstaller
# 安装 pip install pyinstaller # 打包为.exe文件 pyinstaller -F main.py # -w参数不带控制台的打包(可是我的打包完后依然有显示控制台) pyinstaller -F -w main.py # 打包指定exe图标打包(没有指定图标的话会有默认的图标) pyinstaller -F -i xx.ico main.py # 生成的.exe文件会在当前项目路径下一个名为dist的文件夹下(也可以通过--specpath指定spec文件的路径)
参考:https://cloud.tencent.com/developer/article/1591443
error:[12780:21652:0409/225210.385:ERROR:device_event_log_impl.cc(218)] [22:52:10.385] USB: usb_device_handle_win.cc:1046 Failed to read descriptor from node connection: 连到系统上的设备没有发挥作用。 (0x1F)
2023.04.09
chattr
加固后想要删除一些文件,提示权限不足。
[root@jazzmusic shell]# chattr +i ip.txt [root@jazzmusic shell]# lsattr ip.txt ----i----------- ip.txt [root@jazzmusic shell]# echo "abc" >> ./ip.txt -bash: ./ip.txt: Permission denied [root@jazzmusic shell]# chattr -i ip.txt [root@jazzmusic shell]# lsattr ip.txt ---------------- ip.txt [root@jazzmusic shell]# echo "abc" >> ./ip.txt [root@jazzmusic shell]# cat ip.txt 192.168.24.1 192.168.24.2 22.12.3.4 22.12.3.5 abc
参考:https://linux-of-cww.readthedocs.io/zh/latest/cmd/chattr.html
https://wangchujiang.com/linux-command/c/chattr.html
chown -R strawer:strawer ./test/1执行完之后test目录的属组并没有改变,一开始还有点纳闷,其实是从目录1开始递归的。
iptables规则
HA的端口起来了,但是通过127.0.0.1telnet端口并不通。
不知道是谁设置了iptables规则,限制了端口。
# 显示规则 iptables -L INPUT --line-numbers # 删除查到的第一条规则 iptables -D INPUT 1 # 删除所有规则 iptables -F
参考:https://blog.csdn.net/yelllowcong/article/details/75949296
no man manifest attribute
日志提示上面内容,一开始没注意。手动启动jar包也是上面的提示。最后开发说是没有打包主类。
HAproxy
Bamboo是一个Web守护进程可自动的配置HAproxy用于发布在Apache Mesos和Marathon的Web服务。
特性:
为每个马拉松应用程序配置HAProxy ACL规则的用户界面Rest接口,用于配置代理ACL规则。
配置文件路径:
/etc/haproxy/haproxy.cfg
配置文件内容:
global全局配置段
日志
性能
proxies代理配置段
defaults:为frontend, backend, listen提供默认配置;
fronted:前端,指定接收客户端连接侦听套接字设置;
backend:后端,指定将连接请求转发至后端服务器的相关设置;
listen:同时拥有前端和后端,适用于一对一环境;
端口:
# Bamboo是配置文件之外的端口 frontend test.com #定义前端服务器(haproxy) bind *:80 #监听地址 listen admin_stat #status bind 0.0.0.0:8080 #监听端口 mode http #http的7层模式 stats refresh 30s #统计页面自动刷新时间 stats uri /haproxy_stats_url #统计页面URL
参考:https://www.cnblogs.com/kevingrace/p/6138150.html
https://www.open-open.com/lib/view/open1415511980137.html
yum安装与编译安装:
yum安装简单,但不知道安装路径在哪里。编译安装可指定安装路径。
ZooKeeper
ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用可以基于它实现同步服务,配置维护和命名服务等。
在此处主要用于Leader选举。
事务日志
数据快照
snapshot
server.A=B:C:D中的A是一个数字,表示这个是第几号服务器,B是这个服务器的IP地址,C第一个端口用来集群成员的信息交换,表示这个服务器与集群中的leader服务器交换信息的端口,D是在leader挂掉时专门用来进行选举leader所用的端口。
创建ServerID标识(这是三个节点机器唯一配置不一样的地方,三个节点的myid文件配置的ServerID不能重复,建议分别配置成1、2、3)。myid放在zoo.cfg配置中的dataDir目录下。myid中的数据是A的值(该A就是zoo.cfg文件中的server.A=B:C:D中的A)
echo "1" > /data/zookeeper-3.4.11/data/myid echo "2" > /data/zookeeper-3.4.11/data/myid echo "3" > /data/zookeeper-3.4.11/data/myid