自动化运维管理工具 Ansible-----【inventory 主机清单和playbook剧本】

目录

一、inventory 主机清单

1.1inventory 中的变量

1.1.1主机变量

1.1.2组变量

1.1.3组嵌套

二、Ansible 的脚本 ------ playbook(剧本)

2.1 playbook介绍

2.2playbook格式

2.3playbooks 的组成

2.4playbook编写

2.5运行playbook

2.5.1ansible-playbook命令使用

​2.6playbook定义、引用变量

2.7指定远程主机sudo切换用户

2.8when条件判断

2.8.1调用command模块shutdown服务

2.8.2调用service模块关闭httpd服务

2.9迭代

2.9.1批量创建目录

2.9.2批量创建文件

2.9.3批量创建目录、批量创建多个用户,并加入指定的组


一、inventory 主机清单

Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内

如果是名称类似的主机,可以使用列表的方式表示各个主机
vim /etc/ansible/hosts
[webservers]
192.168.246.8:2222			#冒号后定义远程连接端口,默认是ssh的22端口
192.168.246.1[1:5]			#范围是:192.168.246.11到192.168.246.15

[dbservers]
db-[a:f].example.org		#支持匹配 a~f

1.1inventory 中的变量

Inventory变量名含义
ansible_hostansible连接节点时的IP地址
ansible_port连接对方的端口号,ssh连接时默认为22
ansible_user

连接对方主机时使用的主机名。

不指定时,将使用执行ansible或ansible-playbook命令的用户

ansible_passwd连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效
ansible_ssh_private_key_file指定密钥认证ssh连接时的私钥文件
ansible_ssh_common_args提供给ssh、sftp、 scp命令的额外参数
ansible_become允许进行权限提升
ansible_become_method指定提升权限的方式,例如可使用sudo/su/runas等方式
ansible_become_user提升为哪个用户的权限,默认提升为root
ansible_become_password提升为指定用户权限时的密码

1.1.1主机变量

写法1:
[webservers]
192.168.246.8 ansible_port=22 ansible_user=root ansible_password=abc123
192.168.246.10 ansible_port=22 ansible_user=root ansible_password=abc123
#webservers组中被控制端192.168.246.8的端口号为22登录时用户是root密码为abc123

写法2:
[webservers]
192.168.30.1[1:2] ansible_port=22 ansible_user=root ansible_password=abc123
#如果是名称类似的主机,可以使用列表的方式标识各个主机

#不建立将密码直接写入配置,不安全

写法3:
[webservers]
192.168.30.11:22
192.168.30.12:22
#默认ssh管理时的端口为22,若不是22则直接在被管理ip后加冒号和对应端口号

写法一:修改端口

写法二:

1.1.2组变量

[webservers:vars]     
ansible_user=root
ansible_password=abc123
#表示webservers 组内所有主机定义变量控制时使用root账户密码为abc123

[all:vars]       
ansible_port=22
#表示为所有组的所有主机定义变量使用ssh远程管理时都是22端口

修改被控制端口为1212

再去ansible主机检测

1.1.3组嵌套

[nginx]   #nginx组
192.168.246.8
192.168.246.9


[httpd]   #httpd组
192.168.246.11
192.168.246.12
#组内嵌为web

[web:children]
nginx
httpd
#表示web组的成员即children的直译‘孩子’包括nginx和httpd组

进行检测

二、Ansible 的脚本 ------ playbook(剧本)

2.1 playbook介绍

playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。

playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。

ansible通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules)来完成不同的功能的。不管是执行单条命令还是play-book都是基于清单文件。

Ansible Playbook(剧本)是Ansible 的核心组件之一,是一种以 YAML 格式编写的自动化任务描述文件。

  • 每个 Playbook 由一个或多个 Play 组成。
  • 在每个 Play 下面,通过 tasks 关键字来定义一组任务。
  • 每个任务由一个或多个模块组成,用于在远程主机上实现自动化部署、配置和管理等操作

2.2playbook格式

playbook由YMAL语言编写。YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。

一个剧本里面可以有多个play,每个play只能有一个tasks,每个tasks可以有多个name。

注意事项:

①大小写明个

②通过缩进表示层级关系

③不支持制表符tab键缩进,只能使用空格缩进

④缩进的空格数目不重要,只要相同层级左右对齐,通常开头缩进2个空格

⑤#号注释

⑥符号字符后缩进1个空格,如冒号:逗号,横杠-后面空一个格

⑦如果包含特殊字符用单引号和双引号引起来会作为字符串处理,单引号不识别变量,双引号识别变量。

2.3playbooks 的组成

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

2.4playbook编写

