Ansible playbook自动化运维工具详解

Ansible playbook自动化运维工具详解

  • 一、playbook的相关知识
    • 1.1、playbook 的简介
    • 1.2、playbook的 各部分组成
  • 二、基础的playbook剧本编写实例
  • 三、 playbook的定义、引用变量
    • 3.1、基础变量的定义与引用
    • 3.2、引用fact信息中的变量
  • 四、playbook中的when条件判断和变量循环使用
    • 4.1、when条件判断
    • 4.2、变量循环
  • 五、Templates 模块
    • cd /etc/ansible #在ansible的所在目录中创建该项目的目录 mkdir apache vim apache.yaml
    • vim nginx.yaml
    • vim test1.yaml
    • vim test2.yaml
    • vim test3.yaml
    • vim test3.yaml
    • 4.2 变量循环 (1)with_item 单循环输出 vim test4.yaml
    • vim test4.yaml
    • (2) with_list 每组列表一起循环的输出
    • (3) with_together 同一列表位置数据组合输出的循环
    • (4) with_nested 列表数据循环匹配的循环(根据列表个数定义有多少层的循环)
  • 五、Templates 模块
  • 六、Tags
    • 6.1 单标签的使用
    • 6.2、多标签的运用
    • 6.3、通用标签always的运用

一、playbook的相关知识

1.1、playbook 的简介

  • playbook是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。
  • 简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。
  • Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。
  • 而playbook就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language)。

1.2、playbook的 各部分组成

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

二、基础的playbook剧本编写实例

playbook中运用的模块就是ansible中的模块,就像docker-compose一样将docker操作容器的指令归纳为一个yaml文件,开启运行yaml中的指令模块就能按照预设计的方向去完成。

实例1:playbook编写 apache的yum安装部署剧本

剧本编写实现的需求:对Ansible管理的所有的webservers组的成员,yum安装最新版本的apache服务软件,并进行相应环境的调整,确保webservers的apache服务能够正常运行并设置开机自启 
cd /etc/ansible    #在ansible的所在目录中创建该项目的目录
mkdir apache
vim apache.yaml
---
- name: apache yum apply
  gather_facts: false
  hosts: webservers
  remote_user: root
  tasks:
   - name: test connection
     ping:
 
   - name: stop firewalld
     service: name=firewalld state=stopped
 
   - name: stop selinux
     command: '/usr/sbin/setenforce 0'
     ignore_errors: true
 
   - name: yum install apache service
     yum: name=httpd state=latest
 
   - name: start apache service
     service: name=httpd state=started enabled=yes

在这里插入图片描述
运行剧本的方法:

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

在这里插入图片描述
在这里插入图片描述
实例2:playbook编写nginx 的yum安装并且能修改其监听端口的剧本

需求:通过yum安装nginx服务,并且能够控制被管理的主机的服务的开启,按照预设的配置在运行时的端口。

在编写剧本前,需要准备相应的两个文件,一个为nginx的yum源。一个为相对应的主配置文件,在主配置文件中修改其端口,在将该配置移至被管理主机中,作为运行启动时的默认配置 

在这里插入图片描述
在这里插入图片描述
剧本编写:

mkdir /etc/ansible/nginx
 
vim nginx.yaml 
---
- name: nginx script
  gather_facts: false
  hosts: webservers
  remote_user: root
  tasks:
   - name: test connection
     ping:
 
   - name: stop firewalld
     service: name=firewalld state=stopped enabled=no
 
   - name: stop selinux
     command: '/usr/sbin/setenforce 0'
     ignore_errors: true
 
   - name: prepare nginx repo
     copy: src=/etc/ansible/nginx/nginx.repo dest=/etc/yum.repos.d/nginx.repo
 
   - name: install nginx
     yum: name=nginx state=latest
 
   - name: change port
     copy: src=/opt/default.conf dest=/etc/nginx/conf.d/default.conf
     notify: "restart nginx"
 
   - name: start nginx
     service: name=nginx state=started enabled=yes
 
  handlers:
   - name: restart nginx
     service: name=nginx state=restarted
 

在这里插入图片描述
运行结果:

在这里插入图片描述

在这里插入图片描述

