ansible自動化部署考試系統前后端分離項目

1. ?ansible編寫劇本步驟

  • 1??創建roles目錄結構
  • 2??在group_vars/all/main.yml中定義變量列表
  • 3??在tasks目錄下編寫tasks任務
  • 4??在files目錄下準備部署文件
  • 5??在templates目錄下創建j2模板文件
  • 6??在handlers目錄下編寫handlers
  • 7??在roles目錄下編寫主playbook
  • 8??運行主playbook
  • 9??檢查驗證

2. 🔐部署數據庫(db02)

  • 1??創建roles目錄結構
mkdir -p db_server/{files,templates,tasks,handlers}

  • 2??在group_vars/all/main.yml中定義變量列表
db_server:ip: "172.16.1.52"basedir: /app/tools/datadir: /app/data/3306/port: 3306root_password: Lidao996user_name: examuser_password: examuser_host: "172.16.1.%"db_name: exam
  • 3??在tasks目錄下編寫tasks任務
- name: 1.準備數據庫安裝目錄file:path: "{{ item }}"state: directoryloop:- "{{ db_server.basedir }}"- "{{ db_server.datadir }}"- name: 2.拷貝mysql源碼包copy:src: mysql-8.0.28-linux-glibc2.12-x86_64.tar.xzdest: /tmp/backup: yes- name: 3.解壓mysql源碼包unarchive:src: /tmp/mysql-8.0.28-linux-glibc2.12-x86_64.tar.xzdest: "{{ db_server.basedir }}"remote_src: yescreates: "{{ db_server.basedir }}mysql-8.0.28-linux-glibc2.12-x86_64/LICENSE"- name: 4.創建軟鏈接file:path: "{{ db_server.basedir }}mysql"src: "{{ db_server.basedir }}mysql-8.0.28-linux-glibc2.12-x86_64/"state: link- name: 5.創建mysql用戶user:name: mysqlshell: /sbin/nologincreate_home: nostate: present- name: 6.創建my.cnf配置文件template:src: my.cnf.j2dest: /etc/my.cnfowner: mysqlgroup: mysqlbackup: yesnotify:restart_mysqld- name: 7.修為數據庫目錄所有者file:path: "{{ item }}"owner: mysqlgroup: mysqlloop:- "{{ db_server.basedir }}mysql/"- "{{ db_server.datadir }}"- name: 8.配置環境變量lineinfile:path: /etc/profileline: 'export PATH=/app/tools/mysql/bin:$PATH'insertafter: EOF- name: 9.檢查是否已經初始化過數據庫stat:path: /tmp/init_dbregister: init_stat- name: 10.初始化數據庫script: ./db_server/files/init_mysql.shwhen: not init_stat.stat.exists- name: 11.啟動數據庫systemd:name: mysqldenabled: yesstate: started- name: 12.安裝pipyum:name:- python3-pipstate: present- name: 13.安裝pymysql模塊pip:name: pymysqlstate: present- name: 14.創建數據庫,字符集為 utf8mb4mysql_db:name: "{{ db_server.db_name }}"encoding: utf8mb4collation: utf8mb4_unicode_cistate: presentlogin_user: rootlogin_password: ""when: not init_stat.stat.exists- name: 15.創建用戶mysql_user:name: "{{ db_server.user_name }}"host: "{{ db_server.user_host }}"password: "{{ db_server.user_password }}"state: presentwhen: not init_stat.stat.exists- name: 16.授予用戶權限mysql_user:name: "{{ db_server.user_name }}"host: "{{ db_server.user_host }}"priv: "{{ db_server.db_name }}.*:ALL"state: presentwhen: not init_stat.stat.exists- name: 17.上傳 SQL 文件到目標主機copy:src: xzs-mysql.sqldest: /tmp/xzs-mysql.sqlwhen: not init_stat.stat.exists- name: 18.導入數據庫shell: "{{ db_server.basedir }}mysql/bin/mysql -uroot exam </tmp/xzs-mysql.sql"when: not init_stat.stat.exists- name: 19.設置root密碼mysql_user:name: rootpassword: "{{ db_server.root_password }}"host: localhostlogin_user: rootlogin_password: ""when: not init_stat.stat.exists- name: 20.創建標記文件表示已初始化file:path: /tmp/init_dbstate: touchmode: '0644'when: not init_stat.stat.exists
  • 4??在files目錄下準備部署文件