注意修改sshd的端口

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 selinux
     command: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式
     ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
   - name: disable firewalld
     service: name=firewalld state=stopped    #使用 module: options 格式来定义任务,option使用key=value格式
   - name: install httpd
     yum: name=httpd state=latest
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    #这里需要一个事先准备好的/opt/httpd.conf文件
     notify: "restart httpd"    #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
   - name: start httpd service
     service: enabled=true name=httpd state=started
  handlers:     #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
   - name: restart httpd    #notify和handlers中任务的名称必须一致
     service: name=httpd state=restarted
##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

---
- name: install httpd
  gather_facts: false
  hosts: web-z1
  remote_user: root
  tasks:
    - name: test ping
      ping:
    - name: disable firewalld
      service: name=firewalld state=stopped
    - name: install httpd
      yum: name=httpd state=latest
    - name: install configuration file for httpd
      copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify: "restart httpd"
    - name: start httpd service
      service: enabled=true name=httpd state=started
  handlers:
    - name: restart httpd
      service: name=httpd state=restarted

解释:

---
#ymal文件开头,可不写
- name: test
#定义play名称,可不写
  gather_facts: false
#设置不进行facts信息收集,这可以加快执行速度,可省略默认开启
  hosts: webservers
#要执行的组或者主机,webservers为组名需要在/etc/ansible/hosts中配置
  remote_user: root
#执行时所使用的用户
  tasks:
#定义任务列表,列表中任务按顺序执行
   - name: test ping
#自定义name的任务名称
     ping:
#第一个任务执行内容为使用ping模块ping,webservers组的主机
   - name: test selinux
     command: /sbin/setenforce 0
#第二个任务执行内容为使用command模块关闭selinux
     ignore_errors: false
#若出现错误,忽略继续运行下面的任务,默认为true出错立即停止playbooks
   - name: test stop firewalld
     service: name=firewalld state=stopped
#第三个任务执行内容为使用service模块关闭firewalld防火墙
   - name: test yum
     yum: name=httpd state=latest
#第四个任务执行内容为使用yum模块安装httpd服务状态为latest
   - name: test copy
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
#第五个任务为使用copy模块将ansible上的/etc/httpd.conf文件拷贝到指定组的主配置文件下替换,注意此处需要在ansible的/opt目录上有一个httpd.conf的模版否则会报错
     notify: "restart httpd"
#如果上面的copy任务成功,则调用handlers模块的restart httpd,注意要与下面handlers的name名称相同
   - name: test start httpd
     service: enabled=yes name=httpd state=started
#第六个任务执行内容为使用service模块启动httpd服务并设置开机自启
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted
#handlers模块,若notify成立则执行此模块内容调用service模块重启httpd服务。注意使用name名称调用

验证httpd服务是否开启

2.5运行playbook

运行playbook
ansible-playbook test1.yaml

补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户

ansible-playbook test1.yaml --syntax-check    #检查yaml文件的语法是否正确
ansible-playbook 文件.yaml --list-task       #检查tasks任务
ansible-playbook test1.yaml --list-hosts      #检查生效的主机
ansible-playbook test1.yaml --start-at-task='install httpd'     #指定从某个task开始运行

2.5.1ansible-playbook命令使用

ansible-playbook test.yaml --syntax-check

ansible-playbook test.yaml --list-task

ansible-playbook test.yaml --list-hosts

ansible-playbook test.yaml --start-at-task='install httpd'


2.6playbook定义、引用变量

---
- name: second play
  hosts: dbservers
  remote_user: root
  vars:                 #定义变量
   - groupname: mysql   #格式为 key: value
   - username: nginx
  tasks:
   - name: create group
     group: name={{groupname}} system=yes gid=306    #使用 {{key}} 引用变量的值
   - name: create user
     user: name={{username}} uid=306 group={{groupname}} 
   - name: copy file
     copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt    #在setup模块中可以获取facts变量信息


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

---
- name: second play
  hosts: web-z1
  remote_user: root
  vars:
#使用变量模块
    - groupname: testgroup
#定义变量groupname的值为testgroup
    - username: testuser
#定义变量username的值为testuser
 tasks:
    - name: create group
      group: name={{groupname}} gid=111
#第一个任务使用group模块调用定义的groupname变量创建组
   - name: create user
      user: name={{username}} uid=10086 group={{groupname}}
#第二个任务使用user模块调用定义的username变量创建用户指定uid和组

ansible-playbook  一种定义的任务方式,在编写 playbook 时可以使用变量来传数据
playbook引用变量指的是在playbook中使用变量代理静态常量值,来实现动态的配置过程 ,通过引用变量 ,可以使playbook更具有灵活性和可重复性
{{name}}来引用变量

