day051-ansible循环、判断与jinja2模板

文章目录

  • 0. 老男孩思想-男女性需求差异
  • 1. 手动指定客户机密码
  • 2. 批量更新主机名
    • 2.1 hostname模块
    • 2.2 添加主机清单变量
    • 2.3 编写批量修改主机名剧本
    • 2.4 修改hosts文件
    • 2.5 分发hosts文件剧本
  • 3. ansible的并行进程数
  • 4. 分组设置主机密码-主机清单分组变量
  • 5. 案例:ansible批量管理案例400台机器
  • 6. ansible循环
    • 6.1 标准循环 (with_items)
      • 6.1.1 添加多个用户
    • 6.2 字典列表循环
      • 6.2.1 添加多个用户,并添加uid、group
  • 7. ansible判断
    • 7.1 根据系统类型安装软件
    • 7.2 根据register变量判断系统类型
  • 8. jinja2模板
    • 8.1 分发keepalived配置文件
      • 8.1.1 编写keepalived配置文件j2模板
      • 8.1.2 编写分发文件剧本
    • 8.2 分发NFS配置文件
      • 8.2.1 为nfs主机组添加分组变量
      • 8.2.2 编写nfs配置文件的j2模板
      • 8.2.3 编写分发配置文件剧本
    • 8.3 分发rsync服务的配置文件
      • 8.3.1 编写rsync主机组分组变量
      • 8.3.2 编写rsync服务配置文件的j2模板
      • 8.3.3 编写分发剧本
    • 8.4 分发多个nginx域名配置文件
      • 8.4.1 编写web主机组分组变量
      • 8.4.2 编写nginx域名配置文件的j2模板
      • 8.4.3 编写分发配置文件剧本
  • 9. 思维导图

0. 老男孩思想-男女性需求差异

女生对待性的方面往往不如男生强烈,特别是28岁以上的女生;只有满足女生其他生理和心理需求,对方才会把性交给你保管,所以说性是她喜欢你之后附属给你的东西。而男生恰恰相反,常常就是想到性然后就有了性的冲动,进而喜欢上一个女生。 —老男孩

在这里插入图片描述

1. 手动指定客户机密码

  • 当服务机密码认证失败后,可以手动指定客户机的用户名和密码
[root@m02 /server/ans/playbooks]# cat hosts 
……
[bak]
172.16.1.41 ansible_user=root ansible_port=22 ansible_password=SKX2554.……
  • 测试
[root@m02 /server/ans/playbooks]# ansible -i hosts bak -m ping
……
172.16.1.41 | SUCCESS => {"changed": false,"ping": "pong"
}

2. 批量更新主机名

2.1 hostname模块

hostname 模块 用于管理目标主机的系统主机名(hostname)。它可以修改 临时主机名永久主机名。

  • 模块参数:
    • name:新主机名
    • use:生效范围
      • runtime:临时生效
      • persistent:永久生效

2.2 添加主机清单变量

[root@m02 /server/ans/playbooks]# cat hosts 
[lb]
172.16.1.5 hostname=lb01.oldboy.cn
172.16.1.6 hostname=lb02.oldboy.cn
[web]
172.16.1.7 hostname=web01.oldboy.cn
172.16.1.8 hostname=web02.oldboy.cn
172.16.1.9 hostname=web03.oldboy.cn
[db]
172.16.1.51 hostname=db01.oldboy.cn
172.16.1.52 hostname=db02.oldboy.cn
[nfs]
172.16.1.31 hostname=nfs01.oldboy.cn
[bak]
172.16.1.41 ansible_user=root ansible_port=22 ansible_password=SKX2554. hostname=backup.oldboy.cn[data:children]
db
nfs
bak

2.3 编写批量修改主机名剧本

