yq用法

yq介绍 在开始使用yq之前,我们首先需要安装它。当你在谷歌上搜索yq时,你会发现两个项目/存储库。 首先,在https://github.com/kislyuk/yq是jq(JSON处理器)的包装器。如果你已经熟悉jq,你可能想抓住这个,使用你已经知道的语法。 不过,在本文中,我们将使用https://github.com/mikefarah/yq 这个版本,这个版本没有100%匹配jq语法,但它的优点是它没有依赖性(不依赖于jq),有关差异的更多上下文,请参阅下面的GitHub问题。 https://github.com/mikefarah/yq/issues/193 mikefarah版本的yq的具体用法参见文档:https://mikefarah.gitbook.io/yq/ 工作实践 业务需求 由于公司产品需要部署在无网环境,所以需要制作适配各个组件的离线安装源,包括rpm/apt之类的系统相关软件包,以及各个二进制/压缩包之类的离线文件,原来是做法是统一将所有的离线源统一整合到一个yml文件当中去,现在的做法是将一个名为packages.yaml的文件放到各个组件的工程里,通过git下载然后进行聚合生成最后的全量列表。 聚合之前,通过生成一个config.yaml来进行选择哪些组件的聚合,下面是全量的配置:

通过流水线传参,生成以分号为分隔符的参数,来自定义生成config_custom.yaml:

解析: 由于yq的contains不支持多个匹配,所以在这里用到了test来测试是否包含以‘|’分隔的多个字符 del的用法: 用del删除之前,先要能查询打印出需要删除的部分,才能进一步使用del删除,如: 如果选择了只生成middleware和paas-installer, 则先查出不包含middleware和paas-installer的部分:

然后调用del删除:

  如果只选择了paas,nginx和redis,则需再次筛选, 只保留middleware大类下的小类,如’redis, nginx’:  

          osInfo=$(awk ‘BEGIN{split(“‘${os_names}’”, arr, “,”);for(key in arr) if(arr[key] ~ “ubuntu”) print arr[key]”:apt”;else print arr[key]”:yum”}’) 最后生成的格式如下:

需要再次通过yq来进行提取过滤: 提取不需要配repo的以及带arch=amd64/x86_64或不带key为arch的列表: Read more…

Linux自动探测网卡名称

Linux上需要自动探测通信的网卡名称,有时会有多网卡 方案一 通过ip命令提取默认路由,来找到默认通信的网卡 获取IP命令:

  获取网卡名称

  方案二 通过ansible_default_ipv4变量 获取IP:

获取网卡名称:

 

Linux使用safe-rm防止误删系统文件

前言 safe-rm 是一款用来替代不安全 rm 的开源软件,可以在 /etc/safe-rm.conf 文件中配置保护名单,定义哪些文件不能被 rm 删除,可用于防止执行 rm -rf 命令导致文件被误删的发生。 安装 safe-rm 工具 0.x版本的是通过shell脚本来实现的,而1.x版本则通过rust来实现的,需要现编译。 0.12版本下载安装:

创建 safe-rm 配置文件,添加保护名单

测试 save-rm 是否生效

  1.1.0版本下载安装: 1.x版本解决了软链接文件的问题,保护目录下的软链接文件也不会被删除。 官网地址是https://launchpad.net/safe-rm/trunk/1.1.0

 

centos7通过snap安装certbot免费获取并自动续期https证书

之前一直使用certbot-auto来获取https证书,后来更换了新域名, 重新生成证书时,报:“Your system is not supported by certbot-auto anymore.”, 查了一下是因为certbot-auto团队没有精力为所有操作系统进行维护,所以包括centos7在内的许多系统已不被支持,目前certbot不推荐在centos7上使用仓库安装,官方建议使用snap进行certbot的安装和更新。官方原文如下: While the Certbot team tries to keep the Certbot packages offered by various operating systems working in the most basic sense, due to distribution policies and/or the limited resources of distribution maintainers, Certbot OS packages often have problems that other Read more…

挂载nfs目录导致 df 命令卡死问题解决

问题: linux服务器挂载了一个含有海量文件的 nfs 目录,当使用 df命令时卡住了? 先确认下是不是这个 nfs 目录的原因,使用strace df -h跟踪一下是哪个系统调用有问题。遇到卡住的地方就会停住

nfsstat -m命令定位一下挂载的目录 结果发现, 服务器是挂载了一台不存在的nfs server导致的 处理: 先查看目录 mount -l 列出挂载的目录 强制卸载目录 umount -f -l 挂载的目录,如:umount -f  -l /data/nfs

mysql 备份和修改表

mysql 备份和修改表

 

使用 GitHub Actions 编译 kubernetes 组件

在使用 kubernetes 过程中由于某些需求往往要修改一下 k8s 官方的源码,然后重新编译才行。本文就以修改 kubeadm 生成证书为默认 100 年为例,来讲解如何使用 GitHub Actions 来编译和发布生成的二进制文件。 构建 clone repo 将 kubernetes 官方源码 fork 到自己的 repo 中

