【Ansible】ansible 变量

news2024/11/24 4:01:39

ansible 变量


文章目录

  • ansible 变量
  • 一、Ansible 变量介绍
  • 二、变量命名规则
  • 三、变量类型
    • 1.全局变量
    • 2.剧本变量
    • 3.资产变量
    • 4.Facts 变量
    • 5.注册变量
    • 6.变量优先级


在这里插入图片描述


一、Ansible 变量介绍

在 PlayBook 一节中,将 PlayBook 类比成了 linux 中的shell。那么它作为一门 ansible 特殊的语言,肯定要涉及到变量定义、控制结构的使用等特性。

二、变量命名规则

  • 变量的名字由 字母、下划线和数字组成,必须以字母开头
  • 保留关键字不能作为变量名称

三、变量类型

根据变量的作用范围大体的将变量分为:

  • 全局变量
  • 剧本变量
  • 资产变量

这只是比较粗糙的划分,不能囊括 ansible 中的所有变量,下面将分别介绍者者三种变量的使用。

1.全局变量

全局变量,是我们使用ansible 或使用 ansible-playbook 时,手动通过 -e 参数传递给 ansible 的变量。

通过 ansible 或者 ansible-playbook 的 help 帮助,可以获取具体格式使用方式:

#ansible -h |grep var -e EXTRA_VARS,--extra-vars=EXTRA_VARS set additional variables as key=value or YAML/JSON
#ansible-playbook -h |grep var -e EXTRA_VARS,--extra-vars=EXTRA_VARS set additional variables as key=value or YAML/JSON

栗子

#ansible all -i localhost,  -m debug -a "msg='my key is {{key}}'" -e "key=value"

传递一个YAML/JSON 的形式(注意不管YAML 还是 JSON,它们的最终格式一定要是一个字典)

```bash
#cat test.json
{"name": "guan", "type": "people"}
[root@master1 ~]# ansible all -i localhost,  -m debug -a "msg='name is {{name}},type is {{type}}'" -e @test.json
[WARNING]: Found variable using reserved name: name
localhost | SUCCESS => {
    "msg": "name is guan,type is people"
}

[root@master1 ~]# cat abc.yml
---
name: guan
type: student
...
[root@master1 ~]# ansible all -i localhost,  -m debug -a "msg='name is {{name}},type is {{type}}'" -e @
abc.yml
[WARNING]: Found variable using reserved name: name
localhost | SUCCESS => {
    "msg": "name is guan,type is student"
}

[root@master1 ~]# 

2.剧本变量

这种变量和playbook 有关,定义在 playbook 中的,它的定义方式有多种。这里介绍两种最常见的定义方式。

通过 Playbook 属性 vars 定义

---
- name: test play vars
  hosts: all
  vars:
    user: zhangsan
    home: /home/zhangsan
...

通过 Play 属性 vars_files 定义

#当通过vars属性定义的变量很多时,这个 Play 就会感觉特别臃肿,此时我们可将变量单独从play中抽离出来
#形成单独的 yaml 文件
---
- name: test play vars
  hosts: all
  vars:
    - vars/users.yml
...
#cat vars/users.yml
---
user: zhangsan
home: /home/zhangsan

如何在 playbook 中使用这些变量

在playbook中使用变量时,使用 {{ 变量名 }} 来使用变量

---
- name: test play vars
  hosts: all
  vars:
    user: zhangsan
    home: /home/zhangsan
  tasks:
    - name: create the user {{ user}}
      user:
        name: "{{ user }}"
        home: "{{ home }}"
...
[root@master1 ~]# vim test_play_vars.yml
[root@master1 ~]# ansible-playbook -i localhost,  test_play_vars.yml -C

PLAY [test play vars] *********************************************************************************

TASK [Gathering Facts] ********************************************************************************
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:ygT6h9ejxNmaemQtyIzVYHEbRko0BaG4PstS2LTavDM.
ECDSA key fingerprint is MD5:88:1f:c4:d2:fe:73:b9:1f:7f:26:cd:2c:ba:ad:5c:b5.
Are you sure you want to continue connecting (yes/no)? yes
fatal: [localhost]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}

PLAY RECAP ********************************************************************************************
localhost                  : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   

[root@master1 ~]# ssh-copy-id root@192.168.200.181
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.200.181 (192.168.200.181)' can't be established.
ECDSA key fingerprint is SHA256:ygT6h9ejxNmaemQtyIzVYHEbRko0BaG4PstS2LTavDM.
ECDSA key fingerprint is MD5:88:1f:c4:d2:fe:73:b9:1f:7f:26:cd:2c:ba:ad:5c:b5.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.200.181's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.200.181'"
and check to make sure that only the key(s) you wanted were added.

[root@master1 ~]# ansible-playbook -i localhost,  test_play_vars.yml -C

PLAY [test play vars] *********************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [localhost]

TASK [create the user zhangsan] ***********************************************************************
changed: [localhost]

PLAY RECAP ********************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@master1 ~]# cat test_play_vars.yml
---
- name: test play vars
  hosts: all
  vars:
    user: zhangsan
    home: /home/zhangsan
  tasks:
    - name: create the user {{ user}}
      user:
        name: "{{ user }}"
        home: "{{ home }}"
...
[root@master1 ~]# 

  • 执行出现以下错误的原因是 {{ user }} 两端没有加双引号
[root@master1 ~]# ansible-playbook -i localhost,  test_play_vars.yml -C
ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: No JSON object could be decoded

Syntax Error while loading YAML.
  found unacceptable key (unhashable type: 'AnsibleMapping')

The error appears to be in '/root/test_play_vars.yml': line 10, column 16, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

      user:
        name: {{ user }}
               ^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"
[root@master1 ~]# 

这样错误的主要原因是playbook 是yaml的格式文件,当 ansible 分析 yaml 文件时,有可能会误认为是字典。
name: {{ user }} 是一个字典的开始。因此,加针对变量的使用,加上了双引号,避免 ansible 错误解析。

3.资产变量

资产变量分为主机变量和主机组变量,分别针对资产中的单个主机和主机组。

主机变量
以下资产中,定义了一个主机变量 lisi ,此变量只针对 192.168.200.183 这台服务器有效。

[root@master1 ~]# vim hosts_vars
[root@master1 ~]# cat hosts_vars
[web_servers]
192.168.200.183 user=lisi port=3309
192.168.200.182

[root@master1 ~]# 

验证

[root@master1 ~]# ansible 192.168.200.183 -i hosts_vars  -m debug -a "msg='{{user}} {{port}}'"
192.168.200.183 | SUCCESS => {
    "msg": "lisi 3309"
}
[root@master1 ~]# 
//未获取到定义的变量值,因为 user 这个变量针对 192.168.200.182 主机无效
[root@master1 ~]# ansible 192.168.200.182 -i hosts_vars  -m debug -a "var=user"
192.168.200.182 | SUCCESS => {
    "user": "VARIABLE IS NOT DEFINED!"
}

主机组变量
以下资产中,定义了一个组变量home,此变量将针对 web_servers 这个主机组中的所有服务器有效

[root@master1 ~]# cat hosts_groupvars
[web_servers]
192.168.200.183 user=lisi port=3309
192.168.200.182

[web_servers:vars]
home="/home/lisi"

验证

[root@master1 ~]# ansible web_servers -i hosts_groupvars  -m debug -a "var=home"
192.168.200.182 | SUCCESS => {
    "home": "/home/lisi"
}
192.168.200.183 | SUCCESS => {
    "home": "/home/lisi"
}
[root@master1 ~]# 

主机变量 vs 主机组变量

当主机变量和组变量在同一个资产中发生重名的情况,会有什么效果

[root@master1 ~]# vim hosts_vs
[root@master1 ~]# cat hosts_vs
[web_servers]
192.168.200.183 user=lisi 
192.168.200.182

[web_servers:vars]
user=tongtong


验证

//在资产中定义了主机变量和组变量 user,此时发现 192.168.200.183 这台服务器的主机变量 user 的优先级 高于 组变量user 使用。
[root@master1 ~]# ansible web_servers -i hosts_vs  -m debug -a "var=user"
192.168.200.183 | SUCCESS => {
    "user": "lisi"
}
192.168.200.182 | SUCCESS => {
    "user": "tongtong"
}
[root@master1 ~]# 

变量的继承

[root@master1 ~]# cat hosts_v1
[web3_servers]
192.168.200.183  

[web2_servers]
192.168.200.182


[allservers]
[allservers:children]
web2_servers
web3_servers

[allservers:vars]
user=lisi
//在资产继承的同时,对应的变量也发生了继承
[root@master1 ~]# ansible allservers -i hosts_v1  -m debug -a "var=user"
192.168.200.183 | SUCCESS => {
    "user": "lisi"
}
192.168.200.182 | SUCCESS => {
    "user": "lisi"
}
[root@master1 ~]# 
[root@master1 ~]# ansible web2_servers -i hosts_v1  -m debug -a "var=user"
192.168.200.182 | SUCCESS => {
    "user": "lisi"
}
[root@master1 ~]# ansible web3_servers -i hosts_v1  -m debug -a "var=user"
192.168.200.183 | SUCCESS => {
    "user": "lisi"
}
[root@master1 ~]# 

4.Facts 变量

facts 变量不包含在之前介绍的全局变量、剧本变量及资产变量之内。
facts 变量不需要我们人为去声明变量名及赋值。它的声明和赋值完全有 ansible 中的 setup 模块帮助我们完成。
它收集了有关被管理服务器的操作系统版本、服务器IP地址、主机名,磁盘的使用情况、cpu个数、内存条大小等等有关被管理服务器的私有信息。

在每次playbook运行的时候都会发现在 Playbook 执行一个 Gathering Facts的过程。这个过程就是收集被管理服务器的facts信息过程。

手动收集 Facts 变量

[root@master1 ~]# ansible all -i localhost, -c local  -m setup
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.200.181", 
            "192.168.122.1"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::8054:e8a7:a00d:e7f5", 
            "fe80::2e53:1e73:716d:c608", 
            "fe80::5d99:b781:21b8:139b"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
        }, 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "07/22/2020", 
        "ansible_bios_version": "6.00", 
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-957.el7.x86_64", 
            "LANG": "zh_CN.UTF-8", 
            "crashkernel": "auto", 
            "quiet": true, 
            "rd.lvm.lv": "centos/swap", 
            "rhgb": true, 
            "ro": true, 
            "root": "/dev/mapper/centos-root"
        }, 
...
...
...

过滤 Facts

通过刚刚的手动收集 Facts,我们发现facts 信息量很大。因此,可以有针对性的显示我们想要的信息。

可以通过使用facts 模块中filter 参数去过滤我们想要的信息。

  • 仅获取服务器的内存信息情况
[root@master1 ~]# ansible all -i localhost, -c local  -m setup -a "filter=*memory*"
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_memory_mb": {
            "nocache": {
                "free": 1826, 
                "used": 1001
            }, 
            "real": {
                "free": 189, 
                "total": 2827, 
                "used": 2638
            }, 
            "swap": {
                "cached": 94, 
                "free": 1567, 
                "total": 2047, 
                "used": 480
            }
        }, 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}

  • 仅获取服务器的磁盘挂在情况
[root@master1 ~]# ansible all -i localhost, -c local  -m setup -a "filter=*mount*"
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_mounts": [
            {
                "block_available": 213906, 
                "block_size": 4096, 
                "block_total": 259584, 
                "block_used": 45678, 
                "device": "/dev/sda1", 
                "fstype": "xfs", 
                "inode_available": 523947, 
                "inode_total": 524288, 
                "inode_used": 341, 
                "mount": "/boot", 
                "options": "rw,relatime,attr2,inode64,noquota", 
                "size_available": 876158976, 
                "size_total": 1063256064, 
                "uuid": "1bb90732-6784-4a0f-b4f7-71c74e55e7b5"
            }, 
            {
                "block_available": 0, 
                "block_size": 0, 
                "block_total": 0, 
                "block_used": 0, 
                "device": "/dev/fuse", 
                "fstype": "fuse", 
                "inode_available": 0, 
                "inode_total": 0, 
                "inode_used": 0, 
                "mount": "/run/user/1001/doc", 
                "options": "rw,nosuid,nodev,relatime,user_id=1001,group_id=1008", 
                "size_available": 0, 
                "size_total": 0, 
                "uuid": "N/A"
            }, 
            {
                "block_available": 2042537, 
                "block_size": 4096, 
                "block_total": 4452864, 
                "block_used": 2410327, 
                "device": "/dev/mapper/centos-root", 
                "fstype": "xfs", 
                "inode_available": 8670224, 
                "inode_total": 8910848, 
                "inode_used": 240624, 
                "mount": "/", 
                "options": "rw,relatime,attr2,inode64,noquota", 
                "size_available": 8366231552, 
                "size_total": 18238930944, 
                "uuid": "c26721c5-0deb-42fe-949d-3779b2bd4276"
            }
        ], 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}
[root@master1 ~]# 

在 Playbook 中去使用Facts 变量
默认情况下,在执行Playbook的时候,它会去自动的获取每台被管理服务器的facts信息。

[root@master1 ~]# vim facts.yml
[root@master1 ~]# ansible-playbook -i localhost, facts.yml

PLAY [print facts variable] ***************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [localhost]

TASK [print facts variable] ***************************************************************************
ok: [localhost] => {
    "msg": "The default IPV4 address is [u'0', u'AuthenticAMD', u'AMD Ryzen 7 5700U with Radeon Graphics', u'1', u'AuthenticAMD', u'AMD Ryzen 7 5700U with Radeon Graphics']"
}

PLAY RECAP ********************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@master1 ~]# cat facts.yml
---
- name: print facts variable
  hosts: all
  tasks:
    - name: print facts variable
      debug: 
        msg: "The default IPV4 address is {{ ansible_processor }}"
...

[root@master1 ~]# 

[root@master1 ~]# ansible-playbook -i localhost, facts.yml

PLAY [print facts variable] ***************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [localhost]

TASK [print facts variable] ***************************************************************************
ok: [localhost] => {
    "msg": "/usr/bin/python"
}

PLAY RECAP ********************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@master1 ~]# cat facts.yml
---
- name: print facts variable
  hosts: all
  tasks:
    - name: print facts variable
      debug: 
        msg: "{{ ansible_python.executable }}"  //如果是字典就通过键获取对应的值
...

[root@master1 ~]# 

在Playbook 中去关闭 Facts 变量的获取

若在整个 Playbook 的执行过程中,完全未使用过 Facts 变量,此时我们可以将其关闭,以加速 playbook 的执行速度。

---
- name: the first play example
  hosts: web_servers
  gather_facts: no  //关闭 facts 变量收集功能
  remote_user: root
  tasks:
    - name: install nginx package
      yum: name=nginx state=present
    - name: copy nginx.conf to remote server
      copy: src=nginx.conf dest=/etc/nginx/nginx.conf
    - name: start nginx server
      service:
        name: nginx
        enabled:true
        state: started
...

执行

[root@master1 ~]# ansible-playbook   -i hosts my_playbook01.yml

5.注册变量

用于保存一个 task 任务的执行结果,以便于 debug 时使用,或者将此次 task 任务的结果作为条件,去判断是否执行其他 task 任务。

注册变量在playbook中通过 register 关键字 去实现。

[root@master1 ~]# vim  my_playbook02.yml
[root@master1 ~]# cat  my_playbook02.yml
---
- name: install a package and print the result
  hosts: web_servers
  remote_user: root
  tasks:
    - name: install nginx package
      yum: name=nginx state=present
      register: install_result
    - name: print result
      debug: var=install_result
...

执行

[root@master1 ~]# ansible-playbook  -i hosts my_playbook02.yml

PLAY [install a package and print the result] *********************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.200.183]

TASK [install nginx package] **************************************************************************
ok: [192.168.200.183]

TASK [print result] ***********************************************************************************
ok: [192.168.200.183] => {
    "install_result": {
        "changed": false, 
        "failed": false, 
        "msg": "", 
        "rc": 0, 
        "results": [
            "1:nginx-1.20.1-10.el7.x86_64 providing nginx is already installed"
        ]
    }
}

PLAY RECAP ********************************************************************************************
192.168.200.183            : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@master1 ~]# 

6.变量优先级

前面介绍了全局变量、剧本变量、资产变量、Facts 变量及注册变量,其中 facts 变量不需要人为去声明、赋值;注册变量只需通过关键字 register 去声明,而不需要赋值,而全局变量、剧本变量及资产变量则完全需要人为的去声明、赋值。

变量的优先权讨论,也将从这三类变量去分析。

假设在使用过程中,我们同时在全局变量、剧本变量及资产变量声明了同一个变量名,那么哪一个优先级最高呢?

下面通过实验去验证变量的优先级

环境准备

  • 定义一份资产、且定义了资产变量 user
[root@master1 ~]# vim  hosts_v1
[root@master1 ~]# cat hosts_v1
[web3_servers]
192.168.200.183  

[web2_servers]
192.168.200.182


[allservers]
[allservers:children]
web2_servers
web3_servers

[allservers:vars]
user=tomcat

[root@master1 ~]# 

2、编写一份 playbook 、同样定义剧本变量 user

[root@master1 ~]# vim  user_playbook.yml
[root@master1 ~]# cat  user_playbook.yml
---
- name: test variable priority
  hosts: all 
  remote_user: root
  vars:
    user: mysql
  tasks:
    - name: print the user value
      debug: msg='the user value is {{ user }}'
...
[root@master1 ~]# 

验证测试

[root@master1 ~]# ansible-playbook  -i hosts priority.yml

PLAY [test variable priority] *************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.200.183]
ok: [192.168.200.182]

TASK [print the user value] ***************************************************************************
ok: [192.168.200.183] => {
    "msg": "the user value is mysql"
}
ok: [192.168.200.182] => {
    "msg": "the user value is mysql"
}

PLAY RECAP ********************************************************************************************
192.168.200.182            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.200.183            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@master1 ~]# ansible-playbook  -i hosts priority.yml -e  "user=xiaobai"

PLAY [test variable priority] *************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.200.183]
ok: [192.168.200.182]

TASK [print the user value] ***************************************************************************
ok: [192.168.200.183] => {
    "msg": "the user value is xiaobai"
}
ok: [192.168.200.182] => {
    "msg": "the user value is xiaobai"
}

PLAY RECAP ********************************************************************************************
192.168.200.182            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.200.183            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@master1 ~]# 

变量优先级结论

当一个变量同时在全局变量、剧本变量 和 资产变量中定义时,优先级最高的是全局变量;其次是剧本变量;最后才是资产变量。


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

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

相关文章

搜索引擎收录查询,是什么影响了网站被搜索引擎收录

搜索引擎收录是指程序通过辨别把网站内容进行收录,同时会对这些内容进行价值以及其他方面的辨别。 我们想要知道网站有没有被搜索引擎收录,可以借助iis7seo批量查来查询网站有没有被搜索引擎收录。打开iis7seo批量查,添加需要查询的网站网址&…

计算结构体,位段,联合体(共用体)的大小

目录 一、计算结构体的大小 1.1 结构体的计算并不是简单的类型加运算 1.2 内存对齐 1.2.1 内存对齐规则 1.2.2 图解内存对齐 二、计算位段的大小 2.1位段是什么 2.2 位段的内存分配 三、计算联合体的大小 3.1 什么是联合体 3.2 联合体的内存分配 END. 一、计算结构…

Consensus Algorithm -- Raft

The Raft Consensus Algorithm Go 实现:etcd/raft、dragonboat Rust 实现:TiKV C 实现 :nebula-graph-storage、 RethinkDB、logcabin 拜占庭将军问题 拜占庭将军问题(Byzantine failures),是由莱斯利兰…

绝绝子!这些技巧真方便

技巧一:快速切换窗口 如果你还在使用桌面底部“任务栏”切换软件窗口,不妨试试这个“快速切换窗口”快捷键,仅需按住【Alt】键不放,并连续点按【tab】键即可实现窗口的快速切换,果真只有亲自上手体验才知道有多香&…

NLP中的对话机器人——问答机器人的应用场景

引言 本文是七月在线《NLP中的对话机器人》的视频笔记,主要介绍FAQ问答型聊天机器人的实现。 讲得还不错,关键是只要1分钱 FAQ问答机器人 FAQ就是一些常见问题与回答,比如https://letsencrypt.org/docs/faq/。 但是我们要做的不是一问一答…

原生RedHat OpenStack搭建

文章目录OpenStack的搭建方式实验软件及镜像实验环境配置NTP节点初始化配置配置本地yum仓库上传镜像文件至NTP节点搭建基于http的网络yum源搭建NTP服务配置Controller控制节点和Compute计算节点初始化配置安装RedHat OpenStack安装部署OpenStack配置OVS桥接OpenStack的搭建方式…

大赛启幕:2023数字中国创新大赛启动发布会在福州召开

2023年1月10日,由数字中国建设峰会组委会主办,福建省数字办、福建省工信厅、福建省通信管理局、福州市政府、泉州市政府、三明市政府、龙岩市政府等共同承办的2023数字中国创新大赛在福建省福州市盛大启幕。 十二届全国政协副主席王钦敏发来书面致辞。中…

Windows 10随机性死机怎么办?

在诸多的电脑问题中,死机算是格外恼人。尤其是当你正在编辑文档,正在做图,正在玩游戏,电脑突然死机,万一再加上没保存…… 如果你在使用Win10系统的过程中遇到随机性死机的问题,赶紧看看这篇文章。 小编整…

LeetCode 113. 路径总和 II

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 113. 路径总和 II,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名称 LeetCode …

简单通讯录的实现

这次我们来实现一个简单的通讯录 目录 1.基本框架及的实现 2.相关结构体的实现 3.通讯录的初始化 4.新建联系人 5.显示所有联系人信息 6.删除联系人 7.查找指定联系人 8.修改联系人信息 9.对联系人进行排序 10.完整代码 既然是通讯录,我们要实现以下内容 …

内存泄漏调优案列

案列背景 最近在做公司项目核心接口压测和稳定性压测时,各接口的成功率不足99.99%,通过分割压测之后发现,在压测A服务时,内存上升明显,且伴有频繁的fgc发生 jvm老年代内存使用率已经达到了100%且应用的fgc有5000次&am…

离散数学与组合数学-02二元关系上

文章目录离散数学与组合数学-02二元关系上2.1 序偶和笛卡尔积2.1.1 有序组的定义2.1.2 笛卡儿积笛卡儿积的性质2.2 关系的定义2.2.1 二元关系定义与案例2.2.2 二元关系的数学符号定义案例枚举二元关系2.2.3 定义域和值域2.2.4 二元关系概念的推广2.3 关系的表示2.3.1 集合表示法…

RS-485/RS-422收发器芯片DP3085 兼容替代MAX3085EESA

什么是RS-485 典型的串行通讯标准是RS232和RS485,它们定义了电压,阻抗等,但不对软件协议给予定义。RS-485总线标准规定了总线接口的电气特性标准即对于2个逻辑状态的定义:正电平在2V~6V之间,表示一个逻辑状态&#xf…

【基于动态内存+文件操作】通讯录管理系统

前言 每一个项目文件的功能说明 打印基本菜单1.创建一个适合存放联系人信息的结构体和通讯录结构体2.初始化通讯录(加载上次的联系人,检查容量是否充足) 枚举常量内部内容 (1)增加联系人信息 (2)删除某个联系人信息 (3)查找联系人信息 …

CY5.5-Dextran Cy5.5菁染料标记葡聚糖

产品名称:荧光Cy5.5菁染料标记葡聚糖 英文名称:CY5.5-Dextran 外观状态:紫色粉末 质量:90% 荧光波长:684nm-710nm 溶解性Dextran葡聚糖(右旋糖酐Dextran),是一类具支链葡萄糖高聚物,…

系分 - 案例分析 - 需求分析(FAST分析)

个人总结,仅供参考,欢迎加好友一起讨论 文章目录案例分析 - 需求分析(FAST分析)FAST1 范围定义2 问题分析鱼骨图帕累托图制定系统改进目标3 需求分析定义需求PIECES方法4 逻辑设计5 决策分析6 物理设计和集成/构造和测试/安装和发…

考虑写出一个不抛异常的swap 函数

目录 一.标准库中的swap函数 二.针对于非模板类,设计全特化的std::swap() 三.针对模板类 四.合理使用using 五.swap成员函数不能抛出异常 六.swap函数总结 一.标准库中的swap函数 在C11中有move函数,它可以是一个左值变为右值,在许多场…

mybatis进阶

Mybatis的各种查询功能 MyBatis的各种查询功能: * 1、若查询出的数据只有一条 * a>可以通过实体类对象接收 * b>可以通过list集合接收 * c>可以通过map集合接收 * 结果:{password123456, sex男, id3, age23, email12345qq.com, usernameadmin} …

STM32 按键模块化

文章目录前言一、按键的原理图二、按键的GPIO配置总结前言 本篇文章将继续带大家学习模块化编程,今天主要给大家讲解按键的模块化。 一、按键的原理图 我们可以看到按键分别接到了板子的PE3和PE4引脚。 按键的具体原理这里我就不多讲了,大家可以看我之…

星光starfive2开发板的gpio使用

starfive2开发板是riscv平台不错的板子。 发展非常快。在starfive1的基础上有大量的改进和提升。 板子上的GPIO引脚定义是这样定义的:如下图所示 右侧6,8,10是调试用的串口,跟树莓派是一致的。 GPIO引脚的编号跟树莓派不一样。…