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

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

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

使用 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…

GIT常见问题解决

git clone 出现 fatal: The remote end hung up unexpectedly(error: RPC failed; result=22, HTTP code = 422) 解决: 在项目的url后面加一个.git, 如: git clone https://git.xxx.com/project/installer-plugin 改为: git clone https://git.xxx.com/project/installer-plugin.git   Git 配置邮箱和用户名, 或增加安全目录时遇到 fatal: $HOME not set 的解决方案 把配置中的 global 换成 system 即可,如: git config –global user.email “you@example.com” git config –global user.name “Your Name” git Read more…

银河麒麟ansible执行取不到ansible_pkg_mgr变量的问题分析

问题现象: 在银河麒麟V10上执行ansible时, 遇到了一个报错问题: ansible_pkg_mgr变量没有定义, 遂写了一个test.yml测试一下:

  测试ansible_distribution为redhat, 而ansible_pkg_mgr的确是没有取出来 问题分析: 根据报错,很明确是因为ansible无法自动判断出系统使用的yum版本导致,我们知道当ansible中yum模块不指定use_backend参数时,将尝试自动判断,而ansible的setup模块可以获取对应的必要信息, 其中一个变量ansible_pkg_mgr及对应yum后端模块,接下来我们执行setup模块输出ansible_pkg_mgr变量来验证下我们的判断:

果然没有办法获取到ansible_pkg_mgr变量,先看下系统版本信息:

接下来根据报错提示信息找到ansible相关代码,在yum.py中,相关代码如下: ansible/plugins/action/yum.py

如代码所示,当执行yum未指定use_backend参数时,ansible会执行setup模块并根据ansible_pkg_mgr来自动判断yum的版本,获取不到则会报错,继续看下该参数的获取过程,找到pkg_mgr.py,关键代码如下: ansible/module_utils/facts/system/pkg_mgr.py

以上代码可以看到当判断系统为红帽系,则会继续判断系统版本信息,当主版本号<8则使用yum,否则使用dnf,这里我们初步判断为麒麟对系统做了某些修改导致无法获取到主版本号。先执行setup获取发行版代号验证下是否执行了上述逻辑:

通过setup模块的输出结果可看到系统是判断为redhat发行版,但是通过ansible_distribution_major_version获取到的发行版主版本号为V10, 而和上面判断yum版本的代码关联起来看就会发现问题所在,int(collected_facts[‘ansible_distribution_major_version’]) < 8 中,ansible_distribution_major_version 变量在其初始化的代码中对应为为distribution_version.split(‘.’)[:2][0]的取值,而当系统中获取到的值是V7Update6时,该显然无法满足转换为int的要求。接下来看下V10这个关键字的定义位置,根据经验系统版本相关信息是在/etc/os-release中, 这里可以看到VERSION_ID的值被定义为V10,而系统原生发行版中该值是7,我们来看下os-release中对VERSION_ID参数的说明:

根据man文档中的描述,VERSION_ID取值范围为全小写,通常为数值型,不应有空格或其他特殊字符,可包含的字符为0-9a-z._-,那么这里可以看到两个问题, 第一个问题是kylin的VERSION_ID不符合此描述,包含了大写字符,第二个问题是VERSION_ID可以包含a-z字母,但是通常是数值如17,11.04等。 但由于常见发行版都将此处处理为数值型,就导致ansible按照此约定俗成固化了其获取系统版本的方法,并试图将一个字符串转换为int,不能满足当VERSION_ID包含了字母的情况。 验证结论 通过以上判断看到VERSION_ID是导致该问题现象的关键,那么我们可以尝试修改一下该参数值,再执行setup看看是否可以正常工作: 手动将VERSION_ID从V10改为7,测一下: 改为10, 再测一下: 可以看到,修改os-release中VERSION_ID为纯数值后,setup就可以正常判断到系统版本,进而可以获取到正确的yum版本了。 通过以上可以看到操作系统中即便是一些不起眼的细枝末节,处理不当也可能引发”连锁反应”。  

wordpress网站上传的图片不显示的解决办法