#!/bin/bash
##############################################################
# File Name:db_server/files/init_mysql.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
##############################################################
source /etc/profile
#1.初始化數據庫
mysqld --initialize-insecure --user=mysql --basedir=/app/tools/mysql/ --datadir=/app/data/3306/#2.拷貝啟動管理文件到init.d
if [ -f /app/tools/mysql/support-files/mysql.server ];thencp /app/tools/mysql/support-files/mysql.server  /etc/init.d/mysqld
elseecho "file not found"exit 1
fi
#3.修改管理文件權限
chmod +x /etc/init.d/mysqld#4.修改管理文件內容
sed -i  '/^basedir=/s#basedir=#basedir=/app/tools/mysql/#g'  /etc/init.d/mysqld
sed -i  '/^datadir=/s#datadir=#datadir=/app/data/3306/#g'  /etc/init.d/mysqld#5.加載自啟動服務文件
systemctl daemon-reload
  • 5??在templates目錄下創建j2模板文件
[mysqld]
user=mysql 
basedir={{ db_server.basedir }}mysql/
datadir={{ db_server.datadir }}
port={{ db_server.port }}
socket=/tmp/mysql.sock [client]
socket=/tmp/mysql.sock
  • 6??在handlers目錄下編寫handlers
- name: restart_mysqldsystemd:name: mysqldstate: restarted
  • 7??在roles目錄下編寫主playbook
- hosts: dbroles:- db_server
  • 8??運行主playbook
ansible-playbook top.yml

  • 9??檢查驗證
ansible db -m shell -a 'ps -ef | grep mysql'

3. 🚀啟動jar項目(web03/web04)

  • 1??創建roles目錄結構
mkdir -p backend_web/{files,templates,tasks,handlers}

  • 2??在group_vars/all/main.yml中定義變量列表
backend_web:ip:- "10.0.0.9"- "10.0.0.10"port: 8000site_dir: /app/code/exam/backend/host: exam
  • 3??在tasks目錄下編寫tasks任務
- name: 1.安裝jdkyum:name:- java-11-openjdk- java-11-openjdk-develstate: present- name: 2.拷貝項目文件到后端web服務器上copy:src: xzs-3.9.0.jardest: "{{ backend_web.site_dir }}"backup: yes- name: 3.拷貝配置文件到后端web服務器上template:src: application-prod.yml.j2dest: "{{ backend_web.site_dir }}application-prod.yml"backup: yes- name: 4.拷貝自啟動腳本到后端web服務器上template:src: "{{ backend_web.host }}.sh.j2"dest: /server/scripts/{{ backend_web.host }}.shbackup: yes- name: 5.拷貝service服務管理文件到web服務器上template:src: "{{ backend_web.host }}.service.j2"dest: /usr/lib/systemd/system/{{ backend_web.host }}.servicebackup: yes- name: 6.重新加載systemd配置systemd:daemon_reload: yes- name: 7.啟動服務,并設置下次開機啟動systemd:name: "{{ backend_web.host }}"enabled: yesstate: started
  • 4??在files目錄下準備部署文件
xzs-3.9.0.jar
  • 5??在templates目錄下創建j2模板文件
  • exam.sh.j2
