Anisble Playbook

文章目录

  • 一、Playbook简介
    • 三种常见的数据格式
    • Playbook特点
    • YAML语言介绍
  • 二、Playbook核心组件
    • host组件
    • remote_user组件
    • task列表和action组件
    • gather_facts
    • Handlers notify
    • ignore_errors
  • 三、playbook命令
    • playbook命令
    • tags 标签
  • 四、Playbook中的变量
    • setup模块中的变量
    • Playbook命令行中定义变量
    • 定义变量文件
    • 直接在playbook文件中建立变量
    • 使用独立的变量文件
    • 针对主机和主机组的变量
  • 四、template模版技术
    • Jinja2简介
    • template
    • template中使用流程控制for和 if
  • 五、循环迭代
    • 迭代with_items(loop)
    • 迭代嵌套子变量
    • playbook中使用when
  • 六、角色
    • 建立role


一、Playbook简介

在Ansible中,playbook就是一个包含了要在远程主机上执行的一系列任务的文件。通过playbook,可以实现自动化配置、部署和管理远程主机的操作。它可以定义任务的顺序、条件、并发执行等,是Ansible自动化工具中的核心组件之一。通过编写和执行playbook,可以实现系统管理的自动化和规范化。

三种常见的数据格式

  • XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置
  • JSON:JavaScript Object Notation, JavaScript 对象表记法,主要用来数据交换或配置,不支持注释
  • YAML:YAML Ain’t Markup Language YAML 不是一种标记语言, 主要用来配置,大小写敏感,不支持tab。
    注意:ansible使用的YAML语言。
    由于YAML语言不支持tab所以我们设置一些vim编辑器的选项
set ai 开启自动缩进
set ts=2 设置Tab键的宽度为2个空格

在这里插入图片描述

Playbook特点

在这里插入图片描述

  • playbook 剧本是由一个或多个"play"组成的列表。
  • play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作。
  • Playbook 文件是采用YAML语言编写的。

YAML语言介绍

YAML:YAML Ain’t Markup Language,即YAML不是标记语言。不过,在开发的这种语言时,YAML的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多最新的软件比较流行采用此格式的文件存放配置信息,如:ubuntu,anisble,docker,kubernetes等。

YAML官方网站:http://www.yaml.org

ansible 官网: https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html

YAML语言特性

  • YAML的可读性好
  • YAML和脚本语言的交互性好
  • YAML使用实现语言的数据类型
  • YAML有一个一致的信息模型
  • YAML易于实现
  • YAML可以基于流来处理
  • YAML表达能力强,扩展性好

YAML语法简介

  • 在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( … )用来表示文件的结尾
  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
  • 使用#号注释代码
  • 缩进必须是统一的,不能空格和tab混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
  • YAML文件内容是区别大小写的,key/value的值均需大小写敏感
  • 多个key/value可同行写也可换行写,同行使用,分隔
  • key后面冒号要加一个空格 比如: key: value
  • value可是个字符串,也可是另一个列表
  • YAML文件扩展名通常为yml或yaml

支持的数据类型

  • YAML 支持以下常用几种数据类型:
  • 标量:单个的、不可再分的值
  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

二、Playbook核心组件

一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:

  • Hosts 执行的远程主机列表
  • Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task。
  • Variables 内置变量或自定义变量在playbook中调用。
  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件。
  • Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行。
  • tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。

注意:查看模块用法 用ansible-doc 加上 模块名 可以查看模块的使用方法和例子
在这里插入图片描述

host组件

Hosts:playbook中每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,需要事先定义在主机清单中。
在这里插入图片描述
host文件的例子

Websrvs:dbsrvs	#或者,两个组的并集W
ebsrvs:&dbsrvs	#与,两个组的交集
webservers:!dbsrvs	#在websrvs组,但不在dbsrvs组
- hosts: websrvs:appsrvs

remote_user组件

remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。

