ansible的控制语句

本章内容主要介绍 playbook 中的控制语句

  • 使用when判断语句
  • block-rescue判断
  • 循环语句
        一个play中可以包含多个task,如果不想所有的task全部执行,可以设置只有满足某个条件才执行这个task,不满足条件则不执行此task。本章主要讲解when 和 block-rescue两种判断语句。

1.when判断语句

when作为一个判断语句,出现在某个 task下,格式如下。
1 tasks :
2 name : aa
3 模块 1
4 when : 条件 1
如果条件1成立,则执行模块1,否则不执行。

注意: 在when中引用变量时是不用加{{}}的。

        本章实验都在/home/duan/demo3下操作,先把 demo3目录创建出来并把ansible.cfg 和 hosts拷贝进去,命令如下。

[blab@node01 ~]$ mkdir demo3
[blab@node01 ~]$ cp ansible.cfg hosts demo3/
[blab@node01 ~]$ cd demo3
[blab@node01 demo3]$

1.1when判断中>,<,!= 的使用

练习1:写一个playbook,判断某条件是否成立,成立了才执行task,否则不执行,命令如下。
[blab@node01 demo3]$ cat when1.yml 
---
- hosts: node02tasks:- name: task1debug: msg="111"when: 1 < 2
[blab@node01 demo3]$ 

        这里有一个task,判断1<2是否成立,如果成立则执行task1,屏幕上会显示111;如果不成立则不执行taskl,屏幕上不会显示111。这里明显是成立的,所以会执行task1。运行结果如下。

[blab@node01 demo3]$ ansible-playbook when1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task1] *******************************************************************
ok: [node02] => {"msg": "111"
}PLAY RECAP *********************************************************************
node02                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [blab@node01 demo3]$
        when后面可以有多个条件,用or或and作为连接符。
如果用or作为连接符,只要有一个条件成立即可,只有所有的条件都不成立时,整体才不成立

练习2:修改when1.yml的内容如下。
[blab@node01 demo3]$ cat when1.yml 
---
- hosts: node02tasks:- name: task1debug: msg="111"when: 1 < 2 or 2>3
[blab@node01 demo3]$ 
        此处用or作为连接符,只要有一个条件成立就会成立,2>3不成立,但是1<2成立,所以整体上就是成立的。运行结果如下。

[blab@node01 demo3]$ ansible-playbook when1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task1] *******************************************************************
ok: [node02] => {"msg": "111"
}PLAY RECAP *********************************************************************
node02                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [blab@node01 demo3]$
仍然会执行task1。

练习3:修改when1.yml的内容如下。
[blab@node01 demo3]$ cat when1.yml 
---
- hosts: node02tasks:- name: task1debug: msg="111"when: 1>2 or 2>3
[blab@node01 demo3]$
        此处用or作为连接符,1>2不成立且2>3也不成立,所以整体上就是不成立的,不会执行 task1。运行结果如下。

[blab@node01 demo3]$ ansible-playbook when1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task1] *******************************************************************
skipping: [node02]PLAY RECAP *********************************************************************
node02                     : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   [blab@node01 demo3]$
        也可以用and作为连接符,如果用and作为连接符,需要所有条件全部成立,只要有一个条件不成立,整体上就是不成立的。

练习4:修改when1.yml的内容如下。
[blab@node01 demo3]$ cat when1.yml 
---
- hosts: node02tasks:- name: task1debug: msg="111"when: 2>1 and 2>3
[blab@node01 demo3]$ 
        这里虽然2>1是成立的,但是2>3不成立,所以整体上就是不成立的,因为用and作为连接符,需要所有的条件都成立才可以,所以不会执行task1。运行结果如下。

