linux————ansible
一、认识自动化运维
自动化运维: 将日常IT运维中大量的重复性工作,小到简单的日常检查、配置变更和软件安装,大到整个变更流程的组织调度,由过去的手工执行转为自动化操作,从而减少乃至消除运维中的延迟,实现“零延时”的IT运维。
自动化运维主要关注的方面
-
管理机与被管理机的连接(管理机如何将管理指令发送给被管理机)
-
服务器信息收集 (如果被管理的服务器有centos7.5外还有其它linux发行版,如suse,ubuntu等。当你要做的事情在不同OS上有所不同,你需要收集信息,并将其分开处理)
-
服务器分组(因为有些时候我要做的事情不是针对所有服务器,可能只针对某一个分组)
-
管理内容的主要分类
-
文件目录管理(包括文件的创建,删除,修改,查看状态,远程拷贝等)
-
用户和组管理
-
cron时间任务管理
-
yum源配置与通过yum管理软件包
-
服务管理
-
远程执行脚本
-
远程执行命令
常见的开源自动化运维工具
-
puppet
基于ruby语言,成熟稳定。适合于大型架构,相对于ansible和saltstack会复杂些。
-
saltstack
基于python语言。相对简单,大并发能力比ansible要好, 需要维护被管理端的服务。如果服务断开,连接就会出问题。
-
ansible
基于python语言。简单快捷,被管理端不需要启服务。直接走ssh协议,需要验证所以机器多的话速度会较慢。
二、ansible
ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
特点
部署简单
默认使用ssh进行管理,基于python里的==paramiko==模块开发
管理端和被管理端不需要启动服务
配置简单,功能强大,扩展性强
能过playbook(剧本)进行多个任务的编排
环境
关闭防火墙, selinux
时间同步
静态ip
修改主机名互相解析
vim /etc/hosts
192.168.100.3 hd1
192.168.100.4 hd2
192.168.100.5 hd3

免密ssh
管理机hd1 安装ansible
yum install -y epel-release
yum install -y ansible
将被管理机hd2,hd3 加入管理机组(单独加入时不会进行分组)
vim /etc/zasible/hosts
192.168.100.3
192.168.100.4
192.168.100.5

测试连接性
ansible -m ping master
ansible -m ping web
ansible -m ping all


一、服务器分组
ansible通过一个主机清单功能来实现服务器分组。
Ansible的默认主机清单配置文件为/etc/ansible/hosts.
[web] 组名
192.168.100.4 表示192.168.100.4客户端示例: 定义192.168.100.3这台服务器的别名为master
master ansible_ssh_host=192.168.100.3 ansible_ssh_port=22

没有做免密登录的服务器可以指定用户名与密码
master ansible_ssh_host=192.168.100.3 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456"
二、ansible模块
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
ansible支持的模块非常的多,我们并不需要把每个模块都记住,而只需要熟悉一些常见的模块,其它的模块在需要用到时再查询即可。
查看所有支持的模块
ansible-doc -l
ansible-doc ping


hostname模块
hostname模块用于修改主机名(注意: 它不能修改/etc/hosts文件)
将其中一远程机器主机名修改为agent1
ansible 192.168.100.4 -m hostname -a 'name=agent1‘

file模块
file模块用于对文件相关的操作(创建, 删除, 软硬链接等)
创建一个目录
ansible master -m file -a ’path=/test state=directory‘
创建一个文件
ansible master -m file -a 'path=/test/111 state=touch'
递归修改owner,group,mode
ansible web -m file -a 'path=/test recurse=yes owner=bin group=daemon mode=1777'
删除目录 absent 缺席的(连同目录里的所有文件)
ansible web -m file -a 'path=/test state=absent'
创建文件并指定owner,group,mode等
ansible web -m file -a 'path=/tmp111 state=touch owner=bin group=daemon mode=1777'
删除文件
ansible web -m file -a 'path=/tmp/111 state=absent'
创建软链接文件
ansible web -m file -a 'src=/etc/fstab path=/tmp/fstab state=link'
创建硬链接文件
ansible web -m file -a 'src=/etc/fstab path=/tmp/fstab2 state=hard'
stat模块
ansible master -m stat -a 'path=/etc/fstab'