- hosts: websrvs 
  remote_user: zhangsan                    
  
  tasks:
    - name: test connection 
      ping:
      remote_user: wang
      sudo: yes
      #默认sudo为root
      sudo_user:wang
      #sudo为wang

task列表和action组件

play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task。

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。

写yml时,一定要注意对齐!
set ai 开启自动缩进
set ts=2 设置Tab键的宽度为2个空格

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

gather_facts

作用:收集信息
表示不收集信息,但是使用变量是需要收集。
默认是收集信息的。

---
- hosts: web
  remote_user: root
  gather_facts: no
  
  tasks:
    -name: install httpd 
     yum: name=httpd
    -name: start httpd
     service: name=httpd state=started enabled=yes

Handlers notify

Handlers本质是task list ,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,主要用于当关注的资源发生变化时,才会采取一定的操作。而Notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

注意:

  • 如果多个task通知了相同的handlers, 此handlers仅会在所有tasks结束后运行一 次。
  • 只有notify对应的task发生改变了才会通知handlers,没有改变则不会触发handlers 。
  • handlers 是在所有前面的tasks都成功执行才会执行,如果前面任何一个task失败,会导致handler跳过执行,可以使用force_handlers: yes 强制执行handler。
---
 - hosts: web
   gather_facts: no

   tasks:
    - name: add group
      group: name=nginx state=present

    - name: add user
      user: name=nginx state=present group=nginx

    - name: install epel
      yum: name=epel-release.noarch state=present

    - name: install nginx
      yum: name=nginx state=present

    - name: config file
      copy: src=/data/nginx.conf dest=/etc/nginx
      notify:
        - restart nginx
   handlers:
    - name: restart nginx
      service: name=nginx state=restarted
~

当配置文件发生改动时,才会触发handlers,并重新启动nginx。注意notify和handlers是成对出现的。notify下面的名字和handlers的名字要一致。

在这里插入图片描述

ignore_errors

如果一个task出错,默认将不会继续执行后续的其他task。利用ignore_errors:yes可以忽略此task的错误,继续向下执行playbook其它的task。

playbook是默认顺序执行的,当一个出错之后,便不会执行下一个,所以对于那些不重要的命令,如果执行不成功,即可忽略。

---
- hosts: websrvs
  
 tasks:
   - name: error
     command: /bin/false
     ignore_errors: yes
   - name: continue
     command: wall continue

三、playbook命令

playbook命令

命令含义
–syntax-check语法检查,可缩写成–syntax, 相当于bash -n
-C --check模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run
–list-hosts列出tag
–list-tasks列出task
–limit只针对主机列表中的特定主机执行 --limit 主机地址
-i INVENTORY指定主机清单文件,通常一个项对应一个主机清单文件
–start-at-task START_AT_TASK从指定task开始执行,而非从头开始,START_AT_TASK为任务的name
-v -vv -vvv显示过程

tags 标签

在playbook文件中,可以利用tags组件,为特定 task 指定标签,当在执行playbook时,可以只执行特定tags的task,而非整个playbook文件。
tag就相当于标签。

vim httpd.yml
---
# tags example
- hosts: websrvs
  remote_user: root
  gather_facts: no
  
  tasks:
    - name: Install httpd
      yum: name=httpd state=present
    - name: Install configure file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/
      tags: conf
    - name: start httpd service
      tags: service
      service: name=httpd state=started enabled=yes
ansible-playbook –t conf,service httpd.yml

四、Playbook中的变量

变量名:仅仅能由字母、数字和下划线组成,且只能以字母开头。
变量调用方式:
通过{{ variable_name }} 调用变量,且变量名前后建议加空格,有时用"{{ variable_name }}"才生效。
变量来源:

  1. ansible 的 setup facts 远程主机的所有变量都可直接调用

  2. 通过命令行指定变量,优先级最高

setup模块中的变量

本模块自动在playbook调用,不要用ansible命令调用,生成的系统状态信息, 并存放在facts变量中。详情可以用ansible-doc setup查询。facts 包括的信息很多,如: 主机名,IP,CPU,内存,网卡等。