2.7指定远程主机sudo切换用户

远端主机查看用户

ansible管理端主机操作

---
- hosts: 192.168.246.8
  remote_user: ky66    #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become: yes          #指定sudo用户为root
  become_user: root

执行playbook时:ansible-playbook test04.yml -K <密码>

[root@localhost ~]#vim /etc/sudoers
不仅在playbook文件中设置sudo提权  还需要在对应的主机上实现sudo提权
[root@localhost playbook]#ansible-playbook test04.yaml -k -K
-k 指定ssh的登录密码
-K 大写需要输入用户的登录密码

这个也要提权,不然就会报错哦

echo "ky66 ALL=(ALL) ALL" >> /etc/sudoers

2.8when条件判断

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

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

2.8.1调用command模块shutdown服务

---
- hosts: web-z1
  remote_user: root
  tasks:
    - name: shutdown host
      command: /sbin/shutdown -r now
      when: ansible_default_ipv4.address == "192.168.246.8"
       #when指令中的变量名不需要手动加上 {{}} 或者用它when: inventory_hostname == "<主机名>"

when用来进行条件判断的关键字 ,其作用只在你指定条件下会执行下面的任务,当条件为真时,任务就会被执行,否则任务将被跳过

2.8.2调用service模块关闭httpd服务

---
- hosts: web-z1
  remote_user: root
  tasks:
    - name: test when
      service: name=httpd state=stopped
      when: ansible_default_ipv4.address == "192.168.246.8"
  #当内置的变量ipv4.address等于192.168.246.8时调用service模块关闭httpd服务


2.9迭代

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

2.9.1批量创建目录

---
- name: play1
  hosts: web-z1
  gather_facts: false
  tasks:
    - name: create directories
      file:
        path: "{{item}}"
        state: directory
      with_items:
        - /mnt/nangjing
        - /mnt/hefei

2.9.2批量创建文件

---
- name: play1
  hosts: web-z1
  gather_facts: false
  tasks:
    - name: create file
      file:
        path: "{{item}}"
        state: touch
      with_items:
        - /mnt/a.txt
        - /mnt/b.txt

远程主机查看

2.9.3批量创建目录、批量创建多个用户,并加入指定的组

---
- name: play1
  hosts: web-z1
  gather_facts: false
  tasks:
    - name: create directories
      file:
        path: "{{item}}"
        state: directory
      with_items:          #等同于 loop:
        - /tmp/test1
        - /tmp/test2
    - name: add users
      user: name={{item.name}} state=present groups={{item.groups}}
      with_items:
        - name: test1
          groups: wheel
        - name: test2
          groups: root

远端主机查看

总结:

inventory主机清单管理
主机清单配置文件   /etc/ansible/hosts
 
格式:
[组名]
主机IP[:ssh端口]     #默认是 22 端口
主机名[:ssh端口]
主机IP[0:255]        #设置连续的主机列表范围
主机名[a:z]    ansible_port=     ansible_user=    ansible_password=           #设置主机变量
 
[组名:vars]             #设置组变量
ansible_port=
ansible_user=
ansible_password=
 
[大组名:children]       #设置嵌套组
组名1
组名2
组名3
 
 
playbook剧本
vim XXX.yaml  XXX.yml
---
- name:                 #设置play的名称
  hosts:                #指定执行此play的远程主机组
  remote_user:          #指定执行此play的用户
  #become:              #设置是否sudo切换
  #become_user:         #指定sudo切换的用户
  gather_facts:         #设置是否收集facts信息 yes|no|true|false
  vars:                 #设置自定义变量
  tasks:                #指定此play的任务列表
  - name:                  #定义任务的名称
    模块名: 模块参数       #定义任务要使用的模块和参数(键值对格式)
  - name:  
    模块名: 模块参数
    ignore_errors: true    #忽略此任务的失败
  - name:  
    模块名: 模块参数
    notify: '任务名'       #定义此任务执行结果为changed状态时要触发的handlers任务
  - name:  
    模块名: 模块参数
    when:                  #定义条件表达式(== != > >= < <=),条件成立时执行此task任务,否则不执行此任务
  - name:  
    模块名: 模块参数={{item}}
    with_items:            #定义循环列表
  - name:  
    模块名: 模块参数
    tags:                  #定义任务的标签,ansible-playbook --tags="标签" 可实现仅执行拥有指定标签的任务(拥有always标签的任务总是执行)
	- 标签1
	- 标签2
	....
	
  handlers:
  - name: 任务名
    模块名: 模块参数
 
 