[blab@node01 demo3]$ ansible-playbook when1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task1] *******************************************************************
skipping: [node02]PLAY RECAP *********************************************************************
node02                     : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   [blab@node01 demo3]$
在判断中,or 和 and是可以混用的,为了看得更清晰,可以使用小括号。
练习5:修改 when1.yml 的内容如下。
[blab@node01 demo3]$ cat when1.yml 
---
- hosts: node02tasks:- name: task1debug: msg="111"when: (1>2 or 2!=1) and 2>3
[blab@node01 demo3]$
        这里(1>2 or 2!=1)作为一个整体,1>2不成立,但是2!=1(=是不等于的意思)成立,所以此处( 1>2 or 2!=1)作为一个整体是成立的。and后面2>3不成立,所以整个when后面的判断是不成立的,不会执行此 task1。运行结果如下。
[blab@node01 demo3]$ ansible-playbook when1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task1] *******************************************************************
skipping: [node02]PLAY RECAP *********************************************************************
node02                     : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   [blab@node01 demo3]$

常见的判断符包括以下6种:

  1. ==:等于
  2. !=:不等于
  3. >:大于
  4. >=:大于等于
  5. <:小于
  6. <=:小于等于
练习6:如果node02的系统主版本是7(RHEL/CentOS7),则打印111,否则不打印。playbook的内容如下。
[blab@node01 demo3]$ cat when2.yml 
---
- hosts: node02tasks:- name: task2debug: msg="222"when: ansible_distribution_major_version == "7"
[blab@node01 demo3]$
因为node02的系统是RHEL8,所以不会执行此task2,即不会显示222。
[blab@node01 demo3]$ ansible-playbook when2.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task2] *******************************************************************
skipping: [node02]PLAY RECAP *********************************************************************
node02                     : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   [blab@node01 demo3]$ 

注意: ansible_distribution major version的值是一个字符串,所以when判断中=后面的7是要加引号的。
练习7:修改when2.yml 的内容如下。
[blab@node01 demo3]$ cat when2.yml 
---
- hosts: node02tasks:- name: task2debug: msg="222"when: ansible_distribution_major_version == "8"
[blab@node01 demo3]$ 
再次运行此playbook,命令如下,会显示222。
[blab@node01 demo3]$ ansible-playbook when2.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task2] *******************************************************************
ok: [node02] => {"msg": "222"
}PLAY RECAP *********************************************************************
node02                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [blab@node01 demo3]$
再次提醒:在when 中引用变量时是不用加{{}}的。

1.2 when判断中in的用法

在when语句中,除可以使用上面的大于、小于等判断方法外,还可以使用 in,用法如下。
value in 列表
如果此值在这个列表中,则判断成立,否则不成立。
练习:判断某值是否在列表中,编写 when3.yaml,命令如下。
[blab@node01 demo3]$ cat when3.yml 
--- 
- hosts: node02vars:list1: [1,2,3,4]tasks:- name: task3debug: msg="333"when: 2 in list1
[blab@node01 demo3]$
        此处定义了一个列表 list1,里面有4个值,分别为1、2、3、4;定义了一个task打印333,会不会执行这个task,就要看when后面的判断是否成立。如果2在列表list1中,则执行;如果不在,则不执行,很明显2在列表list1中,所以会执行此task,即屏幕上会显示333。运行结果如下。
[blab@node01 demo3]$ ansible-playbook when3.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task3] *******************************************************************
ok: [node02] => {"msg": "333"
}PLAY RECAP *********************************************************************
node02                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [blab@node01 demo3]$
        因为2在列表list1中,when判断成立,可以正确执行task3,所以屏幕上会显示333。修改when-3.yaml的内容如下。
[blab@node01 demo3]$ cat when3.yml 
--- 
- hosts: node02vars:list1: [1,2,3,4]tasks:- name: task3debug: msg="333"when: 2 not  in list1        //增加not
[blab@node01 demo3]$
这里判断的是2不在列表list1中,但2是在列表list1中的,所以判断不成立。运行结果如下。
[blab@node01 demo3]$ ansible-playbook when3.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task3] *******************************************************************
skipping: [node02]PLAY RECAP *********************************************************************
node02                     : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   [blab@node01 demo3]$
因为when判断不成立,所以屏幕上不会显示333。回想前面的例子。
 ‐‐‐‐ hosts: dbtasks:‐ name: 打印我在清单文件中的名称debug: msg={{inventory_hostname}}when: inventory_hostname in groups ['xx']