copy模块
在master上准备一个文件,拷贝此文件到group1的所有机器上
echo master > /opt/222
ansible web -m copy -a 'src=/opt/222 dest=/tmp/333'
使用content参数直接往远程文件里写内容(会覆盖原内容)
ansible web -m copy -a 'content="hello \n world\n" dest=/tmp/333'
使用force参数控制是否强制覆盖
如果目标文件已经存在,则不覆盖
ansible web -m copy -a 'src=/opt/222 dest=/tmp/333 force=no'
如果目标文件已经存在,则会强制覆盖
ansible web -m copy -a 'src=/opt/222 dest=/tmp/333 force=yes'使用backup参数控制是否备份文件
backup=yes 表示如果拷贝的文件内容与原内容不一样,则会备份一份
web的机器上会将/tmp/333备份一份(备份文件命名加上时间),再远程拷贝新的文件为/tmp/333
ansible web -m copy -a 'src=/etc/fstab dest=/tmp/333 backup=yes owner=daemon group=daemon mode=1777'
fetch模块
fetch模块与copy模块类似,但作用相反。用于把远程机器的文件拷贝到本地。
在两台被管理机上分别创建一个同名文件(但内容不同)
echo agent1 > /tmp/1.txt
echo agent2 > /tmp/1.txt从master上fecth文件(因为group1里有2台机器,为了避免同名文件文件冲突,它使用了不同的目录)
ansible web -m fetch -a 'src=/tmp/1.txt dest=/tmp/'
fetch模块不能从远程拷贝目录到本地
user模块
user模块用于管理用户账号和用户属性。
创建aaa用户,默认为普通用户,创建家目录
ansible web -m user -a ‘name=aaa state=present’
创建bbb系统用户,并且登录shell环境为/sbin/nologin
ansible web -m user -a ‘name=bbb state=present system=yes shell="/sbin/nologin"’
创建ccc用户, 使用uid参数指定uid, 使用password参数传密码
echo 123456 | openssl passwd -1 -stdin
$1$xacDNgkf$/8SQj.hsQYsryXBSm97wC1ansible web -m user -a 'name=ccc uid=2000 state=present password="$1$xacDNgkf$/8SQj.hsQYsryXBSm97wC1"'
创建一个普通用户叫hadoop,并产生空密码 密钥对
ansible web -m user -a 'name=hadoop generate_ssh_key=yes'
删除aaa用户,但家目录默认没有删除
ansible web -m user -a 'name=aaa state=absent'
删除bbb用户,使用remove=yes参数让其删除用户的同时也删除家目录
ansible web -m user -a 'name=bbb state=absent remove=yes'
group模块
创建组
ansible web -m group -a 'name=groupa gid=3000 state=present'
删除组(如果有用户的gid为此组,则删除不了)
ansible web -m group -a 'name=groupa state=absent'
cron模块
cron模块用于管理周期性时间任务
创建一个cron任务,不指定user的话,默认就是root(因为我这里是用root操作的)。
如果minute,hour,day,month,week不指定的话,默认都为*ansible web -m cron -a 'name="test cron1" user=root job="touch /tmp/111" minute=*/2'
删除cron任务
ansible web -m cron -a 'name="test cron1" state=absent'
yum_repository模块
yum_repository模块用于配置yum仓库。
增加一个/etc/yum.repos.d/local.repo配置文件
ansible web -m yum_repository -a "name=local description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no"
删除/etc/yum.repos.d/local.repo配置文件
ansible web -m yum_repository -a "name=local state=absent"
yum模块
yum模块用于使用yum命令来实现软件包的安装与卸载。
使用yum安装一个软件(前提:group1的机器上的yum配置都已经OK)
使用yum安装vsftpd
ansible group1 -m yum -a 'name=vsftpd state=present'
使用yum卸载vsftpd
service模块
service模块用于控制服务的启动,关闭,开机自启动等。
启动httpd服务,并设为开机自动启动(自启可选用 yes/no true/false on/off)
ansible web -m service -a 'name=httpd state=started enabled=on'
关闭vsftpd服务,并设为开机不自动启动
ansible web -m service -a 'name=httpd state=stopped enabled=false'
scripts模块
script模块用于在远程机器上执行**本地**脚本。
在master上准备一个脚本
master# vim 1.sh
#!/bin/bash
mkdir /tmp/haha
touch /tmp/haha/{1..10}在web的远程机器里都执行master上的/tmp/1.sh脚本(此脚本不用给执行权限)
ansible web -m script -a '1.sh'
使用shell脚本实现在web的被管理机里的mariadb里创建一个abc库
vim 1.sh
#!/bin/bash
yum install mariadb-server -y &> /dev/null
systemctl start mariadb
systemctl enable mariadbmysql << EOF
create database abc;
quit
EOF
ansible web -m scripts -a ‘1.sh'’
commend与shell模块
两个模块都是用于执行linux命令的,这对于命令熟悉的工程师来说,用起来非常high。
shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)
ansible -m command web -a "useradd user2"
ansible -m command web -a "cat /etc/passwd |wc -l"
ansible -m shell web -a "cat /etc/passwd |wc -l"
shell模块并不是百分之百任何命令都可以,比如vim或ll别名就不可以
三、playbook
playbook(剧本): 是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。
使用的格式为yaml格式(saltstack,elk,docker,docker-compose,kubernetes等也都会用到yaml格式)
语法
hosts: 用于指定要执行任务的主机,其可以是一个或多个由冒号分割主机组
remote_user : 用于指定远程主机上的执行任务的用户
tasks : 任务列表,按顺序执行任务
handlers : 类似task,但需要使用notify进行通知调用
variables: 定义变量
ymal格式
以.yaml或.yml结尾
文件的第一行以 "---"开始,表明YMAL文件的开始(可选的)
以#号开头为注释
列表中的所有成员都开始于相同的缩进级别, 并且使用一个 `"- "` 作为开头(一个横杠和一个空格)
一个字典是由一个简单的 `键: 值` 的形式组成(这个冒号后面必须是一个空格)
注意: 写这种文件不要使用tab键,都使用空格
创建一个存放playbook的目录(路径自定义)
mkdir /etc/ansible/playbook
准备httpd配置文件,并修改成你想要的配置
yum install httpd -y
vim /etc/httpd/conf/httpd.conf
写一个playbook文件(后缀为.yml或.yaml)
# vim /etc/ansible/playbook/example.yaml
---- hosts: group1 remote_user: root
tasks:- name: ensure apache is at the latest version
yum: name=httpd,httpd-devel state=latest
- name: write the apache config file
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
执行写好的palybook
ansible-playbook /etc/ansible/playbook/example.yaml
四、roles(角色)
roles(角色): 就是通过分别将variables, tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。
假设我们要写一个playbook来安装管理lamp环境,那么这个playbook就会写很长。所以我们希望把这个很大的文件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使用的时候直接调用就可以了,以免重复写。就类似编程里的模块化的概念,以达到代码复用的效果。
roles目录结构
files:用来存放由copy模块或script模块调用的文件。
tasks:至少有一个main.yml文件,定义各tasks。
handlers:有一个main.yml文件,定义各handlers。
templates:用来存放jinjia2模板。
vars:有一个main.yml文件,定义变量。
meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。
通过roles实现LAMP
一、创建roles目录结构
cd /etc/ansible/roles/
mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml
yum install tree -y
tree /etc/ansible/roles/
二、准备httpd服务器的主页文件,php测试页和配置文件等
echo "test main page" > /etc/ansible/roles/httpd/files/index.html
echo -e "<?php\n\tphpinfo();\n?>" > /etc/ansible/roles/httpd/files/test.php
yum install httpd -y
vim /etc/httpd/conf/httpd.conf
cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/files/
三、编写httpd角色的main.yml文件
vim /etc/ansible/roles/http/task/main.yaml
---
- name: 安装httpd
yum: name=httpd,httpd-devel state=present- name: 同步httpd配置文件
copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.confnotify: restart httpd
- name: 同步主页文件
copy: src=/etc/ansible/roles/httpd/files/index.html dest=/var/www/html/index.html- name: 同步php测试页
copy: src=/etc/ansible/roles/httpd/files/index.php dest=/var/www/html/index.php- name: 启动httpd并开机自启动
service: name=httpd state=started enabled=yes
四、编写httpd角色里的handler
vim /etc/ansible/roles/httpd/handlers/main.yml
---
- name: restart httpd
service: name=httpd state=restarted
五、编写mysql角色的main.yml文件
vim /etc/ansible/roles/mysql/task/mail.yaml
---
- name: 安装mysql
yum: name=mariadb,mariadb-server,mariadb-devel state=present- name: 启动mysql并开机自启动
service: name=mariadb state=started enabled=yes
六、编写php角色的main.yml文件
vim /etc/ansible/roles/php/tasks/main.yml
---
- name: 安装php及依赖包
yum: name=php,php-gd,php-ldap,php-odbc,php-pear,php-xml,php-xmlrpc,php-mbstring,php-snmp,php-soap,curl,curl-devel,php-bcmath,php-mysql state=presentnotify: restart httpd
七、编写lamp的playbook文件调用前面定义好的三个角色
vim /etc/ansible/playbook/lamp.yaml
---
- hosts: group1
remote_user: root
roles:
- httpd
- mysql
- php
八、执行剧本
ansible-playbook /etc/ansible/playbook/lamp.yaml