[root@m02 /server/ans/playbooks]# cat 07.hostname.yaml 
- hosts: allgather_facts: falsetasks:- name: 1.修改主机名hostname: name: "{{ hostname }}"- name: 2.检查主机名shell: "hostname"register: host #注册变量,记录执行命令的结果- name: 3.输出主机名debug:msg: "{{ host.stdout }}"
  • 测试:
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 07.hostname.yaml
……TASK [1.修改主机名] *********************************************************************************************
ok: [172.16.1.9]
ok: [172.16.1.6]
fatal: [172.16.1.52]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.16.1.52 port 22: No route to host", "unreachable": true}
ok: [172.16.1.7]
ok: [172.16.1.8]
ok: [172.16.1.31]
ok: [172.16.1.5]
ok: [172.16.1.51]
ok: [172.16.1.41]TASK [2.检查主机名] *****************************************************************************************
changed: [172.16.1.9]
changed: [172.16.1.8]
changed: [172.16.1.7]
changed: [172.16.1.6]
changed: [172.16.1.5]
changed: [172.16.1.51]
changed: [172.16.1.31]
changed: [172.16.1.41]TASK [3.输出主机名] *********************************************************************************************
ok: [172.16.1.5] => {"msg": "lb01.oldboy.cn"
}
ok: [172.16.1.6] => {"msg": "lb02.oldboy.cn"
}
ok: [172.16.1.7] => {"msg": "web01.oldboy.cn"
}
ok: [172.16.1.8] => {"msg": "web02.oldboy.cn"
}
ok: [172.16.1.9] => {"msg": "web03.oldboy.cn"
}
ok: [172.16.1.51] => {"msg": "db01.oldboy.cn"
}
……

2.4 修改hosts文件

[root@m02 /server/ans/playbooks]# sed -rn -i '/^172/s# (.*)# \1 \1.oldboy.cn#gp' /etc/hosts
[root@m02 /server/ans/playbooks]# cat /etc/hosts 
172.16.1.5 lb01 lb01.oldboy.cn
172.16.1.6 lb02 lb02.oldboy.cn
172.16.1.7 web01 web01.oldboy.cn
172.16.1.8 web02 web02.oldboy.cn
172.16.1.9 web03 web03.oldboy.cn
172.16.1.31 nfs01 nfs01.oldboy.cn
172.16.1.41 backup backup.oldboy.cn
172.16.1.51 db01 db01.oldboy.cn
172.16.1.61 m01 m01.oldboy.cn

2.5 分发hosts文件剧本

[root@m02 /server/ans/playbooks]# cat 07.hosts.yaml
- hosts: allgather_facts: falsetasks:- name: 1.分发hosts文件copy:src: /etc/hostsdest: /etc/hosts
  • 测试:
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 07.hosts.yaml
……

3. ansible的并行进程数

  • ansible默认并发执行的主机数是5
  • 选项:
    • -f,表示ansible的并发进程数,默认是5

4. 分组设置主机密码-主机清单分组变量

  • 编辑主机清单,添加分组变量
[root@m02 /server/ans/playbooks]# cat hosts 
[lb]
172.16.1.5 hostname=lb01.oldboy.cn
172.16.1.6 hostname=lb02.oldboy.cn
[web]
172.16.1.7 hostname=web01.oldboy.cn
172.16.1.8 hostname=web02.oldboy.cn
172.16.1.9 hostname=web03.oldboy.cn
[db]
172.16.1.51 hostname=db01.oldboy.cn
172.16.1.52 hostname=db02.oldboy.cn
[nfs]
172.16.1.31 hostname=nfs01.oldboy.cn
[bak]
172.16.1.41 ansible_user=root ansible_port=22 ansible_password=SKX2554. hostname=backup.oldboy.cn[data:children]
db
nfs
bak[web:vars]
password=SKX2554.
[db:vars]
password=SKX2555.
  • 编写批量更新主机密码剧本:
[root@m02 /server/ans/playbooks]# cat 08.passwd.yaml 
- hosts: web,dbbecome: yes ## 需要 root 权限tasks:- name: 1.更新主机密码user:name: rootpassword: "{{ password | password_hash('sha512') }}"

5. 案例:ansible批量管理案例400台机器

  • 这些机器密码不相同

