Ansible定义各类变量,引用变量方式介绍及注册变量和vars_prompt的用法示例
目录
一.Ansible定义变量
1.用途
2.定义规则
3.变量优先级
二.命令行定义变量
三.定义主机和主机组变量
1.主机变量
(1)内置主机变量
(2)简单示例
2.主机组变量
四.定义playbook变量
1.通过vars表示定义变量,通过' "{{变量名}}" '来引用变量
2.通过vars_file指定变量文件
五.定义host_vars和group_vars目录变量
1.主机组变量使用group_vars
2.主机变量只用host_vars
3.以主机变量简单为例演示
六.注册变量
七.vars_prompt交互变量
1.参数解析
2.简单交互案例
3.创建用户和密码示例
(1)encrypt
(2)confirm
八.引用变量
1.引用简单定义的变量
2.引用较为复杂定义的变量
一.Ansible定义变量
1.用途
ansible的变量主要用于存储在整个项目中重复使用的一些值,来提高创建任务和维护节点的效率
2.定义规则
变量名由字母、数字、下划线组成,由字母开头
内置关键字不能作为变量名
3.变量优先级
全局范围内命令行设置的变量>playbook及其相关配置的变量>主机和组清单的变量>ansible.cfg配置文件设置的变量
二.命令行定义变量
如上文所述,命令行使用"-e '变量名=值' "设置的变量优先级最高,下面举例演示命令行变量覆盖playbook中的变量
[root@main ~]# cat abc.yaml
---
- hosts: webserversvars:myservice: httpd #原本playbook内容为停掉httpdtasks:- name: test1service:name: "{{ myservice }}"state: stopped
[root@main ~]# ansible-playbook abc.yaml -e 'myservice=chronyd'
#运行时指定变量更改为关掉chronyd
[root@main ~]# ansible webservers -m shell -a 'systemctl status httpd | grep Active'
serverb | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 14:06:57 CST; 5h 22min ago
servera | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 19:25:46 CST; 3min 12s ago
[root@main ~]# ansible webservers -m shell -a 'systemctl status chronyd | grep Active'
serverb | CHANGED | rc=0 >>Active: inactive (dead) since Tue 2023-10-17 19:28:30 CST; 35s ago
servera | CHANGED | rc=0 >>Active: inactive (dead) since Tue 2023-10-17 19:28:30 CST; 35s ago
#运行结果可以看出,停掉httpd未生效,停chonyd生效,命令行给定变量优先级高于playbook给定变量优先级
三.定义主机和主机组变量
1.主机变量
(1)内置主机变量
在变量前加上"ansible_"即成为内置变量
部分内置主机关于ssh和提权的变量举例
ansible_ssh_host:指定受管节点主机真实IP地址
ansible_ssh_port:指定通过哪个端口连接受管节点
ansible_ssh_user:指定连接时使用的用户名称
ansibe_connection:指定ssh连接类型,local、ssh、paramiko
ansible_ssh_pass:ssh连接时使用的密码
ansible_ssh_executable:指定ssh指定的路径
ansible_become:允许特权升级,等同于ansible_sudo,ansible_su
ansible_become_user:提权到哪个用户,等同于ansible_sudo_user,ansible_su_user
ansbile_become_pass:需要密码时指定密码,等同于ansible_sudo_pass
ansible_sudo_exec:指定sudo命令路径
(2)简单示例
[student@workstation ~]$ vim user.yml
#不属于任何组的用户
192.168.2.190 ansible_ssh_user=root ansible_user_pass='redhat'
192.168.2.191 ansible_ssh_user=root ansible_user_pass='su123'
2.主机组变量
如上例,将两台受管节点相等的部分定义为一个变量
[student@workstation ~]$ vim user.yml
192.168.2.190 ansible_ssh_user=root ansible_user_pass='redhat'
192.168.2.191 ansible_ssh_user=root ansible_user_pass='su123'
#更改为
192.168.2.190 ansible_user_pass='redhat'
192.168.2.191 ansible_user_pass='su123'
[webservers:vars]
ansible_ssh_user=root
四.定义playbook变量
1.通过vars表示定义变量,通过' "{{变量名}}" '来引用变量
[root@localhost ~]# cat httpd.yaml
---
- name: install httpd chronyhosts: webserversvars: #声明在此处定义变量mypackages: #变量名- httpd- chronymyhttpd: httpd mychronyd: chronydtasks:- name: install themyum:name: "{{ mypackages }}" #使用变量state: present- name: start httpdservice:name: "{{ myhttpd }}"state: started- name: start chronydservice:name: "{{ mychronyd }}"state: started
[root@localhost ~]# ansible webservers -m shell -a 'systemctl status httpd | grep Active'
serverb | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 14:06:57 CST; 3min 45s ago
servera | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 14:06:57 CST; 3min 45s ago
[root@localhost ~]# ansible webservers -m shell -a 'systemctl status chronyd | grep Active'
servera | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 13:29:27 CST; 41min ago
serverb | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 13:31:57 CST; 38min ago
2.通过vars_file指定变量文件
[root@main ~]# cat myvar1.yaml #vars文件也使用yaml格式
packages:- rpcbind- openssl[root@main ~]# cat httpd1.yaml
---
- name: install rpcbind opensslhosts: webserverstasks:- name: install themyum:name: "{{ packages }}" #同样这样使用变量state: presentvars_files: #指定vars文件- myvar1.yaml #指定你自己的vars问文件位置,这里是当前路径下的myvars1.yaml文件
[root@main ~]# ansible-playbook httpd1.yaml --syntax-check
playbook: httpd1.yaml
[root@main ~]# ansible-playbook httpd1.yaml
[root@main ~]# ansible webservers -m shell -a 'yum list installed | grep rpcbind'
servera | CHANGED | rc=0 >>
rpcbind.x86_64 0.2.0-49.el7 @base
serverb | CHANGED | rc=0 >>
rpcbind.x86_64 0.2.0-49.el7 @base
[root@main ~]# ansible webservers -m shell -a 'yum list installed | grep openssl'
servera | CHANGED | rc=0 >>
openssl.x86_64 1:1.0.2k-19.el7 @anaconda
openssl-libs.x86_64 1:1.0.2k-19.el7 @anaconda
xmlsec1-openssl.x86_64 1.2.20-7.el7_4 @anaconda
serverb | CHANGED | rc=0 >>
openssl.x86_64 1:1.0.2k-19.el7 @anaconda
openssl-libs.x86_64 1:1.0.2k-19.el7 @anaconda
xmlsec1-openssl.x86_64 1.2.20-7.el7_4 @anaconda
五.定义host_vars和group_vars目录变量
1.主机组变量使用group_vars
group_vars是一个目录,这个名称固定,必须是和你的inventory文件和ansible.cfg文件位于同一级目录,其下创建的文件需要和你主机清单中的组名称一致,在这个文件中写入变量和值
2.主机变量只用host_vars
host_vars和group_vars相同,也是一个目录,名称固定,必须和inventory文件和ansible.cfg文件位于同一级目录,其下创建的文件需要和你主机清单中的主机名称一致(清单文件中写的是主机名就写=用主机名,是IP地址就用IP地址),在这个文件中写入变量和值
3.以主机变量简单为例演示
[root@main ~]# tree /root
/root
├── anaconda-ks.cfg
├── ansible.cfg
├── group_vars
│ ├── dbservers
│ └── webservers
├── host_vars
│ ├── servera
│ └── serverb
├── httpd1.yaml
├── httpd.yaml
├── myhosts
├── myhttpd.yaml
└── myvar1.yaml
[root@main ~]# cat host_vars/servera
aname: httpd
[root@main ~]# cat host_vars/serverb
bname: mod_ssl
[root@main ~]# cat myhttpd.yaml
---
- name: stop servera httpdhosts: serveratasks:- name: stop itservice:name: "{{ aname }}" #在剧本中就可以直接用用定义好的主机变量state: stopped
- name: install serverb mod_sslhosts: serverbtasks:- name: install ityum:name: "{{ bname }}"state: present
[root@main ~]# ansible-playbook myhttpd.yaml --syntax-check
playbook: myhttpd.yaml
[root@main ~]# ansible-playbook myhttpd.yaml
[root@main ~]# ansible servera -m shell -a 'systemctl status httpd | grep Active'
servera | CHANGED | rc=0 >>Active: inactive (dead)
[root@main ~]# ansible serverb -m shell -a 'yum list installed | grep mod_ssl'
serverb | CHANGED | rc=0 >>
mod_ssl.x86_64 1:2.4.6-99.el7.centos.1 @updates
六.注册变量
注册变量主要是使用register来捕获命令的输出,将其保存在一个临时变量中,便于进行特定操作。
如下例,将"id su"的结果注册为"su",并使用debug模块输出su的内容,并在playbook执行后的debug结果中判断出该用户是否存在
[root@main ~]# cat iduser.yaml
---
- name: is su existhosts: webserverstasks:- name: test sushell: id suregister: suignore_errors: yes #便于测试,忽略错误- name: echo itdebug:msg: "{{ su }}"
[root@main ~]# ansible-playbook iduser.yaml
PLAY [is su exist] ******************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************
ok: [servera]
ok: [serverb]
TASK [test su] **********************************************************************************************************************************
changed: [servera]
changed: [serverb]
TASK [echo it] **********************************************************************************************************************************
ok: [servera] => {"msg": {"changed": true, "cmd": "id su", "delta": "0:00:00.004109", "end": "2023-10-17 19:05:47.215481", "failed": false, "rc": 0, #为0表示存在,非0不存在"start": "2023-10-17 19:05:47.211372", "stderr": "", "stderr_lines": [], "stdout": "uid=1000(su) gid=1000(su) groups=1000(su)", #有会输出该用户的详细信息,没有会提示不存在此用户"stdout_lines": ["uid=1000(su) gid=1000(su) groups=1000(su)"]}
}
ok: [serverb] => {"msg": {"changed": true, "cmd": "id su", "delta": "0:00:00.004695", "end": "2023-10-17 19:05:47.220915", "failed": false, "rc": 0, "start": "2023-10-17 19:05:47.216220", "stderr": "", "stderr_lines": [], "stdout": "uid=1000(su) gid=1000(su) groups=1000(su)", "stdout_lines": ["uid=1000(su) gid=1000(su) groups=1000(su)"]}
}
PLAY RECAP **************************************************************************************************************************************
servera : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverb : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
七.vars_prompt交互变量
用于交互提示用户输入值
1.参数解析
prompt表示对用户的提示信息
private表示用户在输入时是否隐藏输入的信息
default表示如果用户没有输入,则此项的默认值
2.简单交互案例
[root@main ~]# cat register.yaml
---
- hosts: webserversvars_prompt:- name: "one"prompt: "请输入第一个值"private: no- name: "two"prompt: "请输入第二个值"#default: 'hello'private: yestasks:- name: dis one valuedebug: msg="{{one}}"- name: dis two valuedebug: msg="{{two}}"
#测试结果
[root@main ~]# ansible-playbook register.yaml
请输入第一个值: nihao
请输入第二个值: #private为yes,此处我输入时会隐藏信息
PLAY [webservers] *******************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************
ok: [servera]
ok: [serverb]
TASK [dis one value] ****************************************************************************************************************************
ok: [servera] => {"msg": "nihao"
}
ok: [serverb] => {"msg": "nihao"
}
TASK [dis two value] ****************************************************************************************************************************
ok: [servera] => { #显示输入的信息"msg": "hello"
}
ok: [serverb] => {"msg": "hello"
}
PLAY RECAP **************************************************************************************************************************************
servera : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverb : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3.创建用户和密码示例
(1)encrypt
可以指定在密码处可以指定使用sha512对密码进行哈希加密
(2)confirm
可以设置重复确认密码,两次密码不符合会报“* VALUES ENTERED DO NOT MATCH ”
[root@main ~]# cat register1.yaml
---
- hosts: webserversvars_prompt:- name: "name"prompt: "enter user_name"private: no- name: "passwd"prompt: "enter user_passwd"private: yes#encrypt: "sha512_crypt" #confirm: yes tasks:- name: create himuser:name: "{{ name }}"password: "{{ passwd }}"
[root@main ~]# ansible-playbook register1.yaml
enter user_name: sulibao
enter user_passwd:
[WARNING]: Found variable using reserved name: name
PLAY [webservers] *******************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************
ok: [serverb]
ok: [servera]
TASK [create him] *******************************************************************************************************************************
[WARNING]: The input password appears not to have been hashed. The 'password' argument must be encrypted for this module to work properly.
changed: [serverb]
changed: [servera]
PLAY RECAP **************************************************************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverb : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@main ~]# ansible webservers -a 'id sulibao'
serverb | CHANGED | rc=0 >>
uid=1001(sulibao) gid=1001(sulibao) groups=1001(sulibao)
servera | CHANGED | rc=0 >>
uid=1001(sulibao) gid=1001(sulibao) groups=1001(sulibao)
#未加密的密码
[root@main ~]# ansible webservers -m shell -a 'cat /etc/shadow | grep sulibao'
serverb | CHANGED | rc=0 >>
sulibao:ansible:19647:0:99999:7:::
servera | CHANGED | rc=0 >>
sulibao:ansible:19647:0:99999:7:::
#加密后
[root@main ~]# ansible webservers -m shell -a 'cat /etc/shadow | grep li'
serverb | CHANGED | rc=0 >>
sulibao:ansible:19647:0:99999:7:::
li:$6$U0qiY4DnzK8AWcBe$rIFmtpCr.1qU3sxtv90U2bRaZbxgqj1PK9UV4wp6W8zWXigHTfcfuFjJ0AvCZMb0Xe75juLlarm94xNZUnoCX.:19647:0:99999:7:::
servera | CHANGED | rc=0 >>
sulibao:ansible:19647:0:99999:7:::
li:$6$U0qiY4DnzK8AWcBe$rIFmtpCr.1qU3sxtv90U2bRaZbxgqj1PK9UV4wp6W8zWXigHTfcfuFjJ0AvCZMb0Xe75juLlarm94xNZUnoCX.:19647:0:99999:7:::
八.引用变量
1.引用简单定义的变量
[root@main ~]# cat myvar1.yaml
packages: #类似于定义了一个列表形式的变量- rpcbind- openssl
[root@main ~]# cat httpd1.yaml
---
- name: install rpcbind opensslhosts: webserverstasks:- name: install themyum:name: "{{ packages }}" #就直接通过“ "{{变量名}}" ”来引用state: presentvars_files:- myvar1.yaml
2.引用较为复杂定义的变量
[root@main ~]# cat myvar2.yaml
su: #定义了一个层层嵌套的变量name:tname: sulibaofname: libaosu
[root@main ~]# cat echo.yaml
---
- hosts: webserverstasks:- name: echo somethingdebug:msg: "{{ su.name.fname }}" #需要使用嵌套定义的变量时,需要使用"."或者"[]"来表示一层一层地引用#msg: "{{ su['name']['fname'] }}"vars_files:- myvar2.yaml
#运行查看结果
[root@main ~]# ansible-playbook echo.yaml
PLAY [webservers] *******************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************
ok: [serverb]
ok: [servera]
TASK [echo something] ***************************************************************************************************************************
ok: [servera] => {"msg": "libaosu"
}
ok: [serverb] => {"msg": "libaosu"
}
PLAY RECAP **************************************************************************************************************************************
servera : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverb : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
相关文章:
Ansible定义各类变量,引用变量方式介绍及注册变量和vars_prompt的用法示例
目录 一.Ansible定义变量 1.用途 2.定义规则 3.变量优先级 二.命令行定义变量 三.定义主机和主机组变量 1.主机变量 (1)内置主机变量 (2)简单示例 2.主机组变量 四.定义playbook变量 1.通过vars表示定义变量ÿ…...
各类证件的版面信息收集
香港身份证的版面分析: 证件页面: 相关的版面信息: 该页面包含香港身份证的信息,可以用于版面分析; 信息来源:香港不同证件说明大汇总|回乡证|居民身份证|护照|永居_手机网易网 台湾通行证号码…...
vueday01——ref响应式
特性:持续监控某个响应式变量的属性名变化,可以使用shallowRef来取消这一特性,只监控对象整体的变化 ref测试代码: <template><div :id"idValue" ref"myDiv">打印obj{{ obj }}</div><…...
SpringBoot集成Redisson操作Redis
目录 一、前言二、基础集成配置(redis单节点)2.1、POM2.2、添加配置文件2.3、添加启动类2.4、添加测试类测试redisson操作redis 一、前言 Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格,Redisson相比较与Jedis和Lettuce来说最…...
整数反转
题目: 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 …...
【ELK使用指南 2】常用的 Logstash filter 插件详解(附应用实例)
Logstash filter 一、logstash filter过滤插件的常用模块简介二、grok 正则捕获插件2.1 grok插件的作用2.2 内置正则表达式2.3 自定义正则表达式 三、mutate 数据修改插件3.1 mutate插件的作用3.2 常用的配置选项3.3 mutate插件应用实例 四、multiline 多行合并插件4.1 multili…...
(转)STR 内核做了什么
参考这篇文章: Linux电源管理(6)_Generic PM之Suspend功能 写的很清晰...
fastapi项目结构以及多进程部署
环境: python3.10.x Linux/centos 背景: 最近在用FastApi开发数据统计,并将统计数据返回给前端展示的数据系统。 数据库: mongodb, python包为mongoEngine 项目结构 main.py api middleware router-- __init__.py-- …...
【LeetCode】 412. Fizz Buzz
题目链接 文章目录 Python3 【O(n) O(1)】C.emplace_back() 【C 11 之后】 Python3 【O(n) O(1)】 初始版本 class Solution:def fizzBuzz(self, n: int) -> List[str]:ans []for i in range(1, n1):if i % 5 0 and i % 3 0:ans.append("FizzBuzz")elif i % …...
vector+算法sort与list+sort的效率比较,容易写错的地方原因探析
我写的代码: #include <iostream> using namespace std; #include <vector> #include <list> #include <algorithm> int main() {const int N 10000000;vector<int> v;list<int> l;for (int i 0; i < N; i){v.push_back(…...
iOS——Manager封装网络请求
在之前的项目里,我们都是把网络请求写在viewController的viewDidLoad,而实际中使用的时候并不能这么简单,对于不同的需要,我们需要有不同的网络请求。所以我们可以用单例模式创建一个全局的Manager类,用实例Manager来执…...
【javascript】内部引入与外部引入javascript
创建a.html 内部引入: 外部引入: 创建a.js 注意: 我这里的a.js和a.html是放在同一个目录下,如果a.js放在js的目录下,a.html 调用a.js的时候 <script src"/js/a.js"></script>...
掌握JavaScript的练习之道:十个手写函数让你信手拈来!
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
买卖股票的最佳时机 II[中等]
优质博文:IT-BLOG-CN 一、题目 给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回你能获得…...
前端开发调试技巧:如何在Component下选中当前插件并且查看当前插件信息
在react开发项目中,在Component下选中组件,然后在控制台输$r 按回车键即可输出该组件信息。例如 $r.props输出该组件的props参数。例子详情见如下截图...
你是否还迷茫要不要学习Linux?
近几年Linux这个词好像很流行,无论是现实工作中,还是在网络信息中均可以听到或者看到有关Linux相关的内容,可以说Linux无处不在。说到这,有人可能会问了,我对Linux比较感兴趣,但是没有接触过Linuxÿ…...
leetcode(1)链表
# 1. 定义一个链表节点 class ListNode:def __init__(self, val0, next_nodeNone):self.val valself.next_node next_node# 2. 定义一个 node头节点 class LinkedList:def __init__(self):self.head None# 3.链表查找元素 get(index): def get_node(self, index)…...
spring boot Rabbit高级教程
消息可靠性 生产者重试机制 首先第一种情况,就是生产者发送消息时,出现了网络故障,导致与MQ的连接中断。 为了解决这个问题,SpringAMQP提供的消息发送时的重试机制。即:当RabbitTemplate与MQ连接超时后,…...
FTP的魅力:构建高效的文件传输基础
1 ftp介绍 1.1 ftp服务器安装 dnf install vsftpd-3.0.3-31.el8.x86_64 -y # 安装ftp服务 systemctl enable --now vsftpd # 启动ftp服务 systemctl stop --now firewalld.service # 关闭防火墙,允许客户端访问anonymous_enableYES #启动匿名用户访问功能1.2 客户…...
70、window11+visual studio2019+共享内存进行数据传输
基本思想:服务端和客户端 写共享内存 #include <windows.h> #include <iostream> using namespace std;HANDLE g_EventRead; // 读信号灯 HANDLE g_EventWrite; // 写信号灯 // 定义共享数据class Writer { public:Writer(const int buf_size, const wchar_t…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