相关文章:
linux————ansible
一、认识自动化运维 自动化运维: 将日常IT运维中大量的重复性工作,小到简单的日常检查、配置变更和软件安装,大到整个变更流程的组织调度,由过去的手工执行转为自动化操作,从而减少乃至消除运维中的延迟,实现“零延时”…...
初识Java 8-1 接口和抽象类
目录 抽象类和抽象方法 接口定义 默认方法 多重继承 接口中的静态方法 作为接口的Instrument 本笔记参考自: 《On Java 中文版》 接口和抽象类提供了一种更加结构化的方式分离接口和实现。 抽象类和抽象方法 抽象类,其介于普通类和接口之间。在构…...
微信小程序音频后台播放功能
微信小程序在手机息屏后依旧能播放音频,需要使用 wx.getBackgroundAudioManager() 方法创建后台音乐播放器,并将音乐播放任务交给这个后台播放器。 具体实现步骤如下: 小程序页面中,使用 wx.getBackgroundAudioManager() 方法创…...
NotePad——xml格式化插件xml tools在线安装+离线安装
在使用NotePad时,在某些情形下,需要格式化Xml格式内容,可以使用Xml Tools插件。 一、在线安装 1. 打开Notepad 软件 2. 选择插件,选择“插件管理” 3. 搜索 XML Tools,找到该插件后,勾选该文件ÿ…...
图书管理系统 数据结构先导课暨C语言大作业复习 | JorbanS
问题描述 读取给定的图书文件book.txt中的信息(book.txt中部分图书信息如下图所示),完成一个图书信息管理系统,该系统的各个功能模块要求利用菜单选项进行选择。 系统功能要求 图书浏览 读取book.txt中的文件信息并依次输出所…...
python 爬虫的开发环境配置
1、新建一个python项目 2、在控制台中分别安装下面三个包 pip install requests pip install beautifulsoup4 pip install selenium/ 如果安装时报以下错误: raise ReadTimeoutError(self._pool, None, "Read timed out.") pip._vendor.urllib3.exceptio…...
技术架构图是什么?和业务架构图的区别是什么?
技术架构图是什么? 技术架构图是一种图形化工具,用于呈现软件、系统或应用程序的技术层面设计和结构。它展示了系统的各种技术组件、模块、服务以及它们之间的关系和交互方式。技术架构图关注系统内部的技术实现细节,以及各个技术组件之…...
数据增强
一、数据增强 当你训练一个机器学习模型时,你实际做工作的是调参,以便将特定的输入(一副图像)映像到输出(标签)。我们优化的目标是使模型的损失最小化, 以正确的方式调节优化参数即可实现这一目…...
【Unity】2D 对话模块的实现
对话模块主要参考 【Unity教程】剧情对话系统 实现。 在这次模块的构建将基于 unity ui 组件 和 C#代码实现一个从excel 文件中按照相应规则读取数据并展示的逻辑。这套代码不仅能实现正常的对话,也实现了对话中可以通过选择不同选项达到不同效果的分支对话功能。 …...
laravel安装初步使用学习 composer安装
一、什么是laravel框架 Laravel框架可以开发各种不同类型的项目,内容管理系统(Content Management System,CMS)是一种比较典型的项目,常见的网站类型(如门户、新闻、博客、文章等)都可以利用CM…...
【VS插件】VS code上的Remote - SSH
【VS插件】VS code上的Remote - SSH 目录 【VS插件】VS code上的Remote - SSH获得Linux服务器或者Linux系统的IP地址下载插件远程登录注意如果Linux虚拟机系统无法连接成功可能是没有开启ssh服务优势 作者:爱写代码的刚子 时间:2023.9.12 前言࿱…...
TensorFlow 02(张量)
一、张量 张量Tensor 张量是一个多维数组。与NumPy ndarray对象类似,tf.Tensor对象也具有数据类型和形状。如下图所示: 此外,tf.Tensors可以保留在GPU中。TensorFlow提供了丰富的操作库 (tf.add,tf.matmul,tf.linalg.inv等),它们…...
513. 找树左下角的值
代码链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路: 万金油层次遍历,保存每一层的第一个元素返回就行了 我的代码: /*** Definition for a binary tree node.* struct TreeNode {* …...
量化:基于支持向量机的择时策略
文章目录 参考机器学习简介策略简介SVM简介整体流程收集数据准备数据建立模型训练模型测试模型调节参数 参考 Python机器学习算法与量化交易 利用机器学习模型,构建量化择时策略 机器学习简介 机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。…...
成功解决Selenium 中116版本的chromedriver找不到问题
Selenium 中的Google(谷歌浏览器)最新版本chromedriver 文章目录 Selenium 中的Google(谷歌浏览器)最新版本chromedriver1.当前作者的谷歌浏览器版本2.当前驱动官网的最新版本3.当不想降低浏览器版本继续使用谷歌浏览器的办法 1.当…...
PYQT常用组件--方法汇总
QTimeEdit timeEdit是Qt框架中的一个时间编辑器控件,它提供了以下常用方法: setTime(QTime time): 设置时间编辑器的时间为指定的QTime对象。time(): 返回时间编辑器的当前时间,返回一个QTime对象。setDateTime(QDateTime dateTime): 设置时…...
Linux系统编程(一):文件 I/O
参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 系统编程 1. UNIX 基础知识 1.1 UNIX 体系结构(下图所示) 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境,通常…...
OSM+three.js打造3D城市
对于我在 Howest 的研究项目,我决定构建一个 3D 版本的 Lucas Bebber 的“交互式讲故事的动画地图路径”项目。我将使用 OSM 中的矢量轮廓来挤出建筑物的形状并将它们添加到 3js 场景中,随后我将对其进行动画处理。 一、开发环境 为了使用 Node 和 npm 包,我选择使用 Vite…...
02JVM_垃圾回收GC
二、垃圾回收GC 在堆里面存放着java的所有对象实例,当对象为“死去”,也就是不再使用的对象,就会进行垃圾回收GC 1.如何判断对象可以回收 1.1引用计数器 介绍 在对象中添加一个引用计数器,当一个对象被其他变量引用时这个对象…...
ARM Linux DIY(八)USB 调试
前言 V3s 带有一个 USB 接口,将其设置为 HOST 或 OTG 模式,这样可以用来接入键盘、鼠标等 USB 外设。 USB 简介 USB 有两种设备:HOST 和 USB 功能设备。 在 USB2.0 中又引入了一个新的概念 OTG,即设备角色可以动态切换。 切换方…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
















使用content参数直接往远程文件里写内容(会覆盖原内容)





































shell模块并不是百分之百任何命令都可以,比如vim或ll别名就不可以