[ansible批量管理案例400台机器项目](https://www.yuque.com/lidao996/sre/kva28zochq01n7l6)

6. ansible循环

6.1 标准循环 (with_items)

  • 剧本选项:
    • with_items
    • loop
  • 两个选项用法相同

6.1.1 添加多个用户

  • 剧本:
[root@m02 /server/ans/playbooks]# cat 09.add_users.yaml 
- hosts: alltasks:- name: 1.添加多个用户user:name: "{{ item }}" # 该变量名不能改变state: presentwith_items: #循环的变量值- oldboy01- oldboy02- oldboy03
  • 测试并检查:
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 09.add_users.yaml 
……
[root@m02 /server/ans/playbooks]# ansible -i hosts all -m shell -a "tail -n 3 /etc/passwd"
……
172.16.1.7 | CHANGED | rc=0 >>
oldboy01:x:3001:3001::/home/oldboy01:/bin/bash
oldboy02:x:3002:3002::/home/oldboy02:/bin/bash
oldboy03:x:3003:3003::/home/oldboy03:/bin/bash
172.16.1.8 | CHANGED | rc=0 >>
oldboy01:x:3002:3002::/home/oldboy01:/bin/bash
oldboy02:x:3003:3003::/home/oldboy02:/bin/bash
oldboy03:x:3004:3004::/home/oldboy03:/bin/bash
……

6.2 字典列表循环

  • 循环列表是字典结构
  • 参数值是item的子标签

6.2.1 添加多个用户,并添加uid、group

  • 剧本:
[root@m02 /server/ans/playbooks]# cat 10.add_users.yaml 
- hosts: alltasks:- name: 1.添加用户组group:name: "{{ item.name }}"gid: "{{ item.gid }}"state: presentloop:- { name: oldboy01, gid: 2010 }- { name: oldboy02, gid: 2011 }- { name: oldboy03, gid: 2012 }- name: 2.添加多个用户,并指定uid,groupuser:name: "{{ item.name }}"uid: "{{ item.uid }}"group: "{{ item.name }}"state: presentloop:- { name: oldboy01, uid: 2010 }- { name: oldboy02, uid: 2011 }- { name: oldboy03, uid: 2012 }
  • 执行并测试:
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 10.add_users.yaml 
……
[root@m02 /server/ans/playbooks]# ansible -i hosts all -m shell -a 'tail -n 4 /etc/passwd'
……
172.16.1.6 | CHANGED | rc=0 >>
skx:x:3001:3001::/home/skx:/sbin/nologin
oldboy01:x:2010:2010::/home/oldboy01:/bin/bash
oldboy02:x:2011:2011::/home/oldboy02:/bin/bash
oldboy03:x:2012:2012::/home/oldboy03:/bin/bash
172.16.1.8 | CHANGED | rc=0 >>
skx:x:3001:3001::/home/skx:/sbin/nologin
oldboy01:x:2010:2010::/home/oldboy01:/bin/bash
oldboy02:x:2011:2011::/home/oldboy02:/bin/bash
oldboy03:x:2012:2012::/home/oldboy03:/bin/bash
……

7. ansible判断

在 Ansible 中,判断(条件控制)主要通过 when 语句实现,它允许你根据变量、事实(facts)或任务执行结果来决定是否执行某个任务或模块。

  • 变量值 is match("pattern"):使用 正则表达式 匹配字符串

7.1 根据系统类型安装软件

  • 系统类型可由facts变量获取
[root@m02 /server/ans/playbooks]# cat 11.install_soft.yaml
- hosts: allgather_facts: truetasks:- name: 1.判断是否是红帽系统yum:name: cowsay,sl,nmap #可以安装多个软件state: latestwhen: ( ansible_distribution is match("Kylin|Rocky") )- name: 2.判断是否是Ubuntu系统apt:name: cmatrix,nyancatstate: latestupdate_cache: yeswhen: ( ansible_distribution is match("Ubuntu|Debian") )
  • 执行并测试:
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 11.install_soft.yaml 
……
TASK [1.判断是否是红帽系统] *************************************************************************************
changed: [172.16.1.6]
changed: [172.16.1.5]
changed: [172.16.1.7]
changed: [172.16.1.9]
changed: [172.16.1.8]
changed: [172.16.1.51]
changed: [172.16.1.41]
changed: [172.16.1.31]
changed: [172.16.1.52]TASK [2.判断是否是Ubuntu系统] ***********************************************************************************
skipping: [172.16.1.5]  # 根据when选项判断,不符合会直接跳过
skipping: [172.16.1.6]
skipping: [172.16.1.7]
skipping: [172.16.1.8]
skipping: [172.16.1.9]
skipping: [172.16.1.51]
skipping: [172.16.1.52]
skipping: [172.16.1.31]
skipping: [172.16.1.41]
……
[root@m02 /server/ans/playbooks]# ssh web01 animalsay 孙克旭很强Authorized users only. All activities may be monitored and reported._______
< 孙克旭很强 >-------\                _\              (_)\   ^__^       / \\  (oo)\_____/_\ \(__)\       ) /||----w ((||     ||>> 

7.2 根据register变量判断系统类型

[root@m02 /server/ans/playbooks]# cat 11.install_soft_register.yaml
- hosts: allgather_facts: falsetasks:- name: 1.获取主机版本shell: "hostnamectl |grep 'Operating System' |awk -F ':' '{print $2}'|xargs"register: os_name- name: 2.输出变量信息debug:msg: "{{ os_name.stdout }}"- name: 3.判断是否是红帽系统yum:name: cowsay,sl,nmapstate: latestwhen: ( os_name.stdout is match ("Kylin|Rocky") )- name: 4.判断是否是Ubuntu系统apt:name: cmatrix,nyancatstate: latestwhen: ( os_name.stdout is match ("Ubuntu|Debian") )

8. jinja2模板

Jinja2 是 Ansible 使用的强大模板引擎,它允许你在配置文件中动态插入变量、使用控制结构和过滤器。

8.1 分发keepalived配置文件

8.1.1 编写keepalived配置文件j2模板

[root@m02 /server/ans/playbooks/files]# cat keepalived.conf.j2 
global_defs {router_id {{ansible_hostname}} # ansible变量
}{% if ansible_hostname in ["lb01","lb01.oldboy.cn"]  %} #j2的判断语句
vrrp_script check_lb.sh {   script /server/scripts/check_lb.shinterval 2weight  1user root 
}
{% endif %}vrrp_instance lb_vip_3  {{% if ansible_hostname in ["lb01","lb01.oldboy.cn"] %}state  MASTERpriority 100#lidao master{% elif ansible_hostname in ["lb02","lb02.oldboy.cn"]  %}state  BACKUPpriority 50#lidao backup{% endif %}interface ens33virtual_router_id 51advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.3/24 dev ens33  label ens33:1}{% if ansible_hostname in ["lb01","lb01.oldboy.cn"]  %}track_script  {check_lb.sh}{% endif %}
}

8.1.2 编写分发文件剧本

  • 使用template模板
[root@m02 /server/ans/playbooks]# cat 12.keepalived.yaml 
- hosts: lbgather_facts: true #j2模板需要facts变量tasks:- name: 1.install #下载keepalivedyum:name: keepalivedstate: present- name: 2.conf #分发keepalived配置文件template:src: ./files/keepalived.conf.j2dest: /etc/keepalived/keepalived.confbackup: true- name: 3.start #启动keepalivedsystemd:name: keepalivedenabled: truestate: restarted

8.2 分发NFS配置文件

8.2.1 为nfs主机组添加分组变量

# 注意路径
[root@m02 /server/ans/playbooks/group_vars]# cat nfs.yaml 
# nfs共享目录
nfs_dirs:- /nfsdata/- /nfs/pics- /nfs/blog- /nfs/zrlog

8.2.2 编写nfs配置文件的j2模板

[root@m02 /server/ans/playbooks/files]# cat exports.j2 
{% for dir in nfs_dirs %} #变量名是分组变量
#nfs服务端目录 {{ dir }}
{{dir}}     172.16.1.0/24(rw,all_squash)
{% endfor %}

8.2.3 编写分发配置文件剧本

[root@m02 /server/ans/playbooks]# cat 13.nfs_exports.yml 
- hosts: nfs tasks: - name: template exports file #分发nfs配置文件template:src: ./files/exports.j2dest: /etc/exportsbackup: true
  • 执行并检查:
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 13.nfs_exports.yml 
……
[root@m02 /server/ans/playbooks]# ssh nfs01 cat /etc/exportsAuthorized users only. All activities may be monitored and reported.
#nfs服务端目录 /nfsdata/
/nfsdata/     172.16.1.0/24(rw,all_squash)
#nfs服务端目录 /nfs/pics
/nfs/pics     172.16.1.0/24(rw,all_squash)
#nfs服务端目录 /nfs/blog
/nfs/blog     172.16.1.0/24(rw,all_squash)
#nfs服务端目录 /nfs/zrlog
/nfs/zrlog     172.16.1.0/24(rw,all_squash)

8.3 分发rsync服务的配置文件

8.3.1 编写rsync主机组分组变量

[root@m02 /server/ans/playbooks/group_vars]# cat bak.yaml
# rsync配置文件中的模块名称和路径
rsync_module:- { name: "data", dir: "/data" }- { name: "backup", dir: "/backup" }- { name: "blog", dir: "/nfs/backup/blog" }

8.3.2 编写rsync服务配置文件的j2模板

[root@m02 /server/ans/playbooks/files]# cat rsyncd.conf.j2
fake super = yes 
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
{% for dir in rsync_module %}
[{{dir.name}}]
comment = by skx
path = {{ dir.dir }}
{% endfor %}

8.3.3 编写分发剧本

[root@m02 /server/ans/playbooks]# cat 14.rsync.yaml 
- hosts: bakgather_facts: falsetasks:- name: 1.分发rsync配置文件template:src: ./files/rsyncd.conf.j2dest: /etc/rsyncd.confbackup: true
  • 测试:
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 14.rsync.yaml 
……
[root@m02 /server/ans/playbooks]# ssh backup cat /etc/rsyncd.confAuthorized users only. All activities may be monitored and reported.
fake super = yes 
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
[data]
comment = by skx
path = /data
[backup]
comment = by skx
path = /backup
[blog]
comment = by skx
path = /nfs/backup/blog

8.4 分发多个nginx域名配置文件

8.4.1 编写web主机组分组变量

[root@m02 /server/ans/playbooks/group_vars]# cat web.yaml 
# nginx域名
domain:- bird- game- blog

8.4.2 编写nginx域名配置文件的j2模板

[root@m02 /server/ans/playbooks/files]# cat oldboy.conf.j2 
server {listen 80;server_name {{ item }}.oldboy.cn;root /app/code/{{ item }};# 设置错误日志error_log /var/log/nginx/{{ item }}.oldboy.cn-error.log notice;# 设置访问日志access_log /var/log/nginx/{{ item }}.oldboy.cn-access.log main;location / {index index.html;}
}

8.4.3 编写分发配置文件剧本

[root@m02 /server/ans/playbooks]# cat 15.nginx_conf.yaml 
- hosts: webgather_facts: falsetasks:- name: 1.分发配置文件template:src: ./files/oldboy.cn.conf.j2dest: /tmp/{{ item }}.oldboy.cn.confloop: "{{ domain }}"
  • 执行:
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 15.nginx_conf.yaml 
……PLAY [web] ******************************************************************************************************TASK [1.分发配置文件] *******************************************************************************************
changed: [172.16.1.9] => (item=bird)
changed: [172.16.1.7] => (item=bird)
changed: [172.16.1.8] => (item=bird)
changed: [172.16.1.9] => (item=game)
changed: [172.16.1.8] => (item=game)
changed: [172.16.1.7] => (item=game)
changed: [172.16.1.9] => (item=blog)
……

9. 思维导图

https://kdocs.cn/join/gpuxq6r?f=101\r\n邀请你加入共享群「老男孩教育Linux运维99期-孙克旭」一起进行文档协作

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

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

相关文章

大模型安全建设:破误区、识风险、筑防线20250714

&#x1f510; 大模型安全建设&#xff1a;破误区、识风险、筑防线作者&#xff1a;Narutolxy&#xff5c;编辑时间&#xff1a;2025年7月在负责公司 AI 产品落地的过程中&#xff0c;一度以为只要选用主流开源大模型&#xff0c;前面加一层“敏感词提示词过滤”&#xff0c;就…

fastadmin中ajax弹窗修改文字为英文

需要把上图的中文改为 切换语言自动切换成英文找到这个文件public/assets/js/backend.js找到如下图部分 // //点击包含.btn-ajax的元素时发送Ajax请求 原页面// $(document).on(click, .btn-ajax,.ajaxit, function (e) {// var that this;// var options $.exte…

大型语言模型(LLM)的技术面试题

大型语言模型(LLM)的技术面试题 目录 大型语言模型(LLM)的技术面试题 一、提示校准:减轻提示学习中的偏见 二、矢量存储的适用场景 三、模型与人类价值观对齐的技术 四、RLHF中的Reward Hacking 五、微调效果的关键影响因素:预训练模型架构与大小 六、Transformer自注意力…

数字IC后端培训教程之数字IC后端项目典型问题解析

今天给大家分享下最近几个典型的数字后端项目案例&#xff0c;希望对大家的学习和工作有所帮助。 数字IC后端培训教程之数字后端项目典型项目案例解析 Q1:星主&#xff0c;有啥办法可以看到refinePlace或者ecoPlace都动到了那些inst吗&#xff0c;log里只会有mean和max move&…

网络(数据库1)

常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:0racle、DB2 中型:MySq1、sQLServer 小型:Sqlite 2.非关系型数据库以键值对存储,且结构不固定。//JSON Redis MongoDB数据存储&#xff1a;变量、数组、链表 内存 &…

6.删除-demo

在连接数据库的基础上deleteResult, err : db.Exec("DELETE FROM user0 WHERE id ?", 1)package main//删除-demoimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""log" )func main() {db, err : sql.Open…

人机协作系列(四)AI编程的下一个范式革命——看Factory AI如何重构软件工程?

最近这段时间&#xff0c;我发现一个很有意思的现象&#xff1a;那些曾经对 AI 编程工具持怀疑态度的技术领袖们&#xff0c;态度正在集体转变。就像 Flask 的作者 Armin Ronacher&#xff0c;他之前还说 “不敢授权 AI”&#xff0c;现在却坦言 “愿意将工程主导权交给编程代理…

在javaScript里删除节点以及添加节点

1.在javaScript里删除节点在学习中我们只学到了一种删除DOM节点的方法那就是通过元素的父元素来删除该元素&#xff0c;但后面我查阅资料发现删除节点还有其他方法。1.使用 removeChild() 方法&#xff08;最常用&#xff09;我们需要获得元素的父元素&#xff0c;如果不知道可…

贪心算法题解——跳跃游戏【LeetCode】

55. 跳跃游戏 一、算法逻辑&#xff08;逐步思路&#xff09; 问题描述&#xff1a; 给定一个非负整数数组 nums&#xff0c;其中 nums[i] 表示从位置 i 最多可以跳跃的步数。 从起点 0 出发&#xff0c;判断是否能够到达最后一个位置。 解题思路&#xff1a; 设一个变量 mx…

复现永恒之蓝

一.打开msf找到永恒之蓝的漏洞直接运行这个漏洞二.查询这个漏洞模块需要配置的参数配置攻击主机的ip三.没有做免杀的话&#xff0c;记得关闭防火墙四.直接运行这里已经显示拿下目标主机五.测试给目标主机添加一个文档六.查看目标主机有没有刚才编写的文档

游戏行业中的恶梦:不断升级的DDoS攻击

近年来&#xff0c;游戏行业快速发展&#xff0c;成为全球娱乐市场的重要组成部分。然而&#xff0c;伴随着这一行业的繁荣&#xff0c;网络安全问题也随之而来。游戏公司面临着一种特殊的威胁&#xff1a;分布式拒绝服务&#xff08;DDoS&#xff09;攻击。这种攻击不仅对公司…

2025年自动化工程、物联网与计算机应用国际会议(AEITCA 2025)

2025年自动化工程、物联网与计算机应用国际会议&#xff08;AEITCA 2025&#xff09; 2025 International Conference on Automation Engineering, Internet of Things, and Computer Applications一、大会信息会议简称&#xff1a;AEITCA 2025 大会地点&#xff1a;中国西安 审…

Gartner《JavaScript: Top Use Cases, Frameworks and Architecture Constraints》学习心得

《JavaScript: Top Use Cases, Frameworks and Architecture Constraints》是一份面向企业技术决策者、软件架构师与高级工程师的系统性研究笔记。全文以“何时用 JavaScript、如何用好 JavaScript”为主线,从语言特性、运行时差异、适用场景、主流框架、架构约束、生态现状、…

比较vue和react框架

目录 一、基础语法 1.1、模板 vs JSX 1.2、指令 1.2.1、v-for vs Array.map 1.2.2、v-if vs 三元运算符或者&& 1.2.3、v-bind vs 直接在JSX里写{变量} 1.2.4、v-show vs style和className 1.2.5、v-html vs dangerouslySetInnerHTML 1.3、数据绑定 1.4、数据…

插板式系统的“生命线“:EtherCAT分布式供电该如何实现?

在ZIO系列插板式模组系统中&#xff0c;EtherCAT分布式供电如同设备的血液循环网络&#xff0c;其供电稳定性直接决定系统可靠性。本文将从电流计算到电源扩展&#xff0c;为您讲解EtherCAT分布式供电该如何实现。ZIO系列插板式模组的电源介绍ZIO系列插板式I/O模块 是ZLG开发的…

Qwen2-VL:提升视觉语言模型对任意分辨率世界的感知能力

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" Qwen2-VL&#xff1a;提升视觉语言模型对任意分辨率世界的感知能力 摘要 我们提出了 Qwen2-VL 系列&#xff0c;这是对先前 Qwen-VL 模型的重大升级&#xff0c;重新定义了视觉处理中传统的预设分辨率方法。Qwe…

C++类模版与友元

全局函数类内实现-直接在类内声明友元即可全局函数类外实现-需要提前让编译器知道全局函数的存在#include <iostream> using namespace std;//通过全局函数来打印Person的信息template<class T1,class T2> class Person{//全局函数&#xff0c;类内实现friend void…

Linux Java环境配置

1.进入java官网&#xff0c;点击Java archive Java Downloads | Oracle 中国https://www.oracle.com/cn/java/technologies/downloads/ 2.然后下滑选择你要安装的java版本&#xff0c;这里我选择的是java8 3.依据系统架构选择版本安装&#xff0c;x86&#xff0c;x64&#xf…

flutter app内跳转到其他安卓 app的方法

flutter 内的关键代码导包&#xff1a;url_launcher: ^6.3.1跳转逻辑&#xff1a;onPressed: () async {await launchUrl(Uri.parse(demoname://));},安卓内的关键代码<intent-filter><action android:name"android.intent.action.VIEW" /><category …

医疗资质OCR智能审核:让合规管理更高效、更精准

在医疗行业&#xff0c;资质证件的审核是确保机构合规运营的关键环节。从医疗机构执业许可证到医师资格证&#xff0c;从药品经营许可证到医疗器械注册证&#xff0c;传统人工审核方式效率低下且容易出错。现在&#xff0c;医疗资质OCR智能审核解决方案正在重塑行业标准&#x…