facts 变量的实际使用场景案例:

  • 通过facts变量获取被控端CPU的个数信息,从而生成不同的Nginx配置文件。
  • 通过facts变量获取被控端内存大小信息,从而生成不同的memcached的配置文件。
  • 通过facts变量获取被控端主机名称信息,从而生成不同的Zabbix配置文件。

利用setup 模块中的变量生成日志文件

---
- hosts:  web
  remote_user: root
  gather_facts: yes


  tasks:
    - name: create log file
      file: name=/data/{{ ansible_nodename }}.log state=touch owner=zhangsan mode=600

Playbook命令行中定义变量

"{ { 变量名 } } "
使用ansible-playbook -e 选项,在使用命令时定义变量。
在这里插入图片描述

- hosts: web
  gather_facts: no


  tasks:
    - name: create  user
      user: name={{ myname }}   system=yes  create_home=no
      ansible-playbook   -e  myname=cxk  -e myname1=wyf  playbook

定义变量文件

在这里插入图片描述
在这里插入图片描述

- hosts: web
  gather_facts: no
  
  tasks:
    - name: install  {{pkname1}}
      yum:  name={{pkname1}}  state=present
    - name: install {{pkname2}}
      yum: name={{pkname2}}  state=present
 ansible-playbook -e "@var"  test1.yml 
#  @代表文件    var 即是文件名   

注意:
1.var文件要在同一文件夹中
2.定义变量时

tasks:
 - name: install  "{{pkname1}}"
或者
tasks:
 - name: "install  {{pkname1}}"

直接在playbook文件中建立变量

方法是:使用vars组件。

---
- hosts: web
  vars:
    username: test1
    groupname: group1


  tasks:
    - name: create group
      group: name={{ groupname }}  state=present
    - name: create user
      user: name={{ username }} state=present

变量之间相互调用

---
- hosts: webs
 vars: 
   suffix: "txt"
   file: "{{ ansible_nodename }}.{{suffix}}"
  
 tasks:
    - name: test var
     file: path="/data/{{file}}" state=touch

使用独立的变量文件

可以在一个独立的playbook文件中定义变量,在另一个playbook文件中引用变量文件中的变量,比playbook中定义的变量优化级高。

先写一个变量文件

vim vars.yml
---
# variables file
package_name: mariadb-server
service_name: mariadb

然后调用这个文件

vim var5.yml
---
#install package and start service
- hosts: dbsrvs
   remote_user: root
   vars_files:
    - vars.yml
    
tasks:
    - name: install package
      yum: name={{ package_name }}
      tags: install
    - name: start service
      service: name={{ service_name }} state=started enabled=yes

针对主机和主机组的变量

在inventory主机清单文件中指定的主机定义变量以便于在playbook中使用。

在hosts文件中修改,并且只针对单个主机。

[websrvs]
www1.cxk.com http_port=80   maxRequestsPerChild=808
www2.cxk.com http_port=8080 maxRequestsPerChild=909
#只是针对单个主机

例子:

vim /etc/ansible/hosts   
[web]
192.168.232.20  hname=www1  domain=accp.com
192.168.232.30  hname=www2  domain=cxk.com

[web:vars]
mark='-'
 ansible web -m hostname  -a 'name={{ hname }}{{ mark }}{{ domain }}' 

在这里插入图片描述
这些变量只针对单个主机有效。

四、template模版技术

Ansible模板技术是Ansible自动化工具中的一个重要特性,它使用Jinja2模板引擎来生成动态配置文件。

Jinja2简介

Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全:

特性:

  • 沙箱中执行
  • 强大的 HTML 自动转义系统保护系统免受 XSS
  • 模板继承
  • 及时编译最优的 python 代码
  • 可选提前编译模板的时间
  • 易于调试。异常的行数直接指向模板中的对应行。
  • 可配置的语法
