Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
本篇文章详细给大家介绍Ansible变量,变量适合管理剧本中每个项目的动态值,或是某些值在多个地方重复使用,如果将此值设置为变量再在其他地方调用会方便许多。会用变量,才算真正会用Ansible,话不多说,直接开始。
1.变量定义
在测试情况下,可以在命令行中定义变量;当变量较少,不会被其他剧本调用的情况下,可以在剧本头部进行定义;当有较多playbook调用时,可以在文件中定义变量;也可以通过主机清单中定义变量,但是一般不推荐;也可以采取官方推荐的定义方式。一共四种定义方式。
(1)命令行定义变量
主机清单的变量会被剧本文件的方式覆盖,这两种方式的变量又会被命令行定义的方式覆盖,命令行可以使用--extra-vars或者-e设置变量。
[root@Ansible test]# cat test.yml
- hosts: web_grouptasks:- name: install httpd serveryum:name: "{{ web_server }}"
[root@Ansible test]# ansible-playbook test.yml -e "web_server=vsftpd" #定义变量并运行[root@Ansible test]# cat test.yml
- hosts: web_grouptasks:- name: install httpd serveryum:name: - "{{ web_server }}"- "{{ db_server }}"
[root@Ansible test]# ansible-play test.yml -e "web_server=vsftpd" -e "db_server=mariadb-server" #定义多个变量并运行
(2)剧本头部进行定义
#1、将一个列表定义在一个变量中
[root@Ansible test]# cat test.yml
- hosts: web_groupvars:packages:- httpd- mariadb-server- php- php-mysql- php-pdotasks:- name: install httpd ....yum: name: "{{ packages }}"#2、以列表的形式,一个内容定义一个变量
[root@Ansible test]# cat test.yml
- hosts: web_groupvars:- web_server: httpd- db_server: mariadb-server- php_server: php,php-mysql,php-pdotasks:- name: install httpd ....yum: name: - "{{ web_server }}"- "{{ db_server }}"- "{{ php_server }}"#3、以列表形式,多个内容由多个变量定义,最后拼接调用
[root@Ansible test]# cat test.yml
- hosts: web_groupvars:- ngx_ver: 1.1- ngx_dir: webtasks:- name: touchfile: name: /tmp/{{ ngx_dir }}_{{ ngx_ver }}state: touch#获取并调用Ansible内置变量
[root@Ansible test]# cat test.yml
- hosts: web_groupvars: - remote_ip: "{{ ansible_default_ipv4['address'] }}"- remote_hostname: "{{ ansible_fqdn }}"tasks:- name: touch ip filefile:path: /root/{{ remote_ip }}state: touch- name: touch hostname filefile:path: /root/{{ remote_hostname }}state: touch
(3)文件中定义变量
剧本头部定义变量的缺陷是只能当前变量使用,其他文件无法调用该变量文件,我们可以在文件中定义变量解决这个问题。
[root@Ansible test]# cat vars1.yml
web_server: httpd
[root@Ansible test]# cat vars2.yml
db_server: mariadb-server
[root@Ansible test]# cat test.yml #调用一个文件一个变量
- hosts: web_groupvars_files: vars1.ymltasks:- name: install httpd mariadbyum:name: "{{ web_server }}" [root@Ansible test]# cat test.yml #调用多个文件多个变量
- hosts: web_groupvars_files: - vars1.yml- vars2.ymltasks:- name: install httpd mariadbyum:name: - "{{ web_server }}"- "{{ db_server }}"
(4)主机清单定义变量
在主机清单中定义变量,主机的变量要高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱。
[root@Ansible test]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[web_group:vars]
web_server=httpd
index_file=index.html- hosts: web_grouptasks:- name: Install httpd Serveryum:name: "{{ web_server }}"- name: Create Index Filefile:path: /tmp/{{ index_file }}state: touch
(5)官方推荐定义变量
创建group_vars目录,在里面创建以组名命名的文件给组定义变量,想对所有主机进行定义使用组下面的all进行定义。
[root@Ansible test]# mkdir group_vars
[root@Ansible test]# cat group_vars/web_group
web_server: httpd
[root@Ansible test]# cat test.yml
- hosts: web_grouptasks:- name: install httpd serveryum:name: "{{ web_server }}"
创建host_vars目录,在里面创建以主机别名命名的文件给主机定义变量。
[root@Ansible test]# mkdir host_vars
[root@Ansible test]# cat host_vars/web01
web_server: nginx
[root@Ansible test]# cat test.yml
- hosts: web_grouptasks:- name: install httpd serveryum:name: "{{ web_server }}"
2.变量优先级
变量读取优先级命令行>playbook文件>主机列表文件注意:尽量使用一种定义变量的方式进行定义,太乱了不容易操作
3.变量注册
Ansible模块运行时,都会返回一些result结果,类似于执行脚本,我们需要获取这些结果,判断上一步是否执行成功,默认情况下,Ansible的result并不会显示出来,所以,我们可以吧这些返回值储存到变量之中,通过调用对应的变量名,获取这些result。这种将模块的返回值写入到变量的方法叫做变量注册。
[root@Ansible test]# cat test.yml
- hosts: web_grouptasks:- name: test register varsshell: "ls -l /"
[root@Ansible test]# ansible-playbook test.yml PLAY [web_group] ***************************************************************TASK [Gathering Facts] *********************************************************
ok: [web01]
ok: [web02]TASK [test register vars] ******************************************************
changed: [web02]
changed: [web01]PLAY RECAP *********************************************************************
web01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
当我们执行这个命令时,并不会给我们返回结果,只会返回changed是否改变,这时我们使用变量注册。
[root@Ansible test]# cat test.yml
- hosts: web_grouptasks:- name: test register varsshell: "ls -l /"register: list_dir- name: return resultdebug:msg: "{{ list_dir }}" [root@Ansible test]# ansible-playbook test.ymlPLAY [web_group] ***************************************************************TASK [Gathering Facts] *********************************************************
ok: [web01]
ok: [web02]TASK [test register vars] ******************************************************
changed: [web02]
changed: [web01]TASK [return result] ***********************************************************
ok: [web01] => {"msg": {"changed": true, "cmd": "ls -l /", "delta": "0:00:00.073085", "end": "2023-04-19 17:30:57.892956", "failed": false, "rc": 0, "start": "2023-04-19 17:30:57.819871", "stderr": "", "stderr_lines": [], "stdout": "total 24\nlrwxrwxrwx. 1 root root 7 Mar 29 18:30 bin -> usr/bin\ndr-xr-xr-x. 5 root root 4096 Mar 29 18:41 boot\ndrwxr-xr-x 6 www www 71 Apr 19 08:29 code\ndrwxr-xr-x 19 root root 3200 Apr 18 22:37 dev\ndrwxr-xr-x. 90 root root 8192 Apr 19 17:20 etc\ndrwxr-xr-x. 2 root root 6 Apr 11 2018 home\nlrwxrwxrwx. 1 root root 7 Mar 29 18:30 lib -> usr/lib\nlrwxrwxrwx. 1 root root 9 Mar 29 18:30 lib64 -> usr/lib64\ndrwxr-xr-x. 2 root root 6 Apr 11 2018 media\ndrwxr-xr-x. 2 root root 6 Apr 11 2018 mnt\ndrwxr-xr-x. 2 root root 6 Apr 11 2018 opt\ndr-xr-xr-x 128 root root 0 Mar 30 20:56 proc\ndr-xr-x---. 5 root root 197 Apr 19 16:25 root\ndrwxr-xr-x 29 root root 740 Apr 19 17:20 run\nlrwxrwxrwx. 1 root root 8 Mar 29 18:30 sbin -> usr/sbin\ndrwxr-xr-x. 2 root root 6 Apr 11 2018 srv\ndr-xr-xr-x 13 root root 0 Apr 19 17:28 sys\ndrwxrwxrwt. 11 root root 4096 Apr 19 17:30 tmp\ndrwxr-xr-x. 13 root root 155 Mar 29 18:30 usr\ndrwxr-xr-x. 21 root root 4096 Apr 19 17:20 var", "stdout_lines": ["total 24", "lrwxrwxrwx. 1 root root 7 Mar 29 18:30 bin -> usr/bin", "dr-xr-xr-x. 5 root root 4096 Mar 29 18:41 boot", "drwxr-xr-x 6 www www 71 Apr 19 08:29 code", "drwxr-xr-x 19 root root 3200 Apr 18 22:37 dev", "drwxr-xr-x. 90 root root 8192 Apr 19 17:20 etc", "drwxr-xr-x. 2 root root 6 Apr 11 2018 home", "lrwxrwxrwx. 1 root root 7 Mar 29 18:30 lib -> usr/lib", "lrwxrwxrwx. 1 root root 9 Mar 29 18:30 lib64 -> usr/lib64", "drwxr-xr-x. 2 root root 6 Apr 11 2018 media", "drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt", "drwxr-xr-x. 2 root root 6 Apr 11 2018 opt", "dr-xr-xr-x 128 root root 0 Mar 30 20:56 proc", "dr-xr-x---. 5 root root 197 Apr 19 16:25 root", "drwxr-xr-x 29 root root 740 Apr 19 17:20 run", "lrwxrwxrwx. 1 root root 8 Mar 29 18:30 sbin -> usr/sbin", "drwxr-xr-x. 2 root root 6 Apr 11 2018 srv", "dr-xr-xr-x 13 root root 0 Apr 19 17:28 sys", "drwxrwxrwt. 11 root root 4096 Apr 19 17:30 tmp", "drwxr-xr-x. 13 root root 155 Mar 29 18:30 usr", "drwxr-xr-x. 21 root root 4096 Apr 19 17:20 var"]}
}
ok: [web02] => {"msg": {"changed": true, "cmd": "ls -l /", "delta": "0:00:00.072887", "end": "2023-04-19 17:30:57.891135", "failed": false, "rc": 0, "start": "2023-04-19 17:30:57.818248", "stderr": "", "stderr_lines": [], "stdout": "total 28\nlrwxrwxrwx. 1 root root 7 Mar 29 18:30 bin -> usr/bin\ndr-xr-xr-x. 5 root root 4096 Mar 29 18:41 boot\ndrwxr-xr-x 6 www www 71 Apr 19 08:29 code\ndrwxr-xr-x 19 root root 3200 Apr 18 22:37 dev\ndrwxr-xr-x. 90 root root 8192 Apr 19 17:20 etc\ndrwxr-xr-x. 2 root root 6 Apr 11 2018 home\nlrwxrwxrwx. 1 root root 7 Mar 29 18:30 lib -> usr/lib\nlrwxrwxrwx. 1 root root 9 Mar 29 18:30 lib64 -> usr/lib64\ndrwxr-xr-x. 2 root root 6 Apr 11 2018 media\ndrwxr-xr-x. 2 root root 6 Apr 11 2018 mnt\ndrwxr-xr-x. 2 root root 6 Apr 11 2018 opt\ndr-xr-xr-x 127 root root 0 Mar 30 20:56 proc\ndr-xr-x---. 5 root root 4096 Apr 19 16:25 root\ndrwxr-xr-x 29 root root 740 Apr 19 17:20 run\nlrwxrwxrwx. 1 root root 8 Mar 29 18:30 sbin -> usr/sbin\ndrwxr-xr-x. 2 root root 6 Apr 11 2018 srv\ndr-xr-xr-x 13 root root 0 Apr 19 17:28 sys\ndrwxrwxrwt. 10 root root 4096 Apr 19 17:30 tmp\ndrwxr-xr-x. 13 root root 155 Mar 29 18:30 usr\ndrwxr-xr-x. 21 root root 4096 Apr 19 17:20 var", "stdout_lines": ["total 28", "lrwxrwxrwx. 1 root root 7 Mar 29 18:30 bin -> usr/bin", "dr-xr-xr-x. 5 root root 4096 Mar 29 18:41 boot", "drwxr-xr-x 6 www www 71 Apr 19 08:29 code", "drwxr-xr-x 19 root root 3200 Apr 18 22:37 dev", "drwxr-xr-x. 90 root root 8192 Apr 19 17:20 etc", "drwxr-xr-x. 2 root root 6 Apr 11 2018 home", "lrwxrwxrwx. 1 root root 7 Mar 29 18:30 lib -> usr/lib", "lrwxrwxrwx. 1 root root 9 Mar 29 18:30 lib64 -> usr/lib64", "drwxr-xr-x. 2 root root 6 Apr 11 2018 media", "drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt", "drwxr-xr-x. 2 root root 6 Apr 11 2018 opt", "dr-xr-xr-x 127 root root 0 Mar 30 20:56 proc", "dr-xr-x---. 5 root root 4096 Apr 19 16:25 root", "drwxr-xr-x 29 root root 740 Apr 19 17:20 run", "lrwxrwxrwx. 1 root root 8 Mar 29 18:30 sbin -> usr/sbin", "drwxr-xr-x. 2 root root 6 Apr 11 2018 srv", "dr-xr-xr-x 13 root root 0 Apr 19 17:28 sys", "drwxrwxrwt. 10 root root 4096 Apr 19 17:30 tmp", "drwxr-xr-x. 13 root root 155 Mar 29 18:30 usr", "drwxr-xr-x. 21 root root 4096 Apr 19 17:20 var"]}
}PLAY RECAP *********************************************************************
web01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
内容很多,我们让其输入自己想要的内容。
[root@Ansible test]# cat test.yml
- hosts: web_grouptasks:- name: test register varsshell: "ls -l /"register: list_dir- name: return resultdebug:msg: "{{ list_dir.stdout_lines }}"
[root@Ansible test]# ansible-playbook test.yml PLAY [web_group] ***************************************************************TASK [Gathering Facts] *********************************************************
ok: [web02]
ok: [web01]TASK [test register vars] ******************************************************
changed: [web02]
changed: [web01]TASK [return result] ***********************************************************
ok: [web01] => {"msg": ["total 24", "lrwxrwxrwx. 1 root root 7 Mar 29 18:30 bin -> usr/bin", "dr-xr-xr-x. 5 root root 4096 Mar 29 18:41 boot", "drwxr-xr-x 6 www www 71 Apr 19 08:29 code", "drwxr-xr-x 19 root root 3200 Apr 18 22:37 dev", "drwxr-xr-x. 90 root root 8192 Apr 19 17:20 etc", "drwxr-xr-x. 2 root root 6 Apr 11 2018 home", "lrwxrwxrwx. 1 root root 7 Mar 29 18:30 lib -> usr/lib", "lrwxrwxrwx. 1 root root 9 Mar 29 18:30 lib64 -> usr/lib64", "drwxr-xr-x. 2 root root 6 Apr 11 2018 media", "drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt", "drwxr-xr-x. 2 root root 6 Apr 11 2018 opt", "dr-xr-xr-x 129 root root 0 Mar 30 20:56 proc", "dr-xr-x---. 5 root root 197 Apr 19 16:25 root", "drwxr-xr-x 29 root root 740 Apr 19 17:20 run", "lrwxrwxrwx. 1 root root 8 Mar 29 18:30 sbin -> usr/sbin", "drwxr-xr-x. 2 root root 6 Apr 11 2018 srv", "dr-xr-xr-x 13 root root 0 Apr 19 17:28 sys", "drwxrwxrwt. 11 root root 4096 Apr 19 17:34 tmp", "drwxr-xr-x. 13 root root 155 Mar 29 18:30 usr", "drwxr-xr-x. 21 root root 4096 Apr 19 17:20 var"]
}
ok: [web02] => {"msg": ["total 28", "lrwxrwxrwx. 1 root root 7 Mar 29 18:30 bin -> usr/bin", "dr-xr-xr-x. 5 root root 4096 Mar 29 18:41 boot", "drwxr-xr-x 6 www www 71 Apr 19 08:29 code", "drwxr-xr-x 19 root root 3200 Apr 18 22:37 dev", "drwxr-xr-x. 90 root root 8192 Apr 19 17:20 etc", "drwxr-xr-x. 2 root root 6 Apr 11 2018 home", "lrwxrwxrwx. 1 root root 7 Mar 29 18:30 lib -> usr/lib", "lrwxrwxrwx. 1 root root 9 Mar 29 18:30 lib64 -> usr/lib64", "drwxr-xr-x. 2 root root 6 Apr 11 2018 media", "drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt", "drwxr-xr-x. 2 root root 6 Apr 11 2018 opt", "dr-xr-xr-x 127 root root 0 Mar 30 20:56 proc", "dr-xr-x---. 5 root root 4096 Apr 19 16:25 root", "drwxr-xr-x 29 root root 740 Apr 19 17:20 run", "lrwxrwxrwx. 1 root root 8 Mar 29 18:30 sbin -> usr/sbin", "drwxr-xr-x. 2 root root 6 Apr 11 2018 srv", "dr-xr-xr-x 13 root root 0 Apr 19 17:28 sys", "drwxrwxrwt. 10 root root 4096 Apr 19 17:34 tmp", "drwxr-xr-x. 13 root root 155 Mar 29 18:30 usr", "drwxr-xr-x. 21 root root 4096 Apr 19 17:20 var"]
}PLAY RECAP *********************************************************************
web01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
debug模块常用参数
msg #调试输出的消息
var #将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity #debug的级别(默认是0,全部显示)
4.层级定义变量
(1)编辑变量文件
[root@Ansible test]# cat vars_file.yml
lamp:framework:web_package: httpddb_package: mariadb-serverphp_package: phplnmp:framework:web_package: nginxdb_package: mysqlphp_package: phplnmt:framework:web_package: nginxdb_package: mysqljava_package: tomcat
(2)编辑剧本文件
#简单写法
[root@Ansible test]# cat test.yml
- hosts: web_groupvars_files: vars_file.ymltasks:- name: install lamp httpdyum:name: "{{ lamp.framework.web_package }}"- name: install lamp mariadb-serveryum:name: "{{ lamp.framework.db_package }}"- name: install lamp phpyum:name: "{{ lamp.framework.php_package }}"#官方推荐写法
[root@Ansible test]# cat test.yml
- hosts: web_groupvars_files: vars_file.ymltasks:- name: install lamp httpdyum:name: "{{ lamp['framework']['web_package'] }}"- name: install lamp mariadb-serveryum:name: "{{ lamp['framework']['db_package'] }}"- name: install lamp phpyum:name: "{{ lamp['framework']['php_package'] }}"
(3)执行剧本
[root@Ansible test]# ansible-playbook test.yml PLAY [web_group] ***************************************************************TASK [Gathering Facts] *********************************************************
ok: [web01]
ok: [web02]TASK [install lamp httpd] ******************************************************
ok: [web01]
ok: [web02]TASK [install lamp mariadb-server] *********************************************
ok: [web01]
ok: [web02]TASK [install lamp php] ********************************************************
ok: [web01]
ok: [web02]PLAY RECAP *********************************************************************
web01 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
5.facts缓存变量
Ansible facts是在客户端主机通过Ansible自动采集发现的变量,facts包含每台特定的主机信息,如被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。
(1)fasts使用场景
1、通过facts缓存检查CPU,来生成对应的nginx配置文件2、通过facts缓存检查主机名,生成不同的zabbix配置文件3、通过facts缓存检索物理机的内存大小来生成不同的mysql配置文件Ansible facts类似于saltstack中的grains,对于做自动化非常有帮助!
(2)fasts用法
[root@Ansible test]# cat test.yml
- hosts: web_groupvars_files: vars_file.ymltasks:- name: get host infodebug:msg: Hostname "{{ ansible_fqdn }}" and IP "{{ an
sible_default_ipv4.address }}"[root@Ansible test]# ansible-playbook test.yml PLAY [web_group] ***************************************************************TASK [Gathering Facts] *********************************************************
ok: [web01]
ok: [web02]TASK [get host info] ***********************************************************
ok: [web01] => {"msg": "Hostname \"Web01\" and IP \"10.0.0.7\""
}
ok: [web02] => {"msg": "Hostname \"Web02\" and IP \"10.0.0.8\""
}PLAY RECAP *********************************************************************
web01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
(3)关闭fasts
[root@Ansible test]# cat test.yml
- hosts: web_groupgather_facts: no #关闭信息采集vars_files: vars_file.ymltasks:- name: get host infodebug:msg: Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"
(4)fasts生成zabbix配置文件
[root@Ansible test]# cat test.yml
- hosts: web_groupvars: - zabbix_server: 172.16.1.71tasks:- name: copy zabbix agent conftemplate: #作用是将管理机上的变量内容覆盖到客户机的目标配置文件中src: ./zabbix_agentd.confdest: /tmp/zabbix_agentd.conf
(5)facts生成mysqld配置文件
- hosts: db_grouptasks:- name: Install mysql serveryum:name: mariadb-serverstate: present- name: copy mysql conftemplate: #作用是将管理机上的变量内容覆盖到客户机的目标配置文件中src: ./my.cnfdest: /etc/my.cnf[root@m01 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
log_error=/var/log/mariadb/mariadb.log
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}
相关文章:
Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
本篇文章详细给大家介绍Ansible变量,变量适合管理剧本中每个项目的动态值,或是某些值在多个地方重复使用,如果将此值设置为变量再在其他地方调用会方便许多。会用变量,才算真正会用Ansible,话不多说,直接开…...
面向对象系统的分析和设计
来源:《设计模式精解-GOF23种设计模式解析》 作者:k_eckel k_eckels mindview - 博客园 (cnblogs.com) --------- 面向对象系统的分析和设计实际上追求的就是两点: (1)高内聚 (2)低耦合 …...

Vue 提供了Transition,可以帮助你制作基于状态变化的过渡和动画
官方文档:https://cn.vuejs.org/guide/built-ins/transition.html Transition Vue 提供了两个内置组件,可以帮助你制作基于状态变化的过渡和动画: <Transition> 会在一个元素或组件进入和离开 DOM 时应用动画。本章节会介绍如何使用…...

视频编辑技术:一键生成混剪视频的AI技术应用
随着视频内容的爆炸式增长,视频编辑技术也在不断进步。本文将探讨如何利用AI技术,实现一键生成混剪视频,并自动添加配音和字幕,以提高视频编辑的效率和质量。 AI技术在视频编辑中的应用 AI技术在视频编辑领域的应用越来越广泛&am…...
Android11 MTK 开机默认启动热点
1、需求:开机后不锁屏,默认打开热点,且长时间没有设备连接热点时保证热点也是打开的。 2、开机后不锁屏: 路径:vendor/mediatek/proprietary/packages/apps/SettingsProvider/res/values/defaults.xml<bool name&q…...

Vue Web开发(二)
1. 项目搭建 1.1. 首页架子搭建 使用Element ui中的Container布局容器,选择倒数第二个样式,将代码复制到Home.vue。 1.1.1.下载less (1)下载less样式 npm i less (2)下载less编辑解析器 npm i less…...

Linux-实用操作
文章目录 一. 各类实用小技巧(快捷键)1. ctrl c 强制停止2. ctrl d 退出登出3. history 查看历史命令4. !命令前缀,自动匹配上一个命令5. ctrl r,搜索历史命令6. ctrl a | e,光标移动到命令开始或结束7. ctrl ← | →,左右跳…...

Elasticsearch:使用 Elastic APM 监控 Android 应用程序
一、前言 人们通过私人和专业的移动应用程序在智能手机上处理越来越多的事情。 拥有成千上万甚至数百万的用户,确保出色的性能和可靠性是移动应用程序和相关后端服务的提供商和运营商面临的主要挑战。 了解移动应用程序的行为、崩溃的发生和类型、响应时间慢的根本…...
Go的简单问题问答
基础问题回答 Go 的主要特点是什么? 简洁:语法简化,减少复杂性。并发:内置 Goroutine 和 Channel,支持轻量级并发。静态类型:强类型语言,编译时检查错误。跨平台:编译生成独立的二进…...

【攻防实验】溯源与取证分析实验
溯源与取证分析实验 溯源取证分析作为网络攻防过程中重要环节,准确找到攻击者的入侵线索(尤其是攻击突破口、攻击IP地址、域名、工具等信息),对于企业或者团队安全运营团队来说都是必备技能。常规攻击取证过程中往往会结合流量、Web访问日志、终端系统或…...
THREE.js 入门(一)xyz坐标系
一、坐标系概念 在 three.js 中,相机的默认朝向是沿着 Z 轴的负方向。也就是说,默认情况下,相机会沿着 Z 轴的负方向“看”到场景中的对象,而 X 轴和 Y 轴分别对应水平方向和垂直方向。换句话说,相机的默认位置是 (0,…...

AUTOSAR CP中基于通信模块(COM)的Transformer-R24的规范导读
该文档是关于 AUTOSAR CP中基于通信模块(COM)的Transformer的规范说明,主要内容包括引言、相关文档、约束与假设、功能规范、API 规范、配置规范等,旨在为汽车电子系统开发中基于 COM 的Transformer提供全面的技术规范和指导。 一…...
ubuntu20.04安装anygrasp_sdk
ubuntu20.04安装anygrasp_sdk采坑记录 安装ME的教程看上一篇,现在来看anygrasp安装问题grasp_detection、grasp_trackinglicense申请demo文件的运行注意的地方到这以为大功告成了,然后出现了一个numpy版本不匹配问题最后还有一个问题就是修改demo.sh,不然没法可视化结果展示安…...

Spring完整知识点二
Spring注解开发 Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,它能够代替xml配置文件,可以简化配置,提高开发效率Spring注解根据出现时间分类 Spring原始注解…...
GESP三级集训——课堂笔记(部分)
进制转换(二进制、十进制、八进制、十六进制等) 十进制(逢十进一)——Decimal 十进制是我们生活中最常见的进制,如“1”“23”“891”等: 进位过程如下:{1,2,3,4,5,6,7,8,9}{10,11,12,13,14,…...
Spring Boot接口返回统一格式
统一的标准数据格式好处 SpringBoot返回统一的标准数据格式主要有以下几点好处: 增强接口的可读性和可维护性,使得前端开发人员能够更加清晰地理解接口返回的数据结构,从而提高开发效率。 降低前后端耦合度,当后端需要修改返回数…...

Flink如何基于数据版本使用最新离线数据
业务场景 假设批量有一张商户表,表字段中有商户名称和商户分类两个字段。 批量需要将最新的商户名称和分类的映射关系推到hbase供实时使用。 原实现方案 a.原方案内容 为解决批量晚批问题,批量推送hbase表时一份数据产生两类rowkey:T-1和…...
软件开发中的常用性能指标
大家好!我是今越。在软件开发中我们经常会遇到一些性能指标,下面就带大家一起来看看。 QPS Queries Per Second,每秒查询率,一台服务器每秒能够响应的查询次数。它是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准…...
cmakelist使用总结
支持能编译成在不同系统上运行程序的方法 我们代码就一份,但有时需要编译成arm32,有时需要编译成x86_64,或更多 1、首先先将代码定义一个名称: #将所有的源文件列为一个集合,集合名字叫做SRC_LISTS set(SRC_LISTS main.cpp A.cpp…...

准备阶段 Unity优化总纲
Unity优化总纲 我们在学习优化课程之前要预先做好准备功能 例如最主要是的接收到一个优化的任务,应该怎么做,其次怎么做,最后怎么做。 也要学习一些专业工具以及专业术语 了解游戏运行机制,在排查期间思路会更清晰 1.优化目的…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...