这里判断当前正在执行的主机是不是属于主机组xx,如果是则执行debug,如果不是则不执行。

1.3 when判断中is的用法

is可以用于判断变量是否被定义,常见的判断包括以下3种:

  1. is defined:变量被定义
  2. is undefined:等同于is not definend,变量没有被定义
  3. is none:变量被定义了,但是值为空
看下面的例子:
[blab@node01 demo3]$ cat when4.yml 
---
- hosts: node02vars:aa: 1bb: tasks:- name: task1debug: msg="111"when: aa is undefined- name: task2debug: msg="222"when: bb is undefined- name: task3debug: msg="333"when: cc is not defined
[blab@node01 demo3]$
首先定义了两个变量:aa和 bb,其中bb的值为空,此处并没有定义cc。后面定义了以下3个task。
(1)如果aa被定义了,则显示111,这里aa被定义了,所以判断成立,会执行task1。
(2)如果b没有被定义,则显示222,这里bb被定义了,所以判断不成立,不会执行task2。
(3)如果cc没有被定义,则显示333,这里cc没有被定义,所以判断成立,会执行task3。
这里is undefined 和is not defined是一个意思。
查看运行的结果,如下所示。
[blab@node01 demo3]$ ansible-playbook when4.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task1] *******************************************************************
skipping: [node02]TASK [task2] *******************************************************************
skipping: [node02]TASK [task3] *******************************************************************
ok: [node02] => {"msg": "333"
}PLAY RECAP *********************************************************************
node02                     : ok=2    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   [blab@node01 demo3]$
练习:写一个playbook,内容如下
[blab@node01 demo3]$ cat when5.yml 
---
- hosts: node02tasks:- name: 执行一个系统命令shell: "ls /aa.txt"register: aaignore_errors: yes- name: task2fail:  msg="命令执行错了001"when: aa.rc != 0- name: task3debug: msg="OK001"[blab@node01 demo3]$
运行此playbook命令如下
[blab@node01 demo3]$ ansible-playbook when5.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [执行一个系统命令] ****************************************************************
fatal: [node02]: FAILED! => {"changed": true, "cmd": "ls /aa.txt", "delta": "0:00:00.004728", "end": "2023-12-22 10:18:56.684797", "msg": "non-zero return code", "rc": 2, "start": "2023-12-22 10:18:56.680069", "stderr": "ls: 无法访问'/aa.txt': 没有那个文件或目录", "stderr_lines": ["ls: 无法访问'/aa.txt': 没有那个文件或目录"], "stdout": "", "stdout_lines": []}
...ignoringTASK [task2] *******************************************************************
fatal: [node02]: FAILED! => {"changed": false, "msg": "命令执行错了001"}PLAY RECAP *********************************************************************
node02                     : ok=2    changed=1    unreachable=0    failed=1    skipped=0    rescued=0    ignored=1   [blab@node01 demo3]$

2.判断语句block-rescue

        对于when来说,只能做一个判断,成立就执行,不成立就不执行。block和rescue一般同用,类似于shell判断语句中的if-else,在block下面可以包含多个模块,来判断这多个模块是否执行成功了。
block-rescue的用法如下。
1 block :
2     模块 1
3     模块 2
4     模块 3
5 rescue :
6     模块 1
7     模块 2
        先执行 block中的模块1,如果没有报错,则继续执行模块2,如果block中的所有模块都执行成功了,则跳过rescue 中的所有模块,直接执行下一个task中的模块,如图32-1所示
        这里有2个task : task1和 task2,在 task1的block中有3个模块,rescue中有2个模块。如果 block1中的所有模块都正确执行了,则不执行rescue中的模块,直接执行task2。
        如果 block中的任一模块执行失败,block中其他后续的模块都不再执行,然后会跳转执行 rescue 中的模块,如图32-2所示。
        这里block1中的模块1执行完成之后会执行模块2,如果模块2报错,则不会执行模块3,直接跳转到rescue中,执行模块x。rescue中的所有模块全部正确执行完成之后,则执行task2。
如果rescue中的某个模块执行失败,则退出整个playbook,如图32-3所示。
        这里 block中的模块2执行失败,则跳转到rescue中执行模块x,如果模块x执行失败,则退出整个 playbook,即也不会执行task2了。
        如果某个报错模块有 ignore_errors: yes选项,则会忽略此模块的错误,继续执行下一个模块,如图32-4所示。
        这里block中的模块2执行失败了,但是因为加了ignore_errors: yes选项,所以会忽略这个报错模块,继续执行模块3。
练习1:按上面的描述写一个playbook,内容如下。
[blab@node01 demo3]$ cat block1.yml 
---
- hosts: node02tasks:- name: task1block:- name: 11debug: msg="111"- name: 22shell: "ls /aa.txt"- name: 33debug: msg="333"rescue:- name: xxdebug: msg="xxxx"- name: yydebug: msg="yyy"- name: task2debug: msg="zzz"[blab@node01 demo3]$
        这里在task1的block中运行了3个模块,第一个模块可以正确执行,第二个模块是执行一个系统命令ls /aa.txt,但是在server2中是不存在/aa.txt这个文件的,所以这个模块会执行失败。block中的第三个模块不再执行,直接跳转到rescue中的模块。rescue中的2个模块均可正确执行,然后执行task2。
所以,屏幕上会显示1111, xxxx, yyyy, zzzz。运行结果如下。
[blab@node01 demo3]$ ansible-playbook block1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [debug] *******************************************************************
ok: [node02] => {"msg": "111"
}TASK [shell] *******************************************************************
fatal: [node02]: FAILED! => {"changed": true, "cmd": "ls /aa.txt", "delta": "0:00:00.006491", "end": "2023-12-22 10:51:59.038337", "msg": "non-zero return code", "rc": 2, "start": "2023-12-22 10:51:59.031846", "stderr": "ls: 无法访问'/aa.txt': 没有那个文件或目录", "stderr_lines": ["ls: 无法访问'/aa.txt': 没有那个文件或目录"], "stdout": "", "stdout_lines": []}TASK [xx] **********************************************************************
ok: [node02] => {"msg": "xxxx"
}TASK [yy] **********************************************************************
ok: [node02] => {"msg": "yyy"
}TASK [task2] *******************************************************************
ok: [node02] => {"msg": "zzz"
}PLAY RECAP *********************************************************************
node02                     : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   [blab@node01 demo3]$
练习2: 修改block1.yml的内容如下。
[blab@node01 demo3]$ cat block1.yml 
---
- hosts: node02tasks:- name: task1block:- name: 11debug: msg="111"- name: 22shell: "ls /aa.txt"ignore_errors: yes        //增加内容- name: 33debug: msg="333"rescue:- name: xxdebug: msg="xxxx"- name: yydebug: msg="yyy"- name: task2debug: msg="zzz"[blab@node01 demo3]$
        与上面的例子相比,在 block的第二个模块中增加了一个 ignore_errors: yes选项,这样block中的第二个模块即使报错了,也会忽略这个报错继续执行第三个模块。然后执行task2,所以屏幕上会显示1111,3333,zzzz。运行结果如下。
[blab@node01 demo3]$ ansible-playbook block1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [debug] *******************************************************************
ok: [node02] => {"msg": "111"
}TASK [shell] *******************************************************************
fatal: [node02]: FAILED! => {"changed": true, "cmd": "ls /aa.txt", "delta": "0:00:00.003277", "end": "2023-12-22 10:55:41.477248", "msg": "non-zero return code", "rc": 2, "start": "2023-12-22 10:55:41.473971", "stderr": "ls: 无法访问'/aa.txt': 没有那个文件或目录", "stderr_lines": ["ls: 无法访问'/aa.txt': 没有那个文件或目录"], "stdout": "", "stdout_lines": []}
...ignoringTASK [debug] *******************************************************************
ok: [node02] => {"msg": "333"
}PLAY RECAP *********************************************************************
node02                     : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1   [blab@node01 demo3]$ 

3.循环语句

在shell中 for循环的用法如下。
1 for i in A B C ... ; do
2 命令 $
3 done
        这里首先把A赋值给i,执行do和done之间的命令;然后把B赋值给i,执行do和 done之间的命令,以此类推,直到把in后面所有的值执行完毕。for后面的变量可以随便命名。
再回顾一下前面介绍的列表,如下所示。
employee:‐ uname: lisiage: 22sex: man‐ uname: wangwuage: 24sex: man‐ uname: xiaohuaage: 21
        这里列表employee中有3个元素,分别记录了lisi、wangwu、xiaohua的信息。我们把这3个元素当成刚讲的for循环中的A、B、C。先把第一个元素赋值给变量,执行某个操作,完成之后再把第二个元素赋值给变量。
        用for循环A、B、C,在playbook中用loop来循环列表中的元素。在for循环中,指定一个变量如i,然后分别把A、B、C赋值给i。
        在loop中,使用一个固定的变量 item,然后把每个元素赋值给item,如图32-5所示。第二次循环,如图32-6所示。
练习1:定义一个列表users,然后循环这个列表中的每个元素,命令如下。
[blab@node01 demo3]$ cat loop1.yml 
---
- hosts: node02vars:users:- uname: tomage: 20sex: man- uname: bobage: 22sex: man- uname: maryage: 19sex: womantasks:- name: task1debug: msg={{item}}loop: "{{users}}"
[blab@node01 demo3]$
        这里定义了一个列表users,里面包含了3个用户的信息,在taskl中用loop开始循环这个列表。loop后面写列表名时,需要使用引号引起来,这里的关键字loop可以换成关键字 with_items
        这里首先把users的第一个元素赋值给item,用debug 打印;然后把users的第二个元素赋值给item,用 debug打印,直到把所有的元素都赋值给 item。
运行此 playbook,命令如下。
[blab@node01 demo3]$ ansible-playbook loop1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task1] *******************************************************************
ok: [node02] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {"msg": {"age": 20,"sex": "man","uname": "tom"}
}
ok: [node02] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {"msg": {"age": 22,"sex": "man","uname": "bob"}
}
ok: [node02] => (item={'uname': 'mary', 'age': 19, 'sex': 'woman'}) => {"msg": {"age": 19,"sex": "woman","uname": "mary"}
}PLAY RECAP *********************************************************************
node02                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [blab@node01 demo3]$
如果不想打印每个元素的所有条目,只想打印每个元素的uname呢?答案:可以通过练习2 解决
练习2:修改loop1.yml的内容如下。
[blab@node01 demo3]$ cat loop1.yml 
---
- hosts: node02vars:users:- uname: tomage: 20sex: man- uname: bobage: 22sex: man- uname: maryage: 19sex: womantasks:- name: task1debug: msg={{item.uname}}        //增加内容loop: "{{users}}"
[blab@node01 demo3]$ 
        列表的每个元素都是一个字典,所以 item就是字典,要获取这个字典中的uname变量,用 item.uname即可。
运行此 playbook
[blab@node01 demo3]$ ansible-playbook loop1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task1] *******************************************************************
ok: [node02] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {"msg": "tom"
}
ok: [node02] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {"msg": "bob"
}
ok: [node02] => (item={'uname': 'mary', 'age': 19, 'sex': 'woman'}) => {"msg": "mary"
}PLAY RECAP *********************************************************************
node02                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [blab@node01 demo3]$
练习3:如果想打印所有性别为男的那些用户名,修改loop1.yml 。
[blab@node01 demo3]$ cat loop1.yml 
---
- hosts: node02vars:users:- uname: tomage: 20sex: man- uname: bobage: 22sex: man- uname: maryage: 19sex: womantasks:- name: task1debug: msg={{item.uname}}when: item.sex == "man"        //增加条件loop: "{{users}}"
[blab@node01 demo3]$
        在此playbook中,我们用when加了一个判断。循环列表时,首先把第一个元素赋值给item,然后判断item.sex的值是否为man,如果是则判断成立,执行debug模块;如果不是则判断不成立,不执行debug模块。
        第一次循环结束之后,开始第二次循环,把第二个元素赋值给item之后,做相同的判断。运行此 playbook,命令如下。
[blab@node01 demo3]$ ansible-playbook loop1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [task1] *******************************************************************
ok: [node02] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {"msg": "tom"
}
ok: [node02] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {"msg": "bob"
}
skipping: [node02] => (item={'uname': 'mary', 'age': 19, 'sex': 'woman'}) PLAY RECAP *********************************************************************
node02                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [blab@node01 demo3]$
这样就把所有性别为男的用户名打印出来了。

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

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

相关文章

Epson爱普生手臂机器人与PC通讯 C#

一、Epson手臂配置 1.安装Epson手臂控制软件 安装Epson手臂控制软体EPSON RC+ 7.0(根据实际需求下载应用),可以去官网下载安装。 2.硬件配置 准备一台PC,用网线连接PC和EPSON手臂控制器。 3.在PC上修改IP地址 EPSON手臂默认IP(192.168.0.1),PC IP改为手臂同一网段…

XML简介 (EXtensible Markup Language)

XML简介 (EXtensible Markup Language) 可扩展标记语言 特点 XML与操作系统、编程语言的开发平台无关实现不同系统之间的数据交换 作用 数据交互配置应用程序和网站Ajax基石 XML标签 XML文档内容由一系列标签元素组成 <元素名 属性名"属性值">元素内容&l…

【模式识别】探秘判别奥秘:Fisher线性判别算法的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《模式之谜 | 数据奇迹解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f30c;1 初识模式识…

如何通过蓝牙串口启动智能物联网?

1、低功耗蓝牙(BLE)介绍 BLE 技术是一种低成本、短距离、可互操作的鲁棒性无线技术&#xff0c;工作在免许可的 2,4 GHZ 工业、科学、医学(Industrial Scientific Medical&#xff0c;ISM)频段。BLE在设计之初便被定位为一种超低功耗(Ultra Low Power&#xff0c;ULP)无线技术&…

C语言实现UCS2、UTF8与GBK2312编码转换

一、引言 在软件开发中&#xff0c;字符编码是一个非常重要的概念。不同的编码方式用于在不同的系统和应用中表示文本数据。UCS2、UTF8和GBK2312是三种常见的字符编码方式。为了实现不同编码间的转换&#xff0c;我们可以使用C语言进行编程&#xff0c;利用已有的库或者手动实…

浅谈Guava Cache的参数使用

CacheLoader 用于数据加载方式比较固定且统一的场景&#xff0c;在缓存容器创建的时候就需要指定此具体的加载逻辑。通常开发中使用时我们需要继承CacheLoader类或写一个匿名实现类实现其load方法和reload方法 load方法 当执行get操作没有命中缓存或者判断缓存已经超出expir…

【Prometheus|报错】Out of bounds

【背景】进入Prometheus地址的9090端口&#xff0c;pushgateway&#xff08;0/1&#xff09;error : out of bounds 【排查分析】 1、out of bounds报错&#xff0c;是由于Prometheus向tsdb存数据出错&#xff0c;与最新存数据的时间序列有问题&#xff0c;有可能当前时间与最…

「微服务模式」七种微服务反模式

什么是微服务 流行语经常为进化的概念提供背景&#xff0c;并且需要一个良好的“标签”来促进对话。微服务是一个新的“标签”&#xff0c;它定义了我个人一直在发现和使用的领域。文章和会议描述了一些事情&#xff0c;我慢慢意识到&#xff0c;过去几年我一直在发展自己的个人…

Ignite数据流处理

数据流处理 #1.概述 Ignite提供了一个数据流API&#xff0c;可用于将大量连续的数据流注入Ignite集群&#xff0c;数据流API支持容错和线性扩展&#xff0c;并为注入Ignite的数据提供了至少一次保证&#xff0c;这意味着每个条目至少会被处理一次。 数据通过与缓存关联的数据…

【Linux】归档和备份

简介 计算机系统管理员的一个主要任务就是保护系统的数据安全&#xff0c;其中一种方法是通过时时备份系 统文件&#xff0c;来保护数据。即使你不是一名系统管理员&#xff0c;也经常会处理大量文件&#xff0c;在这里我们看看常见的管理文件集合命令。 压缩命令&#xff1a…

基于Spring自动注入快速实现策略模式+工厂模式优化过多的if..else

一、策略模式 1.1策略模式定义 在策略模式&#xff08;Strategy Pattern&#xff09;中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式定义了一系列算法或策略&#xff0c;并将每个算法封装在独立的类中&#xff0c;使得它们可以互相…

web网页端使用webSocket实现语音通话功能(SpringBoot+VUE)

写在前面 最近在写一个web项目&#xff0c;需要实现web客户端之间的语音通话&#xff0c;期望能够借助webSocket全双工通信的方式来实现&#xff0c;但是网上没有发现可以正确使用的代码。网上能找到的一个代码使用之后只能听到“嘀嘀嘀”的杂音 解决方案&#xff1a;使用Jso…

中级软件设计师-note-3

又一个逆向思维的例子是“有两个年轻人&#xff0c;追同一个女孩子。第一个年轻人用了4000块&#xff1a;花3500块给女孩子买了一个手机&#xff0c;剩下的500块准备用作吃饭和玩的&#xff0c;然后他骑着共享单车去找女孩子&#xff0c;女孩子直接就给拒绝了&#xff0c;说&am…

算法练习Day19 (Leetcode/Python-二叉树)

108. Convert Sorted Array to Binary Search Tree Given an integer array nums where the elements are sorted in ascending order, convert it to a height-balanced binary search tree. 思路&#xff1a; 一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的…

RSA 加密方案

RSA 算法 RSA 加密和签名&#xff1a;因大整数因子分解难算&#xff0c;合数可成公钥。 d - 私钥&#xff0c;e - 公钥&#xff0c;n - 可公开的合数&#xff0c;(e,n) 作为公钥可以公开&#xff0c;(d,n) 作为私钥。 详细理论证明参考&#xff1a;RSA算法原理&#xff08;二…

3.[BUU]warmup_csaw_20161

1.checksec 检查文件类型 ELF-64-little &#xff0c;无其他限权&#xff0c;直接用ida检查代码。 2.IDA进行反编译&#xff0c;进行代码审计 查看各个名称的内容&#xff1a; 了解基本攻击思路&#xff1a; 攻击思路&#xff1a;gets输入垃圾数据覆盖v5内容&#xff0c;再将s…

51单片机的羽毛球计分器系统【含proteus仿真+程序+报告+原理图】

1、主要功能 该系统由AT89C51单片机LCD1602显示模块按键等模块构成。适用于羽毛球计分、乒乓球计分、篮球计分等相似项目。 可实现基本功能: 1、LCD1602液晶屏实时显示比赛信息 2、按键控制比赛的开始、暂停和结束&#xff0c;以及两位选手分数的加减。 本项目同时包含器件清…

Ubuntu 常用命令之 fdisk 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 fdisk 是一个用于处理磁盘分区的命令行工具&#xff0c;它在 Linux 系统中广泛使用。fdisk 命令可以创建、删除、更改、复制和显示硬盘分区&#xff0c;以及更改硬盘的分区 ID。 fdisk 命令的常用参数如下 -l&#xff1a;列出所…

【基于激光雷达的路沿检测用于自动驾驶的真值标注】

文章目录 概要主要贡献内容概述实验小结 概要 论文地址&#xff1a;https://arxiv.org/pdf/2312.00534.pdf 路沿检测在自动驾驶中扮演着重要的角色&#xff0c;因为它能够帮助车辆感知道可行驶区域和不可行驶区域。为了开发和验证自动驾驶功能&#xff0c;标注的数据是必不可…

Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类

目录 前言 1 电能质量数据集制作与加载 1.1 导入数据 1.2 制作数据集 2 CNN-2D分类模型和训练、评估 2.1 定义CNN-2d分类模型 2.2 定义模型参数 2.3 模型结构 2.4 模型训练 2.5 模型评估 3 CNN-1D分类模型和训练、评估 3.1 定义CNN-1d分类模型 3.2 定义模型参数 …