http://docs.jinkan.org/docs/jinja2/
https://www.w3cschool.cn/yshfid/
官方中文文档

template

template功能:可以根据和参考模块文件,动态生成相类似的配置文件 template文件必须存放于templates目录下,且命名为 .j2 结尾 yaml/yml 文件需和templates目录平级。

是这样一个目录:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
但是用template模块式,它会用模版生成的内容完全替换目标文件。 请特别注意。

template中使用流程控制for和 if

for循环
例子生成虚拟主机。

准备j2文件,注意for循环有其固定的写法。

vim templates/for1.j2 
#  准备  j2 文件

{% for vhost in nginx_vhosts %}
server {
   listen {{ vhost }}
}
{% endfor %}

这边定义了一个变量vhost。

准备yml文件

---
- hosts: web
  vars:
    nginx_vhosts:
      - 81
      - 82
      - 83
  tasks:
    - name: template config
      template: src=for1.j2    dest=/data/test.conf

这样即可完成。

五、循环迭代

需要执行重复性的任务时,需要用迭代机制。

迭代with_items(loop)

对迭代项的引用,固定内置变量名为"item";要在task中使用with_items给定要迭代的元素列表;注意: ansible2.5版本后,可以用loop代替with_items。

---
- hosts: web
  gather_facts: no

  tasks:
    - name: create user
      user: name={{ item }}  state=present groups=wheel
      with_items:
        - testuser1
        - testuser2
        - testuser3
**注意= 号后不要空格**
        
        
 上面语句的功能等同于下面的语句
    - name: add several users  
      user: name=testuser1 state=present groups=wheel
    - name: add several users
      user: name=testuser2 state=present groups=wheel
    - name: add several users
      user: name=testuser3 state=present groups=wheel

迭代嵌套子变量

在迭代中,可以嵌套自变量,用来提高工作效率。
例子:
批量建立用户

---
- hosts: web
  gather_facts: no



  tasks:
    - name: create group
      group: name={{ item }} state=present
      with_items:
        - nginx
        - mysql
        - tomcat
    - name: create user
      user: name={{ item.user }} group={{ item.group }} uid={{ item.uid }} state=present
      with_items:
        - { user: 'nginx', group: 'nginx' , uid: '80' }
        - { user: 'mysql', group: 'mysql' , uid: '3306' }
        - { user: 'tomcat', group: 'tomcat' , uid: '8080' }

playbook中使用when

when语句可以实现条件测试。如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过在task后添加when子句即可使用条件测试,jinja2的语法格式。

---
- hosts: web

  tasks:
    - name: install sl "{{ ansible_os_family }}"
      yum:  name=sl
      when: ansible_os_family == "RedHat"
    - name: install   sl   "{{ ansible_os_family }}"
      apt: name=sl
      when: ansible_os_family == "Debian"

#ansible_os_family

根据不同的系统,使用不同的安装命令。

六、角色

角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。 角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。

运维复杂的场景:建议使用 roles,代码复用度高。

https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html
官方文档

在此文件夹中
在这里插入图片描述

role目录结构

roles/
  project1/
    tasks/
    files/
    vars/       
    templates/
    handlers/
    default/    
    meta/       
  project2/
    tasks/
    files/
    vars/       
    templates/
    handlers/
    default/    
    meta/

Role各目录作用

  1. roles/project/ :项目名称,有以下子目录。
  2. files/ :存放由copy或script模块等调用的文件。
  3. templates/:template模块查找所需要模板文件的目录
  4. tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含。
  5. handlers/:至少应该包含一个名为main.yml的文件;此目录下的其它的文件需要在此文件中通过include进行包含。
  6. vars/:定义变量,至少应该包含一个名为main.yml的文件;此目录下的其它的变量文件需要在此文件中通过include进行包含。
  7. meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含。
  8. default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低。