ansible-playbook XXX.yaml -u -k -K  
                          --syntax-check
						  --list-task
						  --list-hosts
						  --start-at-task="任务名称"
						  --tags="标签"
 
 
tasks任务的模块语法格式:
纵向格式:
    模块名:
	  参数1: 值
      参数2: "{{变量名}}"
		....
横向格式:
    模块名: 参数1=值  参数2={{变量名}} ....
 
		
with_items 和 vars 的语法格式
纵向格式:
  - name:
    with_items:
    - 值1
    - 值2
    ....
    模块名: 参数={{item}}
 
  vars:
    变量名:
	- 值1
	- 值2
    ....
  tasks:
  - name:
    模块名: 参数={{item}}
    with_items: "{{变量名}}"
 
  #值为对象类型(键值对字段)时:
    with_items:
    - key1: 值1
      key2: 值2
    - key1: 值3
      key2: 值4
    ....
 
  vars:
    变量名:
    - key1: 值1
      key2: 值2
    - key1: 值3
      key2: 值4
    ....
	
横向格式:
  #值为纯量类型时:
    with_items: [值1, 值2, ....]
 
  vars:
    变量名: [值1, 值2, ....]
 
  #值为对象类型(键值对字段)时:
    with_items:
    - {key1: 值1, key2: 值2}
    - {key1: 值3, key2: 值4}
    ....
 
 
template配置模板模块
1)先准备一个 XXX.j2 配置模板文件,在模板文件中使用 {{变量名}} 格式引用主机变量、组变量、facts信息字段变量或vars字段自定义的变量的值
2)编辑 playbook 文件,在文件中的 tasks 任务中定义 template 模块配置(template: src=XXX.j2文件路径 dest=远程主机文件路径)
 
 
roles角色的作用?
可以把playbook剧本里的各个play看作为一个角色,将各个角色的tasks任务、vars变量、template模板和copy、script模块使用的相关文件等内容放置在指定角色的目录里统一管理,在需要的时候可在playbook中使用roles角色直接调用即可。也就是说roles角色可以在playbook中实现代码的复用。
 
roles/                         #角色总目录,其每个子目录就是一个角色目录
   nginx/                         #相当于playbook中的每一个play主题,目录名就是角色名
      files/                         #存放copy、script模块调用的文件
	  templates/                     #存放template模块调用的 XXX.j2 模板文件
	  tasks/main.yml                 #定义此角色的tasks普通任务列表
	  handlers/main.yml              #定义此角色通过notify触发时执行的handlers处理器任务列表
	  vars/main.yml                  #定义此角色用的自定义变量
	  defaults/main.yml              #定义此角色用的默认变量(一般不用)
	  meta/main.yml                  #定义此角色的元数据信息和依赖关系
   mysql/
     .... 
   php/
     ....
 
 
vim XXX.yaml
- name:
  hosts:
  remote_user:
  roles:
  - nginx
  - mysql
  - php
 
ansible-playbook XXX.yaml

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记:【QC】Android Q qmi扩展nvReadItem/nvWriteItem

一、qmi初始化 流程图 初始化流程: 1、主入口&#xff1a; vendor/qcom/proprietary/qcril-hal/qcrild/qcrild/rild.c int main(int argc, char **argv) { const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **); rilInit RIL_Init; funcs rilInit…

【Linux】Linux线程

一、Linux线程的概念 1.什么是线程 1.一个进程的一个执行线路叫做线程&#xff0c;线程的一个进程内部的控制序列。 2.一个进程至少有一个执行线程 3.线程在进程内部&#xff0c;本质是在进程地址空间内运行 4.操作系统将进程虚拟地址空间的资源分配给每个执行流&#xff0…