三、 playbook的定义、引用变量

3.1、基础变量的定义与引用

在yaml文件中,我们可以在初始配置的模块中用var去定义变量的存在,变量的格式为key:value,以此来确定该变量在剧本中的存在
vim test1.yaml
---
- name: this is a play for testing variables
  hosts: dbservers
  remote_user: root
  vars:
   filename: abc.txt
  tasks:
   - name: touch a test file
     file: path=/opt/{{filename}} state=touch
 
 
ansible-playbook test1.yaml

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

3.2、引用fact信息中的变量

首先我们知道  使用 ansible   -m setup   可以收集该组中所有的节点信息 

所以setup中fact'信息,有时候会剧本编写中需要,而fact的信息也是可以通过变量的方式进行调用

在这里插入图片描述
剧本编写:

vim test2.yaml
---
- name: this is a playbook for quote variate
  hosts: dbservers
  remote_user: root
  tasks:
   - name: reading setup fact variate
     debug: msg={{ansible_date_time.weekday}}
~                                                 

在这里插入图片描述
运行的结果:
在这里插入图片描述

四、playbook中的when条件判断和变量循环使用

4.1、when条件判断

#选用filter=ansible_default_ipv4中的address作为when条件进行测试
ansible all -m setup -a 'filter=ansible_default_ipv4'

在这里插入图片描述
测试剧本编写:

vim test3.yaml
---
- name: this is when test playbook
  hosts: all
  remote_user: root
  tasks:
   - name: test when
     debug: msg='判断位置'
     when: ansible_default_ipv4.address == "192.168.73.107"
 
 
ansible-playbook test3.yaml

在这里插入图片描述

4.2、变量循环

with_item 单循环输出
vim test4.yaml
---
- name: item test
  hosts: dbservers
  remote_user: root
  gather_facts: no
  tasks:
   - debug:
       msg: "{{item}}"
     with_items: [a, b, c, d]
 
ansible-playbook test4.yaml

在这里插入图片描述

   with_list  每组列表一起循环的输出
---
- name: item test
  hosts: dbservers
  remote_user: root
  gather_facts: no
  tasks:
   - debug:
       msg: "{{item}}"
     with_list:
      - [a, b, c, d]
      - [1 ,2, 3, 4]
~                                                                                                                                           
~                            

在这里插入图片描述

with_together 同一列表位置数据组合输出的循环
---
- name: item test
  hosts: dbservers
  remote_user: root
  gather_facts: no
  tasks:
   - debug:
       msg: "{{item}}"
     with_together:
      - [a, b, c, d]
      - [1 ,2, 3, 4]
~                        

在这里插入图片描述

with_nested 列表数据循环匹配的循环(根据列表个数定义有多少层的循环)
---
- name: item test
  hosts: dbservers
  remote_user: root
  gather_facts: no
  tasks:
   - debug:
       msg: "{{item}}"
     with_nested:
      - [a, b, c, d]
      - [1 ,2, 3, 4]
~                      

在这里插入图片描述

四种迭代循环方式的总结
  • whith_items: {{item}}会把所有的列表展开进行遍历输出,with_flattened也可以替代with_items

  • with_list: {{item}}会把每个列表当作一个整体输出。如果每个列表中只有一个值,则效果与with items一致。loop也可以替代ith

  • with_together: {{item}}引用时会把每个列表相同位置的值对齐合并后输出

  • with nested:{ {item}}引用时会把每个列表的值两两组合循环输出

五、Templates 模块

linux自动化运维
同时被 2 个专栏收录
8 篇文章1 订阅
订阅专栏

Linux软件使用
10 篇文章1 订阅
订阅专栏
内容预知
目录

内容预知

1.playbook的相关知识

1.1 playbook 的简介

1.2 playbook的 各部分组成

  1. 基础的playbook剧本编写实例

实例1:playbook编写 apache的yum安装部署剧本

实例2:playbook编写nginx 的yum安装并且能修改其监听端口的剧本

  1. playbook的定义、引用变量

3.1 基础变量的定义与引用

3.2 引用fact信息中的变量

  1. playbook中的when条件判断和变量循环使用

4.1 when条件判断

4.2 变量循环

(1)with_item 单循环输出

(2) with_list 每组列表一起循环的输出

(3) with_together 同一列表位置数据组合输出的循环

(4) with_nested 列表数据循环匹配的循环(根据列表个数定义有多少层的循环)

四种迭代循环方式的总结

  1. Templates 模块

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

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

(3) 编写 playbook

  1. Tags

6.1 单标签的使用

6.2 多标签的运用

6.3 通用标签always的运用

  1. roles

1.playbook的相关知识
1.1 playbook 的简介
playbook是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language)。

对于YAML文件格式的编写,我在之前的博客就有所介绍:

【云原生】Docker-compose单机容器集群编排_站在这别动,我去给你买橘子的博客-CSDN博客
https://blog.csdn.net/qq_62462797/article/details/128052363?spm=1001.2014.3001.5501

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

  1. 基础的playbook剧本编写实例
    playbook中运用的模块就是ansible中的模块,就像docker-compose一样将docker操作容器的指令归纳为一个yaml文件,开启运行yaml中的指令模块就能按照预设计的方向去完成。

实例1:playbook编写 apache的yum安装部署剧本
剧本编写实现的需求:对Ansible管理的所有的webservers组的成员,yum安装最新版本的apache服务软件,并进行相应环境的调整,确保webservers的apache服务能够正常运行并设置开机自启

cd /etc/ansible #在ansible的所在目录中创建该项目的目录
mkdir apache
vim apache.yaml

  • name: apache yum apply
    gather_facts: false
    hosts: webservers
    remote_user: root
    tasks:
    • name: test connection
      ping:

    • name: stop firewalld
      service: name=firewalld state=stopped

    • name: stop selinux
      command: ‘/usr/sbin/setenforce 0’
      ignore_errors: true

    • name: yum install apache service
      yum: name=httpd state=latest

    • name: start apache service
      service: name=httpd state=started enabled=yes

运行剧本的方法:

//运行playbook
ansible-playbook apache.yaml

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

实例2:playbook编写nginx 的yum安装并且能修改其监听端口的剧本
需求:通过yum安装nginx服务,并且能够控制被管理的主机的服务的开启,按照预设的配置在运行时的端口。

在编写剧本前,需要准备相应的两个文件,一个为nginx的yum源。一个为相对应的主配置文件,在主配置文件中修改其端口,在将该配置移至被管理主机中,作为运行启动时的默认配置

剧本编写:

mkdir /etc/ansible/nginx

vim nginx.yaml

  • name: nginx script
    gather_facts: false
    hosts: webservers
    remote_user: root
    tasks:

    • name: test connection
      ping:

    • name: stop firewalld
      service: name=firewalld state=stopped enabled=no

    • name: stop selinux
      command: ‘/usr/sbin/setenforce 0’
      ignore_errors: true

    • name: prepare nginx repo
      copy: src=/etc/ansible/nginx/nginx.repo dest=/etc/yum.repos.d/nginx.repo

    • name: install nginx
      yum: name=nginx state=latest

    • name: change port
      copy: src=/opt/default.conf dest=/etc/nginx/conf.d/default.conf
      notify: “restart nginx”

    • name: start nginx
      service: name=nginx state=started enabled=yes

    handlers:

    • name: restart nginx
      service: name=nginx state=restarted

运行结果:

  1. playbook的定义、引用变量
    3.1 基础变量的定义与引用
    在yaml文件中,我们可以在初始配置的模块中用var去定义变量的存在,变量的格式为key:value,以此来确定该变量在剧本中的存在

vim test1.yaml

  • name: this is a play for testing variables
    hosts: dbservers
    remote_user: root
    vars:
    filename: abc.txt
    tasks:
    • name: touch a test file
      file: path=/opt/{{filename}} state=touch

ansible-playbook test1.yaml

3.2 引用fact信息中的变量
首先我们知道 使用 ansible 组 -m setup 可以收集该组中所有的节点信息 ,

所以setup中fact’信息,有时候会剧本编写中需要,而fact的信息也是可以通过变量的方式进行调用

剧本编写:

vim test2.yaml

  • name: this is a playbook for quote variate
    hosts: dbservers
    remote_user: root
    tasks:
    • name: reading setup fact variate
      debug: msg={{ansible_date_time.weekday}}
      ~

运行的结果:

  1. playbook中的when条件判断和变量循环使用
    4.1 when条件判断
    #选用filter=ansible_default_ipv4中的address作为when条件进行测试
    ansible all -m setup -a ‘filter=ansible_default_ipv4’

测试剧本编写:

vim test3.yaml

  • name: this is when test playbook
    hosts: all
    remote_user: root
    tasks:
    • name: test when
      debug: msg=‘判断位置’
      when: ansible_default_ipv4.address == “192.168.73.107”

ansible-playbook test3.yaml

除此之外 when条件还可以通过 !=(不等于条件来进行判断)

vim test3.yaml

  • name: this is when test playbook
    hosts: all
    remote_user: root
    tasks:
    • name: test when
      debug: msg=‘判断位置’
      when: ansible_default_ipv4.address != “192.168.73.107”
      ansible-playbook test3.yaml

4.2 变量循环
(1)with_item 单循环输出
vim test4.yaml

  • name: item test
    hosts: dbservers
    remote_user: root
    gather_facts: no
    tasks:
    • debug:
      msg: “{{item}}”
      with_items: [a, b, c, d]

ansible-playbook test4.yaml

当列表为两个时。with_item的输出方式:

vim test4.yaml

  • name: item test
    hosts: dbservers
    remote_user: root
    gather_facts: no
    tasks:
    • debug:
      msg: “{{item}}”
      with_items:
      • [a, b, c, d]
      • [1 ,2, 3, 4]
        ansible-playbook test4.yaml

(2) with_list 每组列表一起循环的输出

  • name: item test
    hosts: dbservers
    remote_user: root
    gather_facts: no
    tasks:
    • debug:
      msg: “{{item}}”
      with_list:
      • [a, b, c, d]
      • [1 ,2, 3, 4]
        ~
        ~

(3) with_together 同一列表位置数据组合输出的循环

  • name: item test
    hosts: dbservers
    remote_user: root
    gather_facts: no
    tasks:
    • debug:
      msg: “{{item}}”
      with_together:
      • [a, b, c, d]
      • [1 ,2, 3, 4]
        ~

  • name: item test
    hosts: dbservers
    remote_user: root
    gather_facts: no
    tasks:
    • debug:
      msg: “{{item}}”
      with_together:
      • [a, b, c, d]
      • [1 ,2, 3, 4]
      • [A, B, C]

(4) with_nested 列表数据循环匹配的循环(根据列表个数定义有多少层的循环)

  • name: item test
    hosts: dbservers
    remote_user: root
    gather_facts: no
    tasks:
    • debug:
      msg: “{{item}}”
      with_nested:
      • [a, b, c, d]
      • [1 ,2, 3, 4]
        ~

四种迭代循环方式的总结
whith_items: {{item}}会把所有的列表展开进行遍历输出,with_flattened也可以替代with_items

with_list: {{item}}会把每个列表当作一个整体输出。如果每个列表中只有一个值,则效果与with items一致。loop也可以替代ith

with_together: {{item}}引用时会把每个列表相同位置的值对齐合并后输出

with nested:{ {item}}引用时会把每个列表的值两两组合循环输出

五、Templates 模块

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

  • 本次我们以改变apche的配置文件为例,来展现Templates模块的运用

     先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量 
    
#如果没有相关的httpd的配置文件,可以先yum按住一个httpd的服务,取其主配置文件
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
 
vim /opt/httpd.conf.j2
Listen {{http_port}}				#42行,修改
ServerName {{server_name}}			#95行,修改
DocumentRoot "{{root_dir}}"          #119行,修改
修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
vim /etc/ansible/hosts       
[webservers]
192.168.73.106 http_port=192.168.73.106:80 server_name=www.test1.com:80 root_dir=/etc/httpd/htdocs
 
[dbservers]
192.168.73.107 http_port=192.168.73.107:80 server_name=www.test2.com:80 root_dir=/etc/httpd/htdocs

在这里插入图片描述

  此外如果没有做DNS解析域名,还需要对主机名进行映射 :
vim /etc/hosts
 
192.168.73.106 www.test1.com
192.168.73.107 www.test2.com
编写 playbook 
mkdir /etc/ansible/templates
vim apache.yaml
---
- hosts: all
  remote_user: root
  vars:
    - package: httpd
    - service: httpd
  tasks:
    - name: install httpd package
      yum: name={{package}} state=latest
    - name: install configure file
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify:
        - restart httpd
    - name: create root dir
      file: path=/etc/httpd/htdocs state=directory
    - name: start httpd server
      service: name={{service}} enabled=true state=started
  handlers:
    - name: restart httpd
      service: name={{service}} state=restarted
 
 
ansiable-playbook apache.yaml

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

六、Tags

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

6.1 单标签的使用

vim test1.yaml
---
- name: this is a play for testing variables
  hosts: dbservers
  remote_user: root
  vars:
   filename: abc.txt
  tasks:
   - name: position 1
     debug:
       msg: 'ls /opt'
     tags:
      - only
   - name: position 2
     debug:
       msg: 'ls /mnt'
 
ansible-playbook test1.yaml --tags="only"

在这里插入图片描述

6.2、多标签的运用

---
- name: this is a play for testing variables
  hosts: dbservers
  remote_user: root
  vars:
   filename: abc.txt
  tasks:
   - name: position 1
     debug:
       msg: '测试标签1'
     tags:
      - one
   - name: position 2
     debug:
       msg: '测试标签2'
     tags:
      - two
 
   - name: position 3
     debug:
       msg: '测试标签3'
     tags:
      - one

在这里插入图片描述
执行结果:

在这里插入图片描述

6.3、通用标签always的运用

---
- name: this is a play for testing variables
  hosts: dbservers
  remote_user: root
  vars:
   filename: abc.txt
  tasks:
   - name: position 1
     debug:
       msg: '测试标签1'
     tags:
      - one
   - name: position 2
     debug:
       msg: '测试通用标签always'
     tags:
      - always
 
   - name: position 3
     debug:
       msg: '测试标签3'
     tags:
      - one
 

在这里插入图片描述
执行结果:
在这里插入图片描述

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

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

相关文章

P02项目诊断报警组件(学习操作日志记录、单元测试开发)

★ P02项目诊断报警组件 诊断报警组件的主要功能有: 接收、记录硬件设备上报的报警信息。从预先设定的错误码对照表中找到对应的声光报警和蜂鸣器报警策略,结合当前的报警情况对设备下发报警指示。将报警消息发送到消息队列,由其它组件发送…

Collection集合 迭代器遍历Iterator 和集合增强For

迭代器遍历Iterator 标准写法: 增强For for(类型 名称 : 集合 ) 举例: 不仅可以集合也可以数组 底层仍然是iterator

设计模式—结构型模式之装饰器模式

设计模式—结构型模式之装饰器模式 适配器是连接两个类,可以增强一个类,装饰器是增强一个类。 向一个现有的对象添加新的功能,同时又不改变其结构。属于对象结构型模式。 创建了一个装饰类,用来包装原有的类,并在保…

ZZ308 物联网应用与服务赛题第E套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 (E卷) 赛位号:______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用的…

解决ERR: cURL error 77: Unable to initialize NSS: -8023

研发反映一个问题,上传文件时失败,日志内错误信息如下: ERR: cURL error 77: Unable to initialize NSS: -8023 (SEC_ERROR_PKCS11_DEVICE_ERROR) ... 这个功能使用了腾讯云的点播服务。因此立即联系了腾讯云客服。 搞了很久问题依旧。 反复测试,发现上传视频文件,错…

精解括号匹配问题与极致栈设计:揭开最大栈和最小栈的奥秘

目录 括号匹配问题最小栈最大栈 最大栈和最小栈是极致栈的两个重要变种。最大栈用于存储当前匹配的最大值,而最小栈用于存储当前匹配的最小值。 括号匹配问题 这个问题我们来看力扣20题的描述: 给定一个只包括 ‘(’,‘)’,‘{’…

大数据毕业设计选题推荐-营业厅营业效能监控平台-Hadoop-Spark-Hive

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

RTC实时时钟——DS1302

DS1302目录 一、DS1302简介引脚定义与推荐电路 二、芯片手册1.操作寄存器的定义2.时序定义dc1302.cds1302.h 三、蓝桥杯实践 一、DS1302简介 RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片。现在流行的串行时钟电路很多,如…

把wpf的窗体保存为png图片

昨晚在stack overflow刷问题时看到有这个问题,今天早上刚好来尝试学习一下 stack overflow的链接如下: c# - How to render a WPF UserControl to a bitmap without creating a window - Stack Overflow 测试步骤如下: 1 新建.net frame…

企业微信vs个人微信:对比对照一览表

继微信后,腾讯推出了企业微信。企业微信可以添个人微信为好友,有群聊和朋友圈,粗看起来与个人微信十分相似,那么它们有什么区别呢? 企业微信和个人微信的区别是什么,咱今天两张图来对比看看~

输电线路AR可视化巡检降低作业风险

随着现代工业的快速发展,各行业的一线技术工人要处理的问题越来越复杂,一些工作中棘手的问题迫切需要远端专家的协同处理。但远端专家赶来现场往往面临着专家差旅成本高、设备停机损失大、专业支持滞后、突发故障无法立即解决等痛点。传统的远程协助似乎…

数据结构与算法-(11)---有序表(OrderedList)

🌈个人主页: Aileen_0v0 🔥系列专栏:PYTHON学习系列专栏 💫"没有罗马,那就自己创造罗马~" 目录 知识回顾及总结 有序表的引入 ​编辑 实现有序表 1.有序表-类的构造方法 2.有序表-search方法的实现 3.有序表-add方法的实现…

勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?

导言: 在当今数字化时代,网络犯罪分子不断进化,勒索病毒已经成为一种广泛传播的网络威胁。本文91数据恢复将深入介绍.halo勒索病毒,包括它的工作原理、如何从中恢复被加密的数据文件以及如何采取预防措施来保护自己免受感染。当面…

AD教程 (十)Value值的核对

AD教程 (十)Value值的核对 填写器件位号 直接根据原理图的原始编号进行更改 通过位号编辑器快速更改 点击工具,选择标注,选择原理图标注,进入位号编辑器 可以在位号编辑器中 设置处理顺序,从上往下还是从…

基于Skywalking的全链路跟踪实现

在前文“分布式应用全链路跟踪实现”中介绍了分布式应用全链路跟踪的几种实现方法,本文将重点介绍基于Skywalking的全链路实现,包括Skywalking的整体架构和基本概念原理、Skywalking环境部署、SpringBoot和Python集成Skywalking监控实现等。 1、Skywalki…

C#中的DataTable使用

在C#中,DataTable 是一个非常重要的组件,它是System.Data命名空间下的一部分。它用于在内存中存储表格数据,可以看作是一个内存中的数据库表。以下是DataTable的一些主要特点和常用的操作: 特点 内存中的数据存储:Da…

java入坑之类加载器

一、类加载机制 1.1类加载过程 类加载是Java虚拟机将类的字节码数据从磁盘或网络中读入内存,并转换成在JVM中可以被执行的Java类型的过程。类加载器是Java虚拟机的重要组成部分,负责加载和解析类的字节码,将其转换成Java虚拟机中的类对象&am…

14 http协议详解

1、http是应用层协议 统一资源定位符: 例如 http://www.jd.com是个URL,http是协议,www.jd.com是域名,表示互联网上的一个位置,有些url的资源定位会更清晰,比如http://www.jd.com/index.html 2、HTTP 请求…

【Solidity】Solidity中的基本数据类型和复合数据类型

1. 基本数据类型 1.1 整数类型 Solidity支持有符号整数和无符号整数,可以指定位数和范围。以下是一些整数类型的示例: int:有符号整数,可以是正数或负数。2,-45,2023 uint:无符号整数&#x…

TLS回调函数

TLS在逆向中的作用 TLS回调函数常用于反调试 TLS先于EP代码执行 TLS是什么 TLS是各线程的独立的数据存储空间 使用TLS技术可以在线程内部独立使用或修改进程的全局数据或静态数据 创建和终止某进程时,TLS回调函数都会自动调用执行 使用OD调试TLS函数