建立role

  1. 创建role的目录结构.在以roles命名的目录下分别创建以各角色名称命名的目录,如mysql等,在每个角色命名的目录中分别创建相关的目录和文件,比如tasks、files、handlers、templates和vars等目录;用不到的目录可以创建为空目录,也可以不创建。
  2. 编写和准备role的功能文件。
  3. 编写playbook文件调用需要的角色应用于指定的主机

创建相应的文件夹。
在这里插入图片描述
建立各个文件,其中main文件中规定了所有文件执行的顺序。
在这里插入图片描述
在这里插入图片描述
注意:使用role需要再其同级别的目录建立yml文件。
在这里插入图片描述

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

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

相关文章

2024年建筑八大员(资料员)考试题库,省心高效,轻松通过!

1.插入的图片无法显示,或者显示失真,正确做法是()。 A.插人图片是应选中【自动调整图片大小】 B.在下拉【菜单】中选中【按单元格式大小】插入 C.在【格式】下拉中【图片】处打钩 D.在【属性】下拉中选中【工具显示】 答案&a…

Prestashop跨境电商独立站,外贸B2C网站完整教程

Prestashop是一款来自法国专业的开源电商CMS(内容管理系统)平台,和wordpress一样比较轻量,适合中小网站。Prestashop跨境电商独立站在国内并不是很流行,不过国外是非常火的,从各大平台的Prestashop主题数量就可以看得出来。 最有…

深度解析观测云智能监控的核心设计原理

背景 在监控高度分布式的应用程序时,可能依赖于多个基于云的和本地环境中的数百个服务和基础设施组件,在识别错误、检测高延迟的原因和确定问题的根因都是比较有挑战性的。即使已经具备了强大的监控和警报系统,但是基础设施和应用程序也可能…

学校选用SOLIDWORKS教育版进行授课的理由

在当代的工程与技术教育领域,计算机辅助设计软件(CAD)已经变成了一个不可缺少的教学辅助工具。SOLIDWORKS作为一个功能齐全且用户友好的CAD软件,其教育版本在学校教学环境中受到了广泛的欢迎。本文将对学校教学中选用SOLIDWORKS版…

OCR训练和C#部署英文字符训练

PaddleOCR是一个基于飞桨开发的OCR(Optical Character Recognition,光学字符识别)系统。其技术体系包括文字检测、文字识别、文本方向检测和图像处理等模块。以下是其优点: 高精度:PaddleOCR采用深度学习算法进行训练…

台式电脑没有音响?你还可以用这 7 个软件把手机变成音响

台式电脑没有音响?你还可以用这 7 个软件把手机变成音响 怎么让手机当电脑音响 怎么让电脑连接手机的麦克风 手机怎么变电脑麦克风 1.AudioRelay 官网audiorelay加点net提供 Windows 和 Android 应用程序下载 再打开作为 Client 的 Android 端,它会自…

大型企业组网如何规划网络

大型企业组网是一个复杂的过程,它需要细致的规划和设计,以确保网络能够满足企业的业务需求,同时保证性能、安全性和可扩展性。以下是规划大型企业网络的一些关键步骤和考虑因素: 1. 需求分析 业务需求:与各个业务部门…

如何进行员工 OKR 反馈?

目标和关键结果框架是一种协作性的目标设定方法,帮助团队设定理想的目标(目标),并有具体的、可衡量的行动项目,称为关键结果。实施 OKR 为一个富有成效的、以目标为导向的环境奠定了基础,从而消除了提供反馈…

电脑开机就一直在开机界面转圈,怎么回事?

前言 前段时间小白去给一位朋友修电脑。她说这个电脑很奇怪,有时候开机很快就进入电脑界面,但有时候开机一直在那转圈,半天也不见进入。 Windows7系统的小伙伴应该也有遇到过类似的问题,就是电脑一直在Windows的logo界面&#xf…

Halcon 重叠区域 显示汉字 图像分割

一 如何填充区域之间的GAP或分割重叠区域 read_image(Image,fabrik)*区域生长法将图像分割成相同强度的区域,并将其划分成大小为行*列的矩形。 为了确定两个相邻的矩形是否属于相同的区域, *仅使用其中心点的灰度值。 如果灰度值差小于等于公差&#xff…