基于51单片机的闭环反馈直流电机PWM控制电机转速测量( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机的闭环反馈直流电机PWM控制转速测量( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0086 1. 主要功能&#xff1a; 基于51单片机的闭环…

js宏任务微任务输出解析

第一种情况 setTimeout(function () {console.log(setTimeout 1) //11 宏任务new Promise(function (resolve) {console.log(promise 1) //12 同步函数resolve()}).then(function () {console.log(promise then) //13 微任务})})async function async1() {console.log(async1 s…

语音识别--使用YAMNet识别环境音

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

2024.5.7

//头文件#ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QPushButton> #include <QLineEdit> #include <QLabel> #include <QTextToSpeech> #include <QString> #include <QtDebug> #include <QIcon> #i…

js浏览器请求,post请求中的参数形式和form-data提交数据时数据格式问题(2024-05-06)

浏览器几种常见的post请求方式 Content-Type 属性规定在发送到服务器之前应该如何对表单数据进行编码。 默认表单数据会编码为 "application/x-www-form-urlencoded" post请求的参数一般放在Body里。 Content-Type&#xff08;内容类型&#xff09;&#xff0c;一般…

截图工具Snipaste:不仅仅是截图,更是效率的提升

在数字时代&#xff0c;截图工具已成为我们日常工作和生活中不可或缺的一部分。无论是用于工作汇报、学习笔记&#xff0c;还是日常沟通&#xff0c;一款好用的截图工具都能大大提升我们的效率。今天&#xff0c;我要向大家推荐一款功能强大且易于使用的截图软件——Snipaste。…

CRC校验原理及步骤

文章目录 CRC定义&#xff1a;CRC校验原理&#xff1a;CRC校验步骤&#xff1a; CRC定义&#xff1a; CRC即循环冗余校验码&#xff0c;是数据通信领域中最常用的一种查错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&#…

JUC-synchronized练习-交替打印ABC

今天来练习一下synchronized 简单来利用synchronized实现一个字符串的交替打印 主要的实现设置一个全局的变量state&#xff0c;线程执行通过不断累加state&#xff0c;根据state对三取余的结果来判断该线程是否继续执行还是进入等待。并通过synchronized锁住一个共享变量loc…

设计模式之模板模式TemplatePattern(五)

一、模板模式介绍 模板方法模式&#xff08;Template Method Pattern&#xff09;&#xff0c;又叫模板模式&#xff08;Template Pattern&#xff09;&#xff0c; 在一个抽象类公开定义了执行它的方法的模板。它的子类可以更需要重写方法实现&#xff0c;但可以成为典型类中…

学习R语言第五天

文章目录 语法学习创建数据的方式绘制图形的方式图形添加颜色如何操作数据的方式数据进行验算的判断加付值的方式修改变量名称的方式判断是否存在缺失值在计算的方式忽略缺失值通过函数的方式忽略缺失值日期处理的方式字符串转化成日期的方式格式化数据框中数据返回当前的日期的…

保研面试408复习 1——操作系统、计网、计组

文章目录 1、操作系统一、操作系统的特点和功能二、中断和系统调用的区别 2、计算机组成原理一、冯诺依曼的三个要点二、MIPS&#xff08;每秒百万条指令&#xff09;三、CPU执行时间和CPI 3、计算机网络一、各个层常用协议二、网络协议实验——数据链路层a.网络速率表示b.数据…

《十八》QThread多线程组件

本章将重点介绍如何运用QThread组件实现多线程功能。 多线程技术在程序开发中尤为常用&#xff0c;Qt框架中提供了QThread库来实现多线程功能。当你需要使用QThread时&#xff0c;需包含QThread模块&#xff0c;以下是QThread类的一些主要成员函数和槽函数。 成员函数/槽函数 …

Linux内核之获取文件系统超级块:sget用法实例(六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件 <?php class Email { //---设置全局变量 var $mailTo ""; // 收件人 var $mailCC ""; // 抄送 var $mailBCC ""; // 秘密抄送 var $mailFrom ""; // 发件人 var $mailSubje…

如何查看慢查询

4.2 如何查看慢查询 知道了以上内容之后&#xff0c;那么咱们如何去查看慢查询日志列表呢&#xff1a; slowlog len&#xff1a;查询慢查询日志长度slowlog get [n]&#xff1a;读取n条慢查询日志slowlog reset&#xff1a;清空慢查询列表 5、服务器端优化-命令及安全配置 安…

6.Nginx

Nginx反向代理 将前端发送的动态请求有Nginx转发到后端服务器 那为何要多一步转发而不直接发送到后端呢&#xff1f; 反向代理的好处&#xff1a; 提高访问速度&#xff08;可以在nginx做缓存&#xff0c;如果请求的是同样的接口地址&#xff0c;这样就不用多次请求后端&#…

本地运行AI大模型简单示例

一、引言 大模型LLM英文全称是Large Language Model&#xff0c;是指包含超大规模参数&#xff08;通常在十亿个以上&#xff09;的神经网络模型。2022年11月底&#xff0c;人工智能对话聊天机器人ChatGPT一经推出&#xff0c;人们利用ChatGPT这样的大模型帮助解决很多事情&am…

AUTOSAR中EcuM、ComM和CanNm的关联

ComM的内外部唤醒 ComM可以通过NM保持网络的唤醒&#xff0c;同时也可以通过SM激活通信&#xff0c;总之就像一个通信的总管。 下面通过两种唤醒源来解释ComM的状态机。 1、内部唤醒 ① 当ComM上电初始化时会首先进入NO COMMUNICATION状态&#xff0c;在该状态下ComM会持续循…
最新文章