#!/bin/bash
##############################################################
# File Name:exam.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
###############################################################1.vars
service=xzs-3.9.0.jar
dir={{ backend_web.site_dir }}
choose=$1
time=`date +%F_%T`
jar_file=${dir}${service}#2.function
function srv_start() {pid=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}'`pidcount=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}' | wc -l`if [ -f ${jar_file} ];thenif [ -z ${pid} ];thencd ${dir}nohup java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar >/dev/null 2>&1 &fielseexitfireturn $?
}function srv_stop() {pid=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}'`pidcount=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}' | wc -l`if [ ${pidcount} -gt 0 ];thenkill ${pid}fireturn $?
}function srv_restart() {srv_stopsleep 1srv_start
}function srv_status() {pid=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}'`pidcount=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}' | wc -l`if [ ${pidcount} -ge 1 ];thenecho -e "\E[1;32mrunning pid:[${pid}] ${service}\E[0m"elseecho -e "\E[1;31mstoped ${service}\E[0m"fireturn $?
}#3.case
case "${choose}" instart) srv_start ;;stop) srv_stop ;;restart) srv_restart ;;status) srv_status ;;*) echo input error
esac
  • application-prod.yml.j2
#server后端服務的配置
server:port: {{ backend_web.port }}undertow:io-threads: 16worker-threads: 4000buffer-size: 1024direct-buffers: truecompression:enabled: truemin-response-size: 1
#日志
logging:path: {{ backend_web.site_dir }}#數據庫,redis等等配置
spring:datasource:#mysql://數據庫地址:端口號/庫名字?url: jdbc:mysql://{{ db_server.ip }}:{{ db_server.port }}/{{ db_server.db_name }}?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&allowMultiQueries=trueusername: {{ db_server.user_name }}password: {{ db_server.user_password }}driver-class-name: com.mysql.cj.jdbc.Driver
  • exam.service.j2
[Unit]
Description={{ backend_web.host }}
After=network.target 
[Service]
Type=forking
#EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=bash /server/scripts/{{ backend_web.host }}.sh start
ExecStop=bash /server/scripts/{{ backend_web.host }}.sh stop
[Install]
WantedBy=multi-user.target
  • 6??在handlers目錄下編寫handlers
  • 7??在roles目錄下編寫主playbook
- hosts: backend_webroles:- backend_web
  • 8??運行主playbook
ansible-playbook top.yml

  • 9??檢查驗證
ansible backend_web -m shell -a 'ps -ef | grep java'

4. 🍀接入4層負載均衡(lb01/lb02)

  • 1??創建roles目錄結構
mkdir -p backend_lb/{files,templates,tasks,handlers}

  • 2??在group_vars/all/main.yml中定義變量列表
backend_lb:ip:- "10.0.0.5"- "10.0.0.6"port: 8000
  • 3??在tasks目錄下編寫tasks任務
- name: 1.分發nginx源copy:src: nginx.repodest: /etc/yum.repos.d/backup: yes- name: 2.安裝nginx軟件yum:name: nginxstate: present- name: 3.分發nginx配置文件template:src: nginx.conf.j2dest: /etc/nginx/nginx.confbackup: yesnotify:reload_nginx- name: 4.啟動nginx并設置下次開機啟動systemd:name: nginxenabled: yesstate: started
  • 4??在files目錄下準備部署文件
vim backend_lb/files/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
  • 5??在templates目錄下創建j2模板文件
  • backend_lb/templates/nginx.conf.j2

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}stream {upstream exam_pools {
{% for i in backend_web.ip %}server {{ i }}:{{ backend_web.port }};
{% endfor %}hash $remote_addr consistent;}log_format basic '$remote_addr [$time_local] ''$protocol $status $bytes_sent $bytes_received ''$session_time';access_log /var/log/nginx-l4.log basic;server {listen {{ backend_lb.port }};proxy_pass exam_pools;}
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;include /etc/nginx/conf.d/*.conf;
}
  • 6??在handlers目錄下編寫handlers
- name: reload_nginxsystemd:name: nginxstate: reloaded
  • 7??在roles目錄下編寫主playbook
- hosts: lbroles:- backend_lb
  • 8??運行主playbook
ansible-playbook top.yml

  • 9??檢查驗證
ansible lb -m shell -a 'ss -lntup | grep 8000'

5. 🌏部署前端web(web01/web02)

  • 1??創建roles目錄結構
mkdir -p front_web/{files,templates,tasks,handlers}

  • 2??在group_vars/all/main.yml中定義變量列表
front_web:ip:- "10.0.0.7"- "10.0.0.8"port: 80site_dir: /app/code/exam/front/front_host: studentbackend_host: admin
  • 3??在tasks目錄下編寫tasks任務
- name: 1.分發nginx源copy:src: nginx.repodest: /etc/yum.repos.d/nginx.repobackup: yes- name: 2.安裝nginx軟件yum:name: nginxstate: present- name: 3.分發nginx配置文件template:src: exam.conf.j2dest: /etc/nginx/conf.d/exam.confbackup: yesnotify:reload_nginx- name: 4.創建站點目錄file:path: "{{ front_web.site_dir }}"state: directory- name: 5.分發前端代碼到前端web服務器上copy:src: exam-web.tar.gzdest: /tmp/backup: yes- name: 6.解壓代碼到站點目錄下unarchive:src: /tmp/exam-web.tar.gzdest: "{{ front_web.site_dir }}"remote_src: yes- name: 7.啟動nginx并設置開機自啟動systemd:name: nginxenabled: yesstate: started
  • 4??在files目錄下準備部署文件
vim front_web/files/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
  • 5??在templates目錄下創建j2模板文件
  • front_web/templates/exam.conf.j2
server {listen {{ front_web.port }};server_name {{ front_web.front_host }}.zhubl.xyz;root  {{ front_web.site_dir }}{{ front_web.front_host }}/;location / {index index.html;}location /api/ {proxy_pass  http://{{ backend_lb.vip }}:{{ backend_lb.port }};}
}server {listen 80;server_name {{ front_web.backend_host }}.zhubl.xyz;root  {{ front_web.site_dir }}{{ front_web.backend_host }}/;location / {index index.html;}location /api/ {proxy_pass  http://{{ backend_lb.vip }}:{{ backend_lb.port }};}
}
  • 6??在handlers目錄下編寫handlers
- name: reload_nginxsystemd:name: nginxstate: reloaded
  • 7??在roles目錄下編寫主playbook
- hosts: front_webroles:- front_web
  • 8??運行主playbook
ansible-playbook top.yml

  • 9??檢查驗證
ansible front_web -m shell -a 'ss -lntup | grep 80'

6. 🍀接入7層負載(lb01/lb02)

  • 1??創建roles目錄結構
mkdir -p front_lb/{files,templates,tasks,handlers}

  • 2??在group_vars/all/main.yml中定義變量列表
front_lb:ip:- "10.0.0.5"- "10.0.0.6"port: 80vip: "10.0.0.3"
  • 3??在tasks目錄下編寫tasks任務
- name: 1.分發nginx源copy:src: nginx.repodest: /etc/yum.repos.d/backup: yes- name: 2.安裝nginx軟件yum:name: nginxstate: present- name: 3.分發nginx配置文件template:src: exam.conf.j2dest: /etc/nginx/conf.d/exam.confbackup: yesnotify:reload_nginx- name: 4.啟動nginx并設置下次開機自啟動systemd:name: nginxenabled: yesstate: started
  • 4??在files目錄下準備部署文件
vim front_lb/files/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
  • 5??在templates目錄下創建j2模板文件
  • front_lb/templates/exam.conf.j2
upstream l7_pools {
{% for i in front_web.ip %}server {{ i }}:{{ front_web.port }};
{% endfor %}hash $remote_addr consistent;
}
server {listen {{ front_lb.port }};server_name {{ front_web.front_host }}.zhubl.xyz;location / {proxy_pass http://l7_pools;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;}
}
server {listen {{ front_lb.port }};server_name {{ front_web.backend_host }}.zhubl.xyz;location / {proxy_pass http://l7_pools;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;}
}
  • 6??在handlers目錄下編寫handlers
- name: reload_nginxsystemd:name: nginxstate: reloaded
  • 7??在roles目錄下編寫主playbook
- hosts: lbroles:- front_lb
  • 8??運行主playbook
ansible-playbook top.yml

  • 9??檢查驗證
ansible lb -m shell -a 'ss -lntup | grep 80'

7. 🚀接入高可用(lb01/lb02)

  • 1??創建roles目錄結構
mkdir -p front_keepalived/{files,templates,tasks,handlers}
  • 2??在group_vars/all/main.yml中定義變量列表
  • 3??在tasks目錄下編寫tasks任務
- name: 1.安裝keepalived軟件yum:name: keepalivedstate: present- name: 2.獲取主機名shell: hostnameregister: hostname- name: 3.分發lb01配置文件template:src: lb01.keepalived.conf.j2dest: /etc/keepalived/keepalived.confbackup: yeswhen: hostname.stdout is match("lb01")notify:restart_keepalived- name: 4.分發lb02配置文件template:src: lb02.keepalived.conf.j2dest: /etc/keepalived/keepalived.confbackup: yeswhen: hostname.stdout is match("lb02")notify:restart_keepalived- name: 5.分發監控nginx進程腳本到負載均衡copy:src: check_lb.shdest: /server/scripts/check_lb.shmode: '0755'backup: yes- name: 6.啟動keepalived并設置下次開機自啟動systemd:name: keepalivedenabled: yesstate: started
  • 4??在files目錄下準備部署文件
#!/bin/bash
##############################################################
# File Name:/server/scripts/check_lb.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
##############################################################
#1.vars
count=`ps -ef | grep nginx | wc -l`#2.stop keepalived
if [ ${count} -eq 1 ];thensystemctl stop keepalived
fi
  • 5??在templates目錄下創建j2模板文件
  • front_keepalived/templates/lb01.keepalived.conf.j2
global_defs {router_id lb01
}
vrrp_script check_lb.sh {   script /server/scripts/check_lb.shinterval 2weight  1user root 
}vrrp_instance vip_3 {    state MASTER    interface ens33virtual_router_id 51 priority 100    advert_int 1        authentication {   auth_type PASSauth_pass 1111  
}
virtual_ipaddress { {{ front_lb.vip }} dev ens33 label ens33:1
}
track_script  {check_lb.sh 
}
}vrrp_instance vip_4 {state BACKUPinterface ens33virtual_router_id 52priority 50advert_int 1authentication {auth_type PASSauth_pass 1111
}
virtual_ipaddress {{{ backend_lb.vip }} dev ens33 label ens33:2
}
}
  • front_keepalived/templates/lb02.keepalived.conf.j2
global_defs {router_id lb02
}
vrrp_script check_lb.sh {script /server/scripts/check_lb.shinterval 2weight  1user root 
}vrrp_instance vip_3 {state BACKUPinterface ens33virtual_router_id 51priority 50advert_int 1authentication {auth_type PASSauth_pass 1111
}
virtual_ipaddress {{{ front_lb.vip }} dev ens33 label ens33:1
}
}vrrp_instance vip_4 {state MASTERinterface ens33virtual_router_id 52priority 100advert_int 1authentication {auth_type PASSauth_pass 1111
}
virtual_ipaddress {{{ backend_lb.vip }} dev ens33 label ens33:2
}
track_script  {check_lb.sh
}
}
  • 6??在handlers目錄下編寫handlers
- name: restart_keepalivedsystemd:name: keepalivedstate: restarted
  • 7??在roles目錄下編寫主playbook
- hosts: lbroles:- keepalived
  • 8??運行主playbook
ansible-playbook top.yml
  • 9??檢查驗證

8. 🌏瀏覽器訪問

9. ?總結

9.1. 🌟總變量

db_server:ip: "172.16.1.52"basedir: /app/tools/datadir: /app/data/3306/port: 3306root_password: Lidao996user_name: examuser_password: examuser_host: "172.16.1.%"db_name: examfront_web:ip:- "10.0.0.7"- "10.0.0.8"port: 80site_dir: /app/code/exam/front/front_host: studentbackend_host: adminbackend_web:ip:- "10.0.0.9"- "10.0.0.10"port: 8000site_dir: /app/code/exam/backend/host: exambackend_lb:ip:- "10.0.0.5"- "10.0.0.6"port: 8000vip: "10.0.0.4"front_lb:ip:- "10.0.0.5"- "10.0.0.6"port: 80vip: "10.0.0.3"

9.2. 🌟總roles

[root@m02 /server/ansible/roles]# tree -F 
.
├── ansible.cfg
├── backend_lb/
│?? ├── files/
│?? │?? └── nginx.repo
│?? ├── handlers/
│?? │?? └── main.yml
│?? ├── tasks/
│?? │?? └── main.yml
│?? └── templates/
│??     └── nginx.conf.j2
├── backend_web/
│?? ├── files/
│?? │?? └── xzs-3.9.0.jar
│?? ├── handlers/
│?? ├── tasks/
│?? │?? └── main.yml
│?? └── templates/
│??     ├── application-prod.yml.j2
│??     ├── exam.service.j2
│??     └── exam.sh.j2
├── db_server/
│?? ├── files/
│?? │?? ├── init_mysql.sh*
│?? │?? ├── mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz
│?? │?? └── xzs-mysql.sql
│?? ├── handlers/
│?? │?? └── main.yml
│?? ├── tasks/
│?? │?? └── main.yml
│?? └── templates/
│??     └── my.cnf.j2
├── front_lb/
│?? ├── files/
│?? │?? └── nginx.repo
│?? ├── handlers/
│?? │?? └── main.yml
│?? ├── tasks/
│?? │?? └── main.yml
│?? └── templates/
│??     └── exam.conf.j2
├── front_web/
│?? ├── files/
│?? │?? ├── exam-web.tar.gz
│?? │?? └── nginx.repo
│?? ├── handlers/
│?? │?? └── main.yml
│?? ├── tasks/
│?? │?? └── main.yml
│?? └── templates/
│??     └── exam.conf.j2
├── group_vars/
│?? └── all/
│??     └── main.yml
├── hosts
├── keepalived/
│?? ├── files/
│?? │?? └── check_lb.sh
│?? ├── handlers/
│?? │?? └── main.yml
│?? ├── tasks/
│?? │?? └── main.yml
│?? └── templates/
│??     ├── lb01.keepalived.conf.j2
│??     └── lb02.keepalived.conf.j2
└── top.yml32 directories, 33 files

9.3. 🌟總劇本

- hosts: dbroles:- db_server- hosts: backend_webroles:- backend_web- hosts: lbroles:- backend_lb- hosts: front_webroles:- front_web- hosts: lbroles:- front_lb- keepalived

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914323.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914323.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914323.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【AI論文】GLM-4.1V-Thinking:邁向具備可擴展強化學習的通用多模態推理

摘要&#xff1a;我們推出GLM-4.1V-Thinking&#xff0c;這是一款旨在推動通用多模態推理發展的視覺語言模型&#xff08;VLM&#xff09;。在本報告中&#xff0c;我們分享了在以推理為核心的訓練框架開發過程中的關鍵發現。我們首先通過大規模預訓練開發了一個具備顯著潛力的…

Linux進程通信——匿名管道

目錄 1、進程間通信基礎概念 2、管道的工作原理 2.1 什么是管道文件 3、匿名管道的創建與使用 3.1、pipe 系統調用 3.2 父進程調用 fork() 創建子進程 3.3. 父子進程的文件描述符共享 3.4. 關閉不必要的文件描述符 3.5 父子進程通過管道進行通信 父子進程通信的具體例…

sql:sql在office中的應用有哪些?

在Office軟件套件中&#xff0c;主要是Access和Excel會用到SQL&#xff08;結構化查詢語言&#xff09;&#xff0c;以下是它們在這兩款軟件中的具體應用&#xff1a; 在Access中的應用 創建和管理數據庫對象&#xff1a; 創建表&#xff1a;使用CREATE TABLE語句可以創建新的數…

零基礎完全理解視覺語言模型(VLM):從理論到代碼實踐

本文是《從LLM到VLM&#xff1a;視覺語言模型的核心技術與Python實現》的姊妹篇&#xff0c;主要面向零基礎的讀者&#xff0c;希望用更通俗易懂的語言帶領大家入門VLM。本教程的完整代碼可以在GitHub上找到&#xff0c;如果你有任何問題或建議&#xff0c;歡迎交流討論。 寫在…

數據結構 Map和Set

文章目錄&#x1f4d5;1. 二叉搜索樹??1.1 查找操作??1.2 插入操作??1.3 刪除操作&#x1f4d5;2. Map的使用??2.1 Map的常用方法??2.2 TreeMap和HashMap的區別??2.3 HashMap的底層實現&#x1f4d5;3. Set的使用??3.1 Set的常用方法??3.2 TreeSet和HashSet的區…

樹莓派5-系統 Debian 12 開啟VNC遠程訪問踩坑記錄

簡單記錄一下踩坑&#xff0c;安裝vnc遠程訪問服務并設置開機自啟1.查看系統版本&#xff0c;我這里的系統版本是 12cat /etc/os-release2.安裝VNC服務sudo apt install realvnc-vnc-server realvnc-vnc-viewer -y3.創建服務單元文件&#xff1a;sudo nano /etc/systemd/system…

TASK2 夏令營:用AI做帶貨視頻評論分析

TASK2 夏令營&#xff1a;用AI做帶貨視頻評論分析**電商評論洞察賽題&#xff1a;從Baseline到LLM進階優化學習筆記**一、 賽題核心解讀1.1. 任務鏈條與目標1.2. 關鍵挑戰與評分機制二、 Baseline方案回顧與瓶頸分析2.1. Baseline技術棧2.2. 核心瓶頸三、 進階優化策略&#xf…

Docker:安裝命令筆記

目錄 零、安裝&#xff1a;略 一、鏡像 1.0、獲取鏡像&#xff1a; 1.1、查看鏡像&#xff1a; 1.2、刪除鏡像&#xff1a; 二、容器 2.0、創建并啟動容器 2.1、tomcat和jdk9的“創建并啟動容器”的命令 2.2、容器操作 2.3、容器日志操作 零、安裝&#xff1a;略 略 …

Python七彩花朵

系列文章 序號直達鏈接Tkinter1Python李峋同款可寫字版跳動的愛心2Python跳動的雙愛心3Python藍色跳動的愛心4Python動漫煙花5Python粒子煙花Turtle1Python滿屏飄字2Python藍色流星雨3Python金色流星雨4Python漂浮愛心5Python愛心光波①6Python愛心光波②7Python滿天繁星8Pytho…

【保姆級圖文詳解】MCP架構(客戶端-服務端)、三種方式使用MCP服務、Spring AI MCP客戶端和服務端開發、MCP部署方案、MCP安全性

文章目錄前言一、MCP(model context protocol)1.1、概念描述1.2、MCP作用與意義1.3、MCP架構二、使用MCP(model context protocol)2.1、云平臺使用MCP2.2、軟件客戶端使用MCP2.3、Spring AI程序中使用MCP三、Spring AI MCP(model context protocol)開發過程3.1、MCP服務端開發3…

Linux的 iproute2 配置:以太網(Ethernet)、綁定(Bond)、虛擬局域網(VLAN)、網橋(Bridge)筆記250713

Linux的 iproute2 配置:以太網(Ethernet)、綁定(Bond)、虛擬局域網(VLAN)、網橋(Bridge&#xff09;筆記250713 在 Linux 中使用 iproute2 工具集配置網絡是現代且推薦的方法&#xff0c;它取代了舊的 ifconfig、route、brctl、vconfig 等命令。iproute2 提供了統一的接口 ip …

當信任上鏈解碼區塊鏈溯源系統開發邏輯與產業變革

當信任上鏈&#xff1a;解碼區塊鏈溯源系統的開發邏輯與產業變革在上海某高端超市的進口水果區&#xff0c;消費者王女士拿起一盒車厘子&#xff0c;用手機掃描包裝上的二維碼&#xff0c;屏幕立刻彈出一串動態信息&#xff1a;智利瓦爾帕萊索港口的裝船時間、海關清關的具體日…

可視化DIY小程序工具!開源拖拽式源碼系統,自由搭建,完整的源代碼包分享

溫馨提示&#xff1a;文末有資源獲取方式傳統的小程序開發對技術要求較高&#xff0c;這使得許多非技術人員望而卻步。可視化DIY小程序工具應運而生&#xff0c;它通過拖拽式操作和開源代碼系統&#xff0c;極大地降低了開發門檻&#xff0c;讓更多人能夠快速構建個性化小程序。…

【MLLM】多模態理解GLM-4.1V-Thinking模型

note GLM-4.1V-Thinking模型引入 課程采樣強化學習&#xff08;RLCS, Reinforcement Learning with Curriculum Sampling&#xff09; 策略&#xff0c;在多個復雜推理任務中實現能力突破&#xff0c;整體性能達到 10B 級別視覺語言模型的領先水平。GLM-4.1V-9B-Thinking 通過…

【C++詳解】STL-priority_queue使用與模擬實現,仿函數詳解

文章目錄一、priority_queue使用仿函數控制優先級sort算法里的仿函數二、手撕優先級隊列優先級隊列的容器適配器入堆出堆top/size/empty迭代器區間構造初始化(解耦)三、仿函數仿函數控制冒泡排序仿函數控制priority_queue比較邏輯仿函數使用場景仿函數的其他使用場景源碼一、pr…

在mac m1基于ollama運行deepseek r1

1 下載和安裝 在ollama的官網下載mac m1版本的ollama https://ollama.com/ 最終獲得如下所示的下載地址 https://github.com/ollama/ollama/releases/latest/download/Ollama.dmg 然后點擊安裝&#xff0c;然后測試 ollama list 2 運行deepseek r1 deepseek-r1:8b 比較適…

TCP與UDP協議詳解:網絡世界的可靠信使與高速快遞

> 互聯網的骨架由傳輸層協議支撐,而TCP與UDP如同血管中的紅細胞與血小板,各司其職卻又缺一不可 ### 一、初識傳輸層雙雄:網絡通信的基石 想象你要給朋友寄送重要文件: - **TCP** 如同順豐快遞:**簽收確認+物流追蹤**,確保文件完整送達 - **UDP** 如同普通信件:**直接…

Datawhale AI 夏令營【更新中】

Datawhale AI 夏令營【更新中】夏令營簡介大模型技術&#xff08;文本&#xff09;方向&#xff1a;用AI做帶貨視頻評論分析機器學習&#xff08;數據挖掘&#xff09;方向&#xff1a;用AI預測新增用戶夏令營簡介 本次AI夏令營是Datawhale在暑期發起的大規模AI學習活動&#…

AutoDL掛載阿里云OSS

文章目錄前言AutoDL 設置阿里OSS設置OSS配置相關key 相關競猜時間前言 最近&#xff0c;AutoDL提示北京A區網盤功能要下架&#xff0c;然后需要對網盤中數據進行轉移等操作&#xff0c;我想網盤中數據下載到本地&#xff0c;大概16G&#xff1b;直接在網盤那里下載&#xff0c…

java 基本數據類型所對應的包裝類

一,對應列舉Java 中有 8 種基本數據類型&#xff0c;每種基本數據類型都有對應的包裝類&#xff0c;它們分別是&#xff1a;二,包裝類的作用1. 滿足面向對象編程需求Java 是面向對象的編程語言&#xff0c;基本數據類型不是對象&#xff0c;無法使用面向對象的特性&#xff08;…