Java使用Graphics2D画图,画圆,矩形,透明度等实现

背景 如上图,需要使用Java生成一个图片, 并以base64编码的形式返回给前端展示。 使用Graphics2D类,来进行画图,其中需要画方框、原型、插入图标、写入文字等,同时需要设置透明度等细节点 环境:Jdk17&#…

NAS—网络附加存储

关键词:私有化存储、Nas、云盘、群晖、Tailscale、 前言 身处于互联网时代的我们,几乎每时每刻都在与计算机打交道,而软件则作为我们和计算机之间沟通的桥梁,因此可以认为软件的作用是:将计算机能力进行包装&#xf…

期货散户应该如何有效的管理仓位呢?

期货散户应该如何有效的管理仓位呢?首先,他们要意识到自己所做的决定是很重要的。其次,还要注意自己的风险承受能力。最后,要做好风险管理,以便避免出现任何问题。 1:散户如何管理仓位 散户在进行期货交易时,要想有效地管理仓位,需要遵循一…

Windwos +vs 2022 编译openssl 1.0.2 库

一 前言 先说 结论&#xff0c;编译64位报错&#xff0c;查了一圈没找到解决方案&#xff0c;最后换了32位的。 使用qt访问web接口&#xff0c;因为是https&#xff0c;没有openssl库会报错 QNetworkReply* reply qobject_cast<QNetworkReply*>(sender());if (reply){…

vivo 互联网自研代码评审 VCR 落地实践

作者&#xff1a;vivo 互联网效能平台团队- Chi Wei 本文介绍了vivo工程效能团队基于 Gitlab、Gerrit等开源工具搭建的VCR平台&#xff0c;代码评审idea插件开发及开发过程中遇到的挑战、困难&#xff0c;并分享了相应的应对策略和优化方案。 代码评审是软件质量保证一种活动&…

5年成为10亿级大单品,海天如何策划黄豆酱的极致产品力?

在当今的调味品市场中&#xff0c;酱料作为一个重要的细分品类&#xff0c;正迅速成为消费者日常饮食中不可或缺的一部分。随着人们对烹饪品质和口味多样化的追求不断提升&#xff0c;酱料市场的前景愈发广阔。而在这片广阔的市场中&#xff0c;海天味业&#xff0c;作为中国调…

ElasticSearch-Windows系统ElasticSearch(ES)的下载及安装

前言 下载ElasticSearch 可以进入ElasticSearch官方下载地址&#xff0c;选择与电脑系统相对应的版本&#xff1b;博主已经上传资源&#xff0c;或者点此直接免费下载&#xff0c;本次演示版本为8.14.1。 注意&#xff1a; Elasticsearch 5 需要 Java 8 以上版本&#xff1b;…

Excel 宏录制与VBA编程 ——VBA编程技巧篇一 (Union方法、Resize方法、Cells方法、UseSelect方法、With用法)

Uniom方法 使用Union方法可以将多个非连续区域连接起来成为一个区域&#xff0c;从而可以实现对多个非连续区域一起进行操作。 Resize方法 使用Range对象的Resize属性调整指定区域的大小&#xff0c;并返回调整大小后的单元格区域。 Cells方法 Cells属性返回一个Range对象。 Us…

基于Java的大学生租房系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架&#xff0c;MVC模式 工具&#xff1a;Vscode&#xff0c;MySQL&#xff0c;B/S架构…

计算机网络之OSI七层体系结构

目录 1.物理层 1.1物理层组成 1.2物理层功能 1.3物理层服务 1.4物理层标准 1.5物理层接口 2.数据链路层 2.1基于物理层的问题 2.2数据链路层功能 2.3数据链路层服务 2.4数据链路层协议 3.网络层 3.1基于DL层的问题 3.2网络层功能 3.3网络层服务 3.4网络层协议 …