运维利器升级:WezTerm集成AI插件,打造高效运维终端

运维利器升级:WezTerm集成AI插件,打造高效运维终端 随着大语言模型的飞速发展,开源模型在编码能力上已经逐步逼近GPT-4等顶尖模型,相关API调用的成本也在迅速下降。自动编程工具如雨后春笋般涌现,如cursor、vscode cline、aider等,就连nvim也有avante这样的开源插件支持自动编程。如今,写代码几乎变成了写需求。 然而,本文并非讨论如何用大模型写代码,而是为运维人员提供一个便捷的AI助手,帮助他们在工作过程中更高效地利用大模型,无需频繁复制粘贴或打开网页查询命令。 灵感来源与现状 受aider等工具的启发,我们思考:如果能在命令行直接与大模型交互,使用自然语言生成各种命令,是否能显著提高运维人员的工作效率?遗憾的是,已有公司如warp.dev实现了这一功能,但收费且访问速度受限。于是,我们找到了一个用Rust编写的开源命令行工具——AIChat。 AIChat简介 AIChat是一个功能强大的命令行工具,集成了多种大语言模型(LLM)功能,包括Shell助手、CMD和REPL模式、RAG(检索增强生成)、AI工具与代理等。它支持多平台,安装方便,一个二进制文件即可使用,并且可以与bash集成,通过自然语言生成各种命令。 通过在bashrc中嵌入以下命令,可以绑定快捷键实现自然语言转命令: _aichat_bash() { if [[ -n "$READLINE_LINE" ]]; then READLINE_LINE=$(aichat -e "$READLINE_LINE") READLINE_POINT=${#READLINE_LINE} fi } bind -x '"\ee": _aichat_bash' WezTerm集成AIChat 然而,运维人员经常需要在服务器上操作各种指令。难道要在所有服务器上都安装AIChat工具?显然,这样做太过繁琐。于是,我们引入了WezTerm这个跨平台终端,结合AIChat工具,实现在终端上的AI助理功能。 WezTerm简介: WezTerm是一个跨平台的终端工具,可以通过Lua进行各种配置,包括主题、快捷键、tmux配置等。接下来,我们将利用WezTerm的Lua脚本特性,将AIChat与WezTerm集成在一起,实现跨终端、跨服务器的AI助手功能。 安装与配置: 下载AIChat: 前往AIChat的GitHub页面下载适合你操作系统的AIChat版本。 配置AIChat: 启动AIChat命令行,配置大模型。例如,使用deepseek-chat,前往deepseek平台申请API密钥,并根据AIChat的向导生成相关配置。 # $HOME/.config/aichat/config.yaml model: deepseek clients: - type: openai-compatible name: deepseek api_base: https://api.deepseek.com api_key: sk-xxxxxxxxxxxxxxxxxxxxxxxxxx 安装WezTerm: 前往WezTerm官网查看详细的安装方法。 安装后,在本地目录创建WezTerm的配置文件$HOME/.config/wezterm/wezterm.lua。 配置WezTerm: local wezterm = require("wezterm") local launch_menu = {} if wezterm.target_triple == "x86_64-unknown-linux-gnu" then table.insert( launch_menu, { label = "ai-chat", args = { "aichat"} } ) end return { launch_menu = launch_menu, keys = { { key = 'z', mods = 'ALT', action = wezterm.action.ShowLauncher }, { key = "c", mods = "ALT", action = wezterm.action_callback(function(window, pane) local tab = pane:tab() local panes = tab:panes_with_info() if #panes == 1 then pane:split({ direction = "Right", size = 0.4, args = { 'aichat' } }) elseif not panes[1].is_zoomed then panes[1].pane:activate() tab:set_zoomed(true) elseif panes[1].is_zoomed then tab:set_zoomed(false) panes[2].pane:activate() end end), }, { key = "x", mods = "ALT", action = wezterm.action_callback(function(window, pane) local dims = pane:get_dimensions() local txt = pane:get_text_from_region(0, dims.scrollback_top, 0, dims.scrollback_rows) local last_line = txt:match("[^\r\n]+$") local selection = window:get_selection_text_for_pane(pane) selection = selection or last_line window:perform_action(wezterm.action.ClearSelection, pane) local success, stdout, stderr = wezterm.run_child_process({"aichat", "-e", selection}) if success then pane:paste(stdout) else wezterm.log_error("Error running bash command: " .. stderr) end end), }, }, font_size = 18.0, color_scheme = "Catppuccin Frappe", } 使用方法 打开WezTerm,通过快捷键ALT+c迅速调出AI对话窗口,可以直接与AI交互。 通过WezTerm的复制粘贴快捷键,可以快速将终端窗口中的文字粘贴到AIChat对话中进行交流。 通过快捷键ALT+x直接将命令行下的自然语言生成bash命令。 通过WezTerm与AIChat的集成,运维人员可以在终端中高效利用AI助手,提升工作效率。 ...

March 11, 2025 · Shan You

访问docker中服务的小技巧

在docker容器中的服务是通过docker命令将端口暴露给宿主机的用户使用。有时候出于安全考虑,容器没有暴露其中的一些服务。运维人员为了调试就得登录到容器中,一些精简的容器bash命令不全,管理起来很不方便。目前有两种方法访问容器网络中的服务。 通过nsenter访问容器网络 # 获取容器的pid pid=$(docker inspect -f '{{.State.Pid}}' ${container_id}) # 进入pid对应的namespace sudo nsenter --target $pid --uts --ipc --net --pid 这种方法可以直接在宿主机上暴露容器网络的命名空间,进而通过宿主机的一些命令行工具调试网络。 另外一种方法就是本文重点介绍的。 通过ip netns访问容器网路 这种操作的好处是可以通过类似socat的工具将容器网络中的服务暴露到宿主机网络中。具体操作如下: 首先要求管理员把容器的网络映射到/var/run/netns供ip命令使用。 ln -s /var/run/docker/netns /var/run/netns # 部分容器版本需要运行 1000 是运行docker的userid ln -s /run/user/1000/docker/netns var/run/netns 其次是通过socat与ip netns结合转发端口 # 通过以下命令找到netns id ns_id=$(docker inspect $container_name | grep SandboxKey | awk -F '/' '{print $NF}' | awk -F '"' '{print $1}') # 通过以下命令将宿主机监听的33060端口转发到容器的3306端口 sudo socat tcp-listen:33060,fork,reuseaddr \ exec:'ip netns exec $ns_id socat STDIO "tcp-connect:127.0.0.1:3306"',nofork 这样管理员就把一个容器中的服务暴露到宿主机上了。是不是很实用!

March 11, 2024 · Shan You