当前位置: 首页 > news >正文

Ansible自动化运维工具(三)

目录

Ansible 的脚本 --- playbook 剧本

​编辑2.vars模块实战实例

 3.指定远程主机sudo切换用户

4.when模块实战实例

5.with_items迭代模块实战实例 

 6.Templates 模块实战实例

(1)先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量

(2)修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

(3)编写 playbook

​编辑​编辑​编辑​编辑7.tags 模块模块实战实例

(2)分别去两台被管理主机上去查看文件创建情况

 ​编辑​编辑8.Roles 模块模块实战实例

(3)在一个 playbook 中使用 roles 的步骤:


Ansible 的脚本 --- playbook 剧本

playbooks 本身由以下各部分组成

(1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
(2)Variables:变量
(3)Templates:模板
(4)Handlers处理器,当changed状态条件满足时,(notify)触发执行的操作
(5)Roles:角色

示例:

编辑剧本前先安装httpd

#在ansible的机器上需要提前安装httpd服务,因为要将自己的https,conf文件复制到需要自动化控制安装的机器上
yum insta11 httpd -y
cd /etc/httpd/conf
cp httpd.conf /opt/

 

vim test1.yaml
---     #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play       #定义一个play的名称,可省略gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略hosts: webservers      #指定要执行任务的被管理主机组,如多个主机组用冒号分隔remote_user: root      #指定被管理主机上执行任务的用户tasks:                 #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行- name: test connection    #自定义任务名称ping:               #使用 module: [options] 格式来定义一个任务- name: disable selinuxcommand: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务- name: disable firewalldservice: name=firewalld state=stopped    #使用 module: options 格式来定义任务,option使用key=value格式- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    #这里需要一个事先准备好的/opt/httpd.conf文件notify: "restart httpd"    #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:     #handlers中定义的就是任务,此处handlers中的任务使用的是service模块- name: restart httpd    #notify和handlers中任务的名称必须一致service: name=httpd state=restarted
##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

运行playbook

ansible-playbook test1.yaml
//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook test1.yaml --syntax-check    #检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task       #检查tasks任务
ansible-playbook test1.yaml --list-hosts      #检查生效的主机
ansible-playbook test1.yaml --start-at-task='install httpd'     #指定从某个task开始运行

#192.168.198.12上查看httpd服务是否安装并且服务状态开启
systemctl status httpd

2.vars模块实战实例

定义、引用变量
建立一个变量组,在调用的时候直接调用
为何定义:方便,只需修改变量即可不用修改任务里的内容

vim test2.yaml- name: second playhosts: dbserversremote_user: rootvars:                 #定义变量- groupname: testgroup   #格式为 key: value- username: testusertasks:- name: create groupgroup: name={{groupname}} system=yes gid=308    #使用 {{key}} 引用变量的值- name: create useruser: name={{username}} uid=309 group={{groupname}} - name: copy filecopy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt    #在setup模块中可以获取facts变量信息

#检测文件配置
ansible-playbook test2.yaml  --syntax-check
#执行文件
ansible-playbook test2.yaml

ansible-playbook test2.yaml -e "username=testuser"     #在命令行里定义变量

#查看创建的用户、组信息
ansible dbservers -a 'id testuser'

 3.指定远程主机sudo切换用户

注:

webservers中要有zc用户,首先需要创建用户,切换到普通用户

[root@centos6 ~]# useradd zhong
[root@centos6 ~]# su zhong
[zhong@centos6 root]$ 

vim test3.yaml  #在主机那边创建文件- name: Sudohosts: webserversgather_facts: falsetasks:- name: zhongbecome: truebecome_method: sudobecome_user: root      #指定sudo用户为rootcommand: whoamiregister: result- name: zhongdebug:var: result.stdout

在打开一个终端即切换成功

4.when模块实战实例

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务

vim test4.yaml---
- hosts: allremote_user: roottasks:- name: test when  service: name=httpd state=stoppedwhen: ansible_default_ipv4.address == "192.168.158.26"      #when指令中的变量名不需要手动加上 {{}}
或 when: inventory_hostname == "<主机名>"
ansible-playbook test4.yaml

5.with_items迭代模块实战实例 

Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环

vim test5.yaml---
- name: play1hosts: webserversgather_facts: falsetasks:- name: create directoriesfile:path: "{{item}}"state: directorywith_items:          #等同于 loop:- /tmp/test1- /tmp/test2- name: add usersuser: name={{item.name}} state=present groups={{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root
或with_items:- {name:'test1', groups:'wheel'}- {name:'test2', groups:'root'}
#检测文件
ansible-playbook test5.yaml  --syntax-check
#执行
ansible-playbook test5.yaml

 6.Templates 模块实战实例

Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

(1)先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量

cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
vim /opt/httpd.conf.j2Listen {{http_port}}				#42行,修改
ServerName {{server_name}}			#95行,修改
DocumentRoot "{{root_dir}}"          #119行,修改

(2)修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

vim /etc/ansible/hosts       [webservers]
192.168.158.25 http_port=192.168.158.25:80 server_name=www.accp.com:80 root_dir=/etc/httpd/htdocs[dbservers]
192.168.158.26 http_port=192.168.158.26:80 server_name=www.benet.com:80 root_dir=/etc/httpd/htdocs

(3)编写 playbook

vim apache.yaml---
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpd packageyum: name={{package}} state=latest- name: install configure filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf     #使用template模板notify:- restart httpd- name: create root dirfile: path: /etc/httpd/htdocs state: directory- name: start httpd serverservice: name={{service}} enabled=true state=startedhandlers:- name: restart httpdservice: name={{service}} state=restarted
ansible-playbook apache.yaml

7.tags 模块模块实战实例

可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用–tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

(1)创建文件

vim webhosts.yaml- hosts: webserversremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- only     #可自定义- name: touch filefile: path=/opt/testhost state=touchtags:- always    #表示始终要运行的代码
ansible-playbook webhosts.yaml --tags="only"


vim dbhosts.yaml- hosts: dbserversremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- only- name: touch filefile: path=/opt/testhost state=touch

 

 

ansible-playbook dbhosts.yaml --tags="only"

(2)分别去两台被管理主机上去查看文件创建情况

 8.Roles 模块模块实战实例

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。


(1)roles 的目录结构:

yum install tree -y
cd /etc/ansible/
tree roles/
roles/

(2)roles 内各目录含义解释

目录解释
files用来存放由 copy 模块或 script 模块调用的文件。
templates用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。
tasks此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。
handlers此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
vars此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
defaults此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。
meta此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。

(3)在一个 playbook 中使用 roles 的步骤:

①创建以 roles 命名的目录

#yum装完默认就有
mkdir /etc/ansible/roles/ -p    

②创建全局变量目录(可选)

mkdir /etc/ansible/group_vars/ -p
#文件名自己定义,引用的时候注意
touch /etc/ansible/group_vars/all     

③在 roles 目录中分别创建以各角色名称命令的目录,如 httpd、mysql

mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql

④在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}

⑤在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名

touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml

⑥修改 site.yml 文件,针对不同主机去调用不同的角色、

vim /etc/ansible/site.yml- hosts: webserversremote_user: rootroles:- httpd
- hosts: dbserversremote_user: rootroles:- mysql

⑦运行 ansible-playbook

cd /etc/ansible
ansible-playbook site.yml

示例: 

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -ptouch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

 (4)编写httpd模块

写一个简单的tasks/main.yml

vim /etc/ansible/roles/httpd/tasks/main.yml
- name: install apacheyum: name={{pkg}} state=latest
- name: start apacheservice: enabled=true name={{svc}} state=started

 (5)定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中

vim /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
svc: httpd

①编写mysql模块

vim /etc/ansible/roles/mysql/tasks/main.yml- name: install mysqlyum: name={{pkg}} state=latest
- name: start mysqlservice: enabled=true name={{svc}} state=started

vim /etc/ansible/roles/mysql/vars/main.yml
pkg:- mariadb- mariadb-server
svc: mariadb

②编写php模块

vim /etc/ansible/roles/php/tasks/main.yml- name: install phpyum: name={{pkg}} state=latest
- name: start php-fpmservice: enabled=true name={{svc}} state=started

vim /etc/ansible/roles/php/vars/main.yml
pkg:- php- php-fpm
svc: php-fpm

③编写roles示例 

vim /etc/ansible/site.yml
- hosts: webserversremote_user: rootroles:- httpd- mysql- php

cd /etc/ansible
ansible-playbook site.yml

systemctl status httpd.service
systemctl status php-fpm.service
systemctl status mariadb.service

 

相关文章:

Ansible自动化运维工具(三)

目录 Ansible 的脚本 --- playbook 剧本 ​编辑2.vars模块实战实例 3.指定远程主机sudo切换用户 4.when模块实战实例 5.with_items迭代模块实战实例 6.Templates 模块实战实例 &#xff08;1&#xff09;先准备一个以 .j2 为后缀的 template 模板文件&#xff0c;设置引用…...

ChatGPT在创新和创业中的应用如何?

ChatGPT是一种基于大规模预训练的语言模型&#xff0c;它在创新和创业中有着广泛的应用。作为一种具备自然语言处理能力的模型&#xff0c;ChatGPT可以与用户进行对话&#xff0c;并提供相关的信息、建议和创意。以下是ChatGPT在创新和创业中的一些应用&#xff1a; 创意生成和…...

Log4j2 配置日志记录发送到 kafka 中

前言 log4j2 在 2.11.0 之后的版本&#xff0c;已经内置了 KafkaAppender 支持可以将打印的日志直接发送到 kafka 中&#xff0c;在这之前如果想要集中收集应用的日志&#xff0c;就需要自定义一个 Layout 来实现&#xff0c;相对来说还是比较麻烦的。 官网文档&#xff1a;L…...

Linux用户与组管理(03)(八)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、组管理 1、概述 2、用户信息查看 总结 前言 今天是学习用户与组管理的最后一节课&#xff0c;这节课主要是组管理的内容&#xff0c;希望能一起学习&#xff…...

Java自定义异常

Java标准库定义的常用异常包括&#xff1a; 当我们在代码中需要抛出异常时&#xff0c;尽量使用JDK已定义的异常类型。例如&#xff0c;参数检查不合法&#xff0c;应该抛出IllegalArgumentException&#xff1a; static void process1(int age) {if (age < 0) {throw new…...

vscode远程调试php

使用vscode远程调试php的方法 1.安装remote ssh插件 2.连接服务器 可以点击左下角的绿色按钮&#xff0c;或者ctrlshiftp打开命令框输入remote ssh应该也有。 3.在服务器端vscode安装php debug插件 4.安装xdebug xdebug是用来调试php的软件&#xff0c;原本和vscode没什么关…...

C语言:截断+整型提升练习

详情关于整型提升与截断见文章&#xff1a;《C语言&#xff1a;整型提升》 一、代码一 int main() { char a -1; signed char b -1; unsigned char c -1; printf("%d %d %d", a, b, c); return 0; } 求输出结果 解析如下代码&#xff1a; int mai…...

Kubernetes技术--k8s核心技术kubectl命令行工具

(1).概述 kubectl是Kubernetes集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。 (2).语法 Kubectl [command] [type] [name] [flags] 语法参数说明: command: 指定要对资源执行的操作,例如 create、get、describe 和 delet…...

Element浅尝辄止9:Popover 弹出框组件

Popover 的属性与 Tooltip 很类似&#xff0c;它们都是基于Vue-popper开发的&#xff0c;因此有重复属性 1.如何使用&#xff1f; /*trigger属性用于设置何时触发 Popover&#xff0c;支持四种触发方式&#xff1a; hover&#xff0c;click&#xff0c;focus 和 manual。 对于…...

程序开发:构建功能强大的应用的艺术

程序开发是在今天的数字化时代中扮演重要角色的一项技术。通过编写代码&#xff0c;开发人员能创造出无数不同的应用&#xff0c;从简单的计算器到复杂的社交平台。电子商务应用、在线教育平台、医疗记录系统等&#xff0c;都重视程序开发的重要性&#xff0c;通过这其中的交互…...

(七)k8s实战-高级调度

一、CronJob 定时任务 1、cron 表达式 # ┌───────────── 分钟 (0 - 59) # │ ┌───────────── 小时 (0 - 23) # │ │ ┌───────────── 月的某天 (1 - 31) # │ │ │ ┌───────────── 月份 (1 - 12) # │ │ │ │ ┌…...

HTTP/1.1协议中的八种请求

2023年8月29日&#xff0c;周二晚上 目录 概述八种请求GET请求POST请求PUT请求PATCH请求DELETE请求HEAD请求OPTIONS请求TRACE请求 概述八种请求 HTTP/1.1协议中定义了8种常用的请求方法,分别是:1. GET 用途:请求指定的页面信息,并返回实体主体。例子:获取一个网页、图片等静态…...

面试系列 - JVM内存模型和调优详解

目录 一、JVM内存模型 1. 程序计数器&#xff08;Program Counter Register&#xff09;&#xff1a; 2.Java虚拟机栈&#xff08;Java Virtual Machine Stacks&#xff09;&#xff1a; 3. 本地方法栈&#xff08;Native Method Stack&#xff09;&#xff1a; 5. 方法区…...

JavaScript -【第一周】

文章来源于网上收集和自己原创&#xff0c;若侵害到您的权利&#xff0c;请您及时联系并删除~~~ JavaScript 介绍 变量、常量、数据类型、运算符等基础概念 能够实现数据类型的转换&#xff0c;结合四则运算体会如何编程。 体会现实世界中的事物与计算机的关系理解什么是数据并…...

高性能缓存 Caffeine 原理及实战

Caffeine 是基于Java 8 开发的、提供了近乎最佳命中率的高性能本地缓存组件&#xff0c;Spring5 开始不再支持 Guava Cache&#xff0c;改为使用 Caffeine。 1 算法原理 对于 Java 进程内缓存我们可以通过 HashMap 来实现。不过&#xff0c;Java 进程内存是有限的&#xff0c;…...

【算法】leetcode 105 从前序与中序遍历序列构造二叉树

题目 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] Output: [3,9,20,null,null,15,7]示例 2: Input: pr…...

11 | Spark计算数据文件中每行数值的平均值

需求:计算数据文件中的数值的平均值 背景: 你有一个数据文件,其中包含一系列数值,每行一个数值,数值之间用逗号分隔。你想使用Apache Spark分布式计算框架来读取数据文件中的数值并计算它们的平均值。功能要求: 通过Spark配置和上下文初始化Spark应用程序。从数据文件中…...

AI与游戏创新:深度学习的起跑枪声

《AI与游戏创新&#xff1a;深度学习的起跑枪声》 目录 引言AIGC定义与重要性AI在游戏中的应用AI推动游戏创新的可能途径AIGC的挑战与解决方案结论&#xff1a;AI是游戏行业的下一站 引言 AI&#xff08;人工智能&#xff09;正在全球范围内改变各个行业&#xff0c;游戏行…...

【GUI开发】用python爬YouTube博主信息,并开发成exe软件

文章目录 一、背景介绍二、代码讲解2.1 爬虫2.2 tkinter界面2.3 存日志 三、软件演示视频四、说明 一、背景介绍 你好&#xff0c;我是马哥python说&#xff0c;一名10年程序猿。 最近我用python开发了一个GUI桌面软件&#xff0c;目的是爬取相关YouTube博主的各种信息&#…...

7.6 函数的递归调用

直接调用&#xff1a; ### 1. 直接递归调用 直接递归调用是指一个函数直接调用自己。例如&#xff0c;计算阶乘的函数&#xff0c;可以使用递归方法&#xff1a; int factorial(int n) {if (n < 1) {return 1;}return n * factorial(n - 1); } 在这个例子中&#xff0c;f…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

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 开发者设计的强大库&#xff…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...