linux系统----Ansible中的playbook简单应用

目录

Playbooks中tasks语法使用

1、file

创建文件:touch

创建目录:directory

2、lineinfile

修改文件某一行文本

3、replace

根据正则表达式替换文件内容(指定换字符串)

5、template/copy

模板作用类似于copy,可将文件分发到不同节点上,可以在模板文件中引入变量

 8、wait_for

等待某些操作完成以后再进行后续操作

9、when

条件判断,满足后再执行任务


环境准备:

        下载ansible

        配置两台web主机,一台ansible服务器

        ansible主机ip:192.168.158.150

        web1主机IP:192.168.158.158

        web2主机IP:192.168.158.161

        修改好配置文件

        关闭防火墙和安全上下文

[root@bogon ~]# hostnamectl set-hostname ansible
[root@bogon ~]# setenforce 0

ansible主机

创建playbook,编辑yml文件

[root@bogon ~]# mkdir playbook
[root@bogon ~]# cd playbook/
[root@bogon playbook]# vim test.yml

操作如下

Playbooks中tasks语法使用

1、file

操作文件,比如创建文件或目录、删除文件或目录、修改文件权限等

常用参数:

  • path:指定要操作的文件或目录

  • state:参数非常灵活,可以包含的值及含义如下

    • directory - 与path结合说明我们要操作的是一个目录

    • touch - 与path结合说明我们要操作的是一个文件

    • link - 创建软连接

    • hard - 创建硬链接

    • absent - 删除目标

  • src:当state设置为link或hard创建链接时,用于说明链接哪个文件,指定链接源

  • force:值为yes表示强制创建

  • owner:指定被操作文件的属主

  • group:指定被操作文件的属组

  • mode:指定被操作文件的权限

示例:

- name: 创建一个testfile文件file: path=/tmp/testfile state=touch
- name: 创建一个目录,并指定目录权限file: path=/tmp/data state=directory mode=0755
- name: 删除一个目录file: path=/tmp/data state=absent  
- name: recurse默认为no,指定为yes代表以递归方式指定文件权限file: dest=/user/bin mode=0755 recurse=yes

示例:

创建文件:touch

vim test.yml

 测试成功

[root@bogon playbook]# ansible-playbook -C test.yml 
PLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.161]
ok: [192.168.158.158]TASK [在/opt/目录下创建文件f1.txt文件] *******************************************
changed: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP ***********************************************************************
192.168.158.158            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

翻译:

执行结果汇总 ***********************************************************************
192.168.158.158            : 成功=2    已变更=1    不可达=0    失败=0    跳过=0    救援=0    忽略=0
各字段含义详解:
​ok=2​ (成功=2)
该主机上成功完成了2个任务(无论是否产生变更)
​changed=1​ (已变更=1)
其中有1个任务实际修改了系统状态(例如:创建了文件/安装了软件)
​unreachable=0​ (不可达=0)
主机连接正常(SSH/WinRM等连接成功)
​failed=0​ (失败=0)
没有任务执行失败
​skipped=0​ (跳过=0)
没有任务因条件不满足而被跳过
​rescued=0​ (救援=0)
没有触发任何错误恢复机制(block-rescue结构)
​ignored=0​ (忽略=0)
没有主动忽略任何错误

执行成功:

[root@bogon playbook]# ansible-playbook test.yml PLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.161]
ok: [192.168.158.158]TASK [在/opt/目录下创建文件f1.txt文件] *******************************************
changed: [192.168.158.158]
changed: [192.168.158.161]PLAY RECAP ***********************************************************************
192.168.158.158            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

查验:已成功创建

        web主机

[root@web1 ~]# cd /opt/
[root@web1 opt]# ls
f1.txt
创建目录:directory
[root@bogon playbook]# vim test.yml---
- name: addahosts: alltasks:- name: 在/opt/目录下创建文件f1.txt文件file:path: /opt/f1.txtstate: touch- name: 在/opt/目录下创建dir目录file:path: /opt/dir/state: directory

 测试:

[root@bogon playbook]# ansible-playbook -C test.yml PLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.161]
ok: [192.168.158.158]TASK [在/opt/目录下创建文件f1.txt文件] *******************************************
changed: [192.168.158.161]
changed: [192.168.158.158]TASK [在/opt/目录下创建dir目录] **************************************************
changed: [192.168.158.158]
changed: [192.168.158.161]PLAY RECAP ***********************************************************************
192.168.158.158            : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

执行

[root@bogon playbook]# ansible-playbook  test.yml PLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.161]
ok: [192.168.158.158]TASK [在/opt/目录下创建文件f1.txt文件] *******************************************
changed: [192.168.158.161]
changed: [192.168.158.158]TASK [在/opt/目录下创建dir目录] **************************************************
changed: [192.168.158.158]
changed: [192.168.158.161]PLAY RECAP ***********************************************************************
192.168.158.158            : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

 查验:

[root@web1 opt]# ls
dir  f1.txt

2、lineinfile

修改文件某一行文本

常用参数:

*   path:操作的文件路径
*   regexp:正则表达式,要替换的内容
*   line:指定修改后的文本内容
*   state:当设置为absent代表删除匹配的行
*   backrefs:默认为no,当未匹配到时line对应的内容会被插入到文本的末尾,为yes表示不插入
*   insertafter:借助insertafter参数可以将文本插入到“指定的行”之后
*   insertbefore:借助insertbefore参数可以将文本插入到“指定的行”之前
*   backup:是否进行备份
*   create:操作的文件不存在时是否创建

示例:

- name: 替换文件中包含line123的行为testlinelineinfile: path=/tmp/test regexp="^line" line="testline"

 vim  test.yml         (注意缩进)

---
- name: addagather_facts: nohosts: alltasks:- name: 在/opt/目录下创建文件f1.txt文件file:path: /opt/f1.txtstate: touch- name: 在/opt/目录下创建dir目录file:path: /opt/dir/state: directory- name: 精确替换包含line123的行lineinfile:path: /opt/f1.txtregexp: "^line"line: "test"tags: t1

[root@web1 opt]# cat f1.txt 
line1231
lineoqoweiqwe
opoiline

 

测试:     只在web1上f1.txt有内容

[root@ansible playbook]# ansible-playbook -C -t t1 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [精确替换包含line123的行] ***************************************************
changed: [192.168.158.158]
ok: [192.168.158.161]PLAY RECAP ***********************************************************************
192.168.158.158            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

 

执行成功

[root@ansible playbook]# ansible-playbook  -t t1 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [精确替换包含line123的行] ***************************************************
ok: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP ***********************************************************************
192.168.158.158            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

查验: 

        因为没有循环,一次只能执行一个

[root@web1 opt]# cat f1.txt 
line1231
test
opoiline
[root@web1 opt]# cat f1.txt 
test
test
opoiline

 第二次

 

  

3、replace

根据正则表达式替换文件内容(指定换字符串)

常用参数:

  • path:操作文件的路径

  • regexp:正则表达式

  • replace:指定最终要替换的字符串

  • backup:是否在修改文件之前对文件进行备份,yes是进行备份

 vim test.yml 

    - name: 将/opt/f1.txt文件中的test替换为linereplace:path: /opt/f1.txtregexp: "test"replace: linetags: t2

 测试:

[root@ansible playbook]# ansible-playbook -C -t t2 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [将/opt/f1.txt文件中的test替换为line] ***************************************
changed: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP ***********************************************************************
192.168.158.158            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

执行

[root@ansible playbook]# ansible-playbook -t t2 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.161]
ok: [192.168.158.158]TASK [将/opt/f1.txt文件中的test替换为line] ***************************************
changed: [192.168.158.158]
changed: [192.168.158.161]PLAY RECAP ***********************************************************************
192.168.158.158            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

查验

 

 

5、template/copy

模板作用类似于copy,可将文件分发到不同节点上,可以在模板文件中引入变量

常用参数:

  • src: 源文件路径

  • dest:目标文件路径

  • group:目标文件属组

  • mode:目标文件权限

  • backup:如果目标文件存在,则先备份目标文件

  • force:是否强制覆盖,默认为yes

  • validate:在复制之前通过命令验证目标文件,如果验证通过则复制

示例:

- template: src=/mytemplates/tt.j2 dest=/etc/file.conf
- template: src=/mytemplates/tt.j2 dest=/etc/file.conf group=wheel mode=0644
- template: src=/mytemplates/suzuka.j2 dest=/etc/suzuka validate='visudo -cf %s'

示例:

第一步:先从远程主机拷贝一份nginx配置文件

[root@ansible playbook]# scp 192.168.158.158:/etc/nginx/nginx.conf ./
nginx.conf                                      100% 2334     1.0MB/s   00:00   

第二步:编辑yml文件

 mag(输出文本)

vim  test.yml        

    - name: print facts variabledebug:msg: "The {{ ansible_default_ipv4.interface }} IPV4 address is {{ ansible_default_ipv4.address }}"

 第三步:执行

[root@ansible playbook]# ansible-playbook -t t3 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [print facts variable] ******************************************************
ok: [192.168.158.158] => {"msg": "The default IPV4 address is 192.168.158.158"
}
ok: [192.168.158.161] => {"msg": "The default IPV4 address is 192.168.158.161"
}PLAY RECAP ***********************************************************************
192.168.158.158            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

 我们可以将default改为变量

第四步:过滤之后拷贝到一个文件里

[root@ansible playbook]# ansible 192.168.158.158 -m setup | grep -n ansible_default_ipv4
57:        "ansible_default_ipv4": {

 

[root@ansible playbook]# ansible 192.168.158.158 -m setup > facts.txt

 interface是ens33

 第五步:将变量引用到文本里

    - name: print facts variabledebug:msg: "The {{ ansible_default_ipv4.interface }} IPV4 address is {{ ansible_default_ipv4.address }}"tags: t3- name: 拷贝nginx配置文件template: src=./nginx.j2 dest=/etc/nginx/nginx.conftags: t4

 执行看一下

        变量引用了

[root@ansible playbook]# ansible-playbook -t t3 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [print facts variable] ******************************************************
ok: [192.168.158.158] => {"msg": "The ens33 IPV4 address is 192.168.158.158"
}
ok: [192.168.158.161] => {"msg": "The ens33 IPV4 address is 192.168.158.161"
}PLAY RECAP ***********************************************************************
192.168.158.158            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

 将变量引用到nginx配置文件里

[root@ansible playbook]# ls
facts.txt  nginx.conf  test.yml
[root@ansible playbook]# vim nginx.conf ----------------------server {listen       {{ ansible_default_ipv4.address }}:80;listen       [::]:80;server_name  _;root         /usr/share/nginx/html;
-------------------------

 修改文件后缀

[root@ansible playbook]# mv nginx.conf nginx.j2
[root@ansible playbook]# ls
facts.txt  nginx.j2  test.yml

 执行成功

[root@ansible playbook]# ansible-playbook -t t4 test.ymlPLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [拷贝nginx配置文件] *********************************************************
changed: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP ***********************************************************************
192.168.158.158            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

去web主机上查验nginx配置文件

成功引用

 

 8、wait_for

等待某些操作完成以后再进行后续操作

**常用参数:**

*   connect\_timeout:在下一个任务执行之前等待连接的超时时间
*   delay:指在等待过程中轮询的时间间隔
*   host:等待的主机地址,默认是127.0.0.1
*   port:等待的主机端口
*   path:文件路径,只有当这个文件存在时才开始执行下一个任务
*   state:等待的状态,值可以为started/stoped/absent/present
*   timeout:等待的超时时间,默认300秒

**示例:**


- name: 每隔10s检查一次,等待8080端口正常监听,才开始下一个任务,直到超时
  wait_for: port=8080 state=started delay=10
- name: 等待文件创建
  wait_for: path=/tmp/tt
 

 示例

此时web两台主机都是启用nginx了的,此时80号端口已被监听

vim test.yml

    - name: 每隔10s检查一次,等待80端口正常监听,才开始下一个任务,直到超时wait_for: port=80 state=started delay=10- name: 如果上个任务为真执行下一个,创建文件file:path: /opt/1.txtstate: touch

 当80号端口被监听后,才执行下一个任务创建文件

 执行

[root@ansible playbook]# ansible-playbook test.yml PLAY [adda] **********************************************************************TASK [Gathering Facts] ***********************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [每隔10s检查一次,等待80端口正常监听,才开始下一个任务,直到超时] ***********
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [如果上个任务为真执行下一个,创建文件] ***************************************
changed: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP ***********************************************************************
192.168.158.158            : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

 查验:成功执行

9、when

条件判断,满足后再执行任务

示例: when是条件

- name: 判断变量tt是否定义shell: echo "I've got {{ tt }}"when: tt is defined

 当主机名是web1时,下载httpd软件包 (此时只有一台web1,另一台web2)

vim test.yml

    - name: outputdebug:msg: "{{ ansible_hostname }}"- name: 条件任务yum:name: httpdstate: present when: ansible_hostname == "web1"

 

执行成功

[root@ansible playbook]# ansible-playbook test.yml PLAY [adda] *************************************************************************************************TASK [Gathering Facts] **************************************************************************************
ok: [192.168.158.158]
ok: [192.168.158.161]TASK [output] ***********************************************************************************************
ok: [192.168.158.158] => {"msg": "web1"
}
ok: [192.168.158.161] => {"msg": "agent2"
}TASK [条件任务] *********************************************************************************************
skipping: [192.168.158.161]
changed: [192.168.158.158]PLAY RECAP **************************************************************************************************
192.168.158.158            : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.158.161            : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

 

 去web主机查验

hostname为web1的主机安装了httpd软件包

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917185.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bmcweb工作流程

在openbmc中,bmcweb是一个web服务程序,类似于lighttpd,提供web服务。本文将简单介绍这个服务进程的执行流程。 bmcweb的入口函数main(). main() -> run() run()先注册routes,最后调用app.run(). 第一个注册的route为crow::webassets:requestRoutes(). crow::webasse…

伞状Meta分析重构癌症幸存者照护指南:从矛盾证据到精准决策

还记得你第一次做出Meta分析时的成就感吗?那种从海量文献中抽丝剥茧,最终得出可靠结论的感觉,简直不要太爽!但是,时代在进步,科研在卷动,Meta分析也有它的"升级版"——伞状Meta分析&a…

IOMMU Client设备DMA配置过程分析(九)

1.设备树 cp0_pcie0是一个PCIe RC控制器,使用SMMU将PCIe设备的IOVA转换成物理地址,使用iommu-map-mask和iommu-map定义PCIe设备使用的Stream ID。设备树定义如下所示。 [arch/arm64/boot/dts/marvell/armada-ap80x.dtsi] smmu: iommu100000 {compatibl…

使用node-cron实现Node.js定时任务

1. 简介 node-cron 是一个轻量级的Node.js库,用于在指定时间或间隔执行任务。它是Unix系统cron工具的JavaScript实现,适用于需要定时执行脚本的场景(如数据备份、定期爬虫等)。 2. 安装 npm install node-cron # 或 yarn add node…

前缀和-525.连续数组-力扣(LeetCode)

一、题目解析1、只包含0、1的二进制数组2、找到含有相同数量的0和1,并返回其子数组长度二、算法原理解法1:暴力枚举 时间复杂度O(N^2)解法2:前缀和哈希表对于统计子数组中的0和1的数量有点困难,我们可以将其转化一下转化&#xff…

汽车电子控制系统开发的整体安全理念

1. 摘要在汽车制造商和一级供应商避免责任的背景下,公认的技术规则作为法律要求的标准具有重要的实际意义。道路车辆电子控制单元的安全性目前主要通过 ISO 26262 的要求和流程来保障。特别是随着道路交通自动化程度的不断提高以及现代车辆随之而来的复杂性&#xf…

IDEA重新安装常用设置

IDEA重新安装常用设置 展示固定导航栏 项目构建和运行操作委托给maven 参考:IDEA build委托到Maven build

微服务的编程测评系统9-竞赛新增-竞赛编辑

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言1. 竞赛新增1.1 竞赛基本信息增加-后端开发1.2 竞赛新增题目-后端1.3 竞赛基本信息-前端1.4 竞赛新增题目-前端2. 竞赛编辑2.1 竞赛详情-后端2.2 竞赛详情-前端2…

《零基础入门AI:线性回归进阶(梯度下降算法详解)》

在上一篇博客中,我们学习了线性回归的基本概念、损失函数(如MSE)以及最小二乘法。最小二乘法通过求解解析解(直接计算出最优参数)的方式得到线性回归模型,但它有一个明显的局限:当特征数量很多时…

基于C语言实现的KV存储引擎(一)

基于C语言实现的KV存储引擎项目简介整体架构网络模块的实现recatorproactorNtyco项目简介 本文主要是基于 C 语言来实现一个简单的 KV 存储架构,目的就是将网络模块跟实际开发结合起来。 首先我们知道对于数据的存储可以分为两种方式,一种是在内存中进…

c++和python联合编程示例

安装 C与 Python 绑定工具 pip install pybind11这其实相当于使用 python 安装了一个 c的库 pybind11,这个库只由头文件构成, 支持基础数据类型传递以及 python 的 numpy 和 c的 eigen 库之间的自动转换。 编写 CMakeList.txt cmake_minimum_required(VERSION 3.14)…

【OD机试题解法笔记】贪心歌手

题目描述 一个歌手准备从A城去B城参加演出。 按照合同,他必须在 T 天内赶到歌手途经 N 座城市歌手不能往回走每两座城市之间需要的天数都可以提前获知。歌手在每座城市都可以在路边卖唱赚钱。 经过调研,歌手提前获知了每座城市卖唱的收入预期&#xff1a…

AI: 告别过时信息, 用RAG和一份PDF 为LLM打造一个随需更新的“外脑”

嘿,各位技术同学!今天,我们来聊一个大家在使用大语言模型(LLM)时都会遇到的痛点:知识过时。 无论是像我一样,用 Gemini Pro 学习日新月异的以太坊,还是希望它能精确掌握某个特定工具…

深度学习(鱼书)day08--误差反向传播(后三节)

深度学习(鱼书)day08–误差反向传播(后三节)一、激活函数层的实现 这里,我们把构成神经网络的层实现为一个类。先来实现激活函数的ReLU层和Sigmoid层。ReLU层 激活函数ReLU(Rectified Linear Unit&#xff…

C# 中生成随机数的常用方法

1. 使用 Random 类(简单场景) 2. 使用 RandomNumberGenerator 类(安全场景) 3. 生成指定精度的随机小数 C# 中生成随机数的常用方法: 随机数类型实现方式示例代码特点与适用场景随机整数(无范围&#xf…

Flink 算子链设计和源代码实现

1、JobGraph (JobManager) JobGraph 生成时,通过 ChainingStrategy 连接算子,最终在 Task 中生成 ChainedDriver 链表。StreamingJobGraphGeneratorcreateJobGraph() 构建jobGrapch 包含 JobVertex setChaining() 构建算子链isCha…

对接八大应用渠道

背景最近公司想把游戏包上到各个渠道上,因此需要对接各种渠道,渠道如下,oppo、vivo、华为、小米、应用宝、taptap、荣耀、三星等应用渠道 主要就是对接登录、支付接口(后续不知道会不会有其他的)&#x…

学习:入门uniapp Vue3组合式API版本(17)

42.打包发行微信小程序的上线全流程 域名 配置 发行 绑定手机号 上传 提交后等待,上传 43.打包H5并发布上线到unicloud的前端页面托管 完善配置 unicloud 手机号实名信息不一致:请确保手机号的实名信息与开发者姓名、身份证号一致,请前往开…

SOLIDWORKS材料明细表设置,属于自己的BOM表模板

上一期我们了解了如何在SOLIDWORKS工程图中添加材料明细表?接下来,我们将进行对SOLIDWORKS材料明细表的设置、查看缩略图、模板保存的深度讲解。01 材料明细表设置菜单栏生成表格后左侧菜单栏会显示关于材料明细表的相关设置信息。我们先了解一下菜单栏设置详情&am…

全栈:Maven的作用是什么?本地仓库,私服还有中央仓库的区别?Maven和pom.xml配置文件的关系是什么?

Maven和pom.xml配置文件的关系是什么: Maven是一个构建工具和依赖管理工具,而pom.xml(Project Object Model)是Maven的核心配置文件。 SSM 框架的项目不一定是 Maven 项目,但推荐使用 Maven进行管理。 SSM 框架的项目可…