workflow .github/workflows/kubeadm.yaml

build/run.sh : Run a command in a build docker container. Common invocations: build/run.sh make: Build just linux binaries in the container. Pass options and Read more…

github的token使用方法

github的token使用方法 今天从本地向github push代码发,失败了。错误消息如下: remote: Support for password authentication was remove on August 123, 2021. Please use a personal access token instead. 原因是github不再使用密码方式验证身份,现在使用个人token。 本文记录, 如何生成token 在命令行下怎样使用token github如何生成token github的官方有给出如何生成个人token的文档。参考github官网生成token文档   命令行如何使用token 之前,github使用用户名和密码作为身份验证,现在使用用户名和token作为验证。 比如,github官网给出的示例。克隆一个仓库,提示输入用户名和密码,此处就可以使用上面生成的token作为密码使用。

但是有一个问题,我们总不能记住那么长的一串token吧 为了解决这个问题,github提供了gh工具,通过gh登录验证身份后,之后再不需要验证身份。 此处只演示ubuntu安装gh工具。

然后使用gh进行认证

如下图所示:使用键盘上下键选择对应项,回车键确认。 依次选择Github.com, HTTPS(如果使用的https协议), 选择使用网页浏览器认证或者粘贴token认证,二者选择一个即可。如果是ssh远程登录,命令行中无法打开远程的浏览器,那么只能选择token验证了。选择使用网页认证:先复制命令行中生成的一次性验证码,比如我这里本次是5C38-D954。然后回车,自动打开网页浏览器,输入一次性验证码,授权即可完成认证。如果上面选择使用token认证,那么输入你的token即可。 如果换了一台机器,那么重新生成一个新的token,然后gh auth login即可。

解决ansible mitogen 0.3.0+ 插件未渲染ansible_ssh_common_args模板变量问题

问题 使用ansible mitogen 0.3.4插件进行kubespray安装时,报错: EOF on stream; last 100 lines received:\nssh: Could not resolve hostname {%: Name or service not known 分析 经过debug分析,kubespray-default默认定义了如下变量模板:

但是通过ansible role去执行后,通过mitogen进行ssh并没有渲染出来变量:

可以看到,mitogen的ssh将ansible_ssh_common_args原封不动地输出来了 修改源码验证: 修改transport_config.py, 增加debug信息:

  下面是输出:

  可以看到ssh_common_args变量没有渲染 解决 将_task_vars.get(“vars”, {}) 改为 _task_vars.get(“hostvars”, {}), 从hostvars取值 搜索官方issures: https://github.com/mitogen-hq/mitogen/pull/956 commit ac34252bcccb60b50e6a8ed3a3b2f42d256d62e0 https://github.com/mitogen-hq/mitogen/pull/956/commits/ac34252bcccb60b50e6a8ed3a3b2f42d256d62e0 总结 Read more…

kubernetes使用本地磁盘进行动态管理pv

前言 使用本地磁盘作为pv kubernetes从1.10版本开始支持local volume(本地卷),workload(不仅是statefulsets类型)可以充分利用本地磁盘的优势,从而获取比remote volume(如nas, nfs, cephfs、RBD)更好的性能。 在local volume出现之前,statefulsets也可以利用本地磁盘,方法是配置hostPath,并通过nodeSelector或者nodeAffinity绑定到具体node上。但hostPath的问题是,管理员需要手动管理集群各个node的目录,不太方便。 以上无论是hostPath还是local volume都不支持动态扩容,并且程序移植改动比较大。 由于项目的需要,需要支持动态创建和扩容pv/pvc 本文参考了以下两个开源项目: https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner https://github.com/rancher/local-path-provisioner 经过测试: kubernetes-sigs版不支持动态扩容/动态供给dynamically provisioning,而且需要提前手动在node节点上创建并且mount对应的挂载点。 Rancher版本的local-path-provisioner支持动态创建挂载点,动态创建pv 下面两种方法都介绍一下安全和使用方式,最后推荐使用第三章介绍的local-path-provisioner来进行动态创建pv 第一章 使用sig-storage-local-static-provisioner 1.1 拉取官方源码进行安装

1.2创建storageclass

1.3挂载磁盘 其Provisioner本身其并不提供local volume,但它在各个节点上的provisioner会去动态的“发现”挂载点(discovery directory),当某node的provisioner在/mnt/fast-disks目录下发现有挂载点时,会创建PV,该PV的local.path就是挂载点,并设置nodeAffinity为该node。 可以用以下脚本通过mount bind方式创建和挂载磁盘

下面是在各个node节点用以上脚本创建挂载点: 执行该脚本后,等待一会,执行查询pv命令,就可以发现自动创建了 1.4测试pod是否可以运行

可以看到, 三个pod都正常运行起来了: 第二章 使用local-path-provisioner 2.1下载yaml文件

2.2 修改 其中有几处需要做修改 2.2.1 删除调试模式 删除–debug 2.2.2修改reclaimPolicy Read more…