从媒体库上传的图片, 在文章里看不到, 经过检查, 是因为所有上传到媒体库的图片的File URL地址都是http, 而网站的总地址是https, 所以需要更改所有图片地址为https正确的url 首先, 我的网站总地址写的是https://www.meaninglive.com, 想统一把www去掉, 首先在后台管理Settings里更改网站地址, 打开后, 发现更改选项是灰色的, 需要在服务器上把此限制去掉 打开网站根目录下的wp-config.php,  下面是之前最后加的内容

需要把上面内容注释掉, 然后再打开网站后台页面, 就可以更改网站地址了, 改成统一的https://meaninglive.com 其次, 安装Better Search Replace插件 当然也可以通过phpMyadmin或登录数据库进行修改, 但是这样会比较危险, 所以还是通过插件来改比较安装便捷 安装好插件后, 打开Tools–> Better Search Replace, Search for 填入http://www.meaninglive.com Replace with填入https://meaninglive.com Select tables选择wp_posts 将Run as dry run去掉, 点击Run Search/Replace   参考: https://webtrickz.com/wordpress-update-image-urls-to-https/

10分钟搞定让你困惑的 Jenkins 环境变量

前言 Jenkins, DevOps 技术栈的核心之一,CI/CD 离不开编写 Pipeline 脚本,上手 Jenkins ,简单查一下文档,你就应该不会被 agent,stages,step 这类关键词弄懵,也能很快构建出 pipeline 的骨架但是当向骨架中填充内容的时候,尤其如何利用环境变量(系统内置 | 自定义),多数人都会变得比较混乱,浪费很多时间,本文就帮助大家快速通关环境变量 准备 如果你想一边阅读本文,一边实践,但是没有 Jenkins 服务可用,又想快速尝试,可以应用 Docker 一个命令快速搭建 Jenkins 服务

2023年了,本地没有 Docker 说不过去了,过来瞧瞧 Docker 系列是否入得了你的法眼? 打开浏览器输入:localhost:8080 找到终端的临时密码登陆 安装推荐的依赖 创建新的 Pipeline 类型的 Item 点击左侧 Config,然后在页面底部 Pipeline 部分输入我们接下来写的脚本进行测试就好了 就是这么简单….. 认识 Jenkins 环境变量 Jenkins 环境变量就是通过 env 关键字暴露出来的全局变量,可以在 Jenkins 文件的任何位置使用 其实和你使用的编程语言中的全局变量没有实质差别 查看 Read more…

ansible 安装 kubespray – 优化安装速度

同样的配置(8c16G), ansible在x86_64机器上安装, 以前需要半个多小时, 优化后大概花费10分钟时间,在arm64架构上安装大概需要15分钟 首先优化ansible.cfg配置文件: 相比之前修改的地方: 测量任务执行速度:profile_tasks 插件 Ansible 官方提供了几个可用于计时的回调插件: (1).profile_tasks:该回调插件用于计时每个任务的执行时长 (2).profile_roles 插件用于计时每个 Role 的执行时长 (3).timer 插件用于计时每个 play 执行时长 要使用这些插件,需要在 ansible.cfg 配置文件中的 callback_whitelist 中加入各插件 使用 forks、serial、strategy 等指令可以改变 Ansible 的执行策略。 默认情况下 forks=5,这表明在某一时刻最多只有 5 个执行任务的工作进程 (还有一个主进程),也即最多只能挑选 5 个节点同时执行任务。 serail 是 play 级别的指令,用于指定几个节点作为一批去执行该 play,该 play 执行完后才让下一批节点执行该 play 中的任务。如果不指定 serial,则默认的行为等价于将所有节点当作一批。 strategy 指令用于指定节点执行任务时的策略,其侧重点在于节点而在于任务,默认情况下其策略为 linear,表示某个节点先执行完一个任务后等待其余所有节点都执行完该任务,才统一进入下一个任务。另一种策略是 free Read more…

调用webmin上传下载文件

需求: 构建的包需要上传到文件服务器上, 需要从文件服务器上进行下载 可以搭建一个webmin服务,既有UI界面, 又可以通过模拟调用接口进行上传下载操作 一 安装 通过yum安装:

也可以通过下载安装包安装,适用于国产操作系统,因为官方安装脚本不支持kylin等系统

配置:

  上传下载: