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.优化目的…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...
