Ansible自动化管理 - 指南

news/2025/9/24 17:22:30/文章来源:https://www.cnblogs.com/slgkaifa/p/19109614

Ansible自动化管理 - 指南

一、定义

1、ansible是什么

ansible是一个批量管理远程主机的自动化工具
可以实现的功能:

    1、执行一次性的批量任务

    2、将任务编排起来存到一个文件中形成一个playbook剧本(可以重复执行)


    任务举例:
        1、基础命令
        2、配置管理
        3、应用程序部署

2、为何要用它?什么场景下使用?

    当管理的主机规模由几十台到了上百台、上千台的时候,手动管理非常低效且复杂
            1、一台一台的机器连接登录非常低效
            2、重复操作多,无法统一管理,哪怕写脚本也非常麻烦
            3、重复操作多,出错率非常高            
    此时就需要用自动化运维工具了


    自动化运维工具很多,为何用ansible

        puppet:配置复杂,适用于大规模系统管理        
        ansible:轻量级易用    
saltstack: C/S架构,salt-master和salt-minion,并行的,大规模批量操作的情况下,会比Ansible速度快一些,底层使用的是zero-MQ消息队列

3、特点

    1、Agentless:不需要再被管理节点上安装客户端,只要有sshd即可

    2、Serverless:在服务端不需要启动任何服务,只需要执行命令就行,使用时才启动对应进                程,进程用完立即结束,所以修改配置文件会直接生效不需重启
    3、Modules in any language:基于模块工作,可以使用任意语言开发ansible模块
    4、YAML, not code:使用yaml语言定制playbook进行任务编排,管理复杂任务非常方便
    5、SSH by default:默认使用ssh控制各节点
    6、Strong multi-tier solution:可实现多级控制
    7、Ansible 的开发语言是 Python、便于运维进行二次开发

    8、幂等性
    连续多次执行与只执行一次的结果完全一样,即多次执行不会产生副作用    
    许多自带模块提供幂等判断机制,这c

    比如通过 cron 模块添加定时任务时,如果任务已经存在,那么不会重复添加

    幂等性:
        1、算术运算时数值加0是幂等的    
        2、比如执行systemctl stop xxx命令来停止服务是幂等的(停一次和停多次效果是一样的)
        3、而systemctl restart xxx是非幂等的(存在起来和没起来的情况)


###    连续多次执行与只执行一次的结果完全一样,这就叫幂等性,即多次执行不会
        产生任何副作用


        在分布式系统中,幂等性判断机制就能确保数据的一致性和操作的有效性                       

二、架构与执行

1、架构

控制端:安装ansible的一端(插件

被控端:安装sshd的一端(模块

1.连接插件connection plugins:用于连接主机/被管理端
2.核心模块core modules      :总控, 它负责调用具体的模块来做具体的事情
3.自定义模块custom modules  :根据自己的需求编写具体的模块
4.插件plugins               :完成模块功能的补充,例如Email、loggin
5.任务副本/剧本Play Books   :剧本playbook  ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
6.主机清单Host inventor     :定义ansible需要操作的主机信息

强调:
1、ansible是模块化的 它所有的操作都依赖于模块

### 2、模块与插件的区别:
          (1)模块会被上传到被控制主机上,在被控制主机上执行
          (2)插件在控制主机上,被 Ansible 调度执行
3、尽量使用 Ansible 自带的模块,而不是 shell 脚本,因为 Ansible 的很多模块提供幂等判断机制


2、执行

ad-hoc模式:在命令行执行一次性命令,命令行模式    
playbook模式:把任务写到yaml文件中,称之为剧本,可以重复执行

ansible执行流程:
读取配置文件;
通过规则,过滤inventory中定义的主机列表;
通过连接插件,连接到被控制主机;
将task对应的模块文件打包成python脚本文件;
将python脚本文件上传到远程服务器的临时目录(~/.ansible/tmp);
给文件加执行权限;
执行脚本,并收集结果(退出码、标准输入、标准输出);
删除临时文件。

三、部署


1、环境规划

        m01: 192.168.71.111   控制端        
        backup:192.168.71.112  被控端
        db01:192.168.71.113    被控端
        web01:192.168.71.114   被控端
        web02:192.168.71.115   被控端
        nfs:192.168.71.116     被控端

2、安装

#1、安装epel源(centos9也可以用这个源,因为依赖的是python环境)
[root@m01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#2、安装Ansible
[root@m01 ~]# yum install -y ansible

#3、安装完毕后会得到
配置文件
/etc/ansible/ansible.cfg `主配置文件,配置ansible工作特性`
/etc/ansible/hosts `主机清单`
/etc/ansible/roles `存放角色的目录`


程序/命令
/usr/bin/ansible          `主程序,临时命令执行工具,ansible --version查看版本,man ansible查看帮助`
/usr/bin/ansible-doc      `查看配置文档,模块功能查看工具`
/usr/bin/ansible-galaxy   `下载/上传优秀代码或Roles模块的官网平台`
/usr/bin/ansible-playbook `定制自动化任务,编排剧本工具`
/usr/bin/ansible-pull     `远程执行命令的工具`
/usr/bin/ansible-vault    `文件加密工具`
/usr/bin/ansible-console  `基于Consol`

3、配置文件

/etc/ansible/ansible.cfg 主配置文件

[root@m01 ~]# cat /etc/ansible/ansible.cfg  
[defaults]
#inventory      = /etc/ansible/hosts      #主机列表配置文件
#library        = /usr/share/my_modules/  #库文件存放目录
#remote_tmp     = ~/.ansible/tmp          #临时py文件存放在远程主机目录
#local_tmp      = ~/.ansible/tmp          #本机的临时执行目录

#forks          = 5                       #forks 是非常重要的、优化时需要重点关注的参数。 Ansible 会创建 forks 个子进程,并发地管理多台被控主机, 默认值是 5,随着被管理主机的增多,需要适当调大
#sudo_user      = root                    #默认sudo用户
#ask_sudo_pass = True                     #每次执行是否询问sudo的ssh密码
#ask_pass      = True                     #每次执行是否询问ssh密码
#remote_port    = 22                      #远程主机端口
#timeout        = 60                      # ssh 连接的超时时间,单位是秒 

host_key_checking = False                 #Ansible 在通过 ssh 连接被控主机时,是否检查其公钥
log_path = /var/log/ansible.log           #ansible日志

#普通用户提权操作
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

/etc/ansible/hosts 主机清单文件

主机清单(定义被管理的机器的链接信息),ansible支持两种
        1、静态清单
            被管理机器的信息定义在本地文件中        
        2、动态清单
            被管理机器的信息被某个平台管理(存在数据库中,比如 CMDB、LDAP 等)

静态清单:

[root@m01 ~]# vim /etc/ansible/hosts 
[web01]      # 一个组里可以只容纳一台机器(变量直接跟在后面)
192.168.71.14 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass='1'

[web_group1] # 一个组里也可以容纳多台机器
192.168.71.14 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass='1'
192.168.71.15 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass='1'

[nfs]
192.168.71.16 ansible_ssh_pass='1' # 默认22号端口,用户名默认与ansible命令所处用户保持一致

[db]
192.168.71.13
[db:vars] # 为db组指定变量,采用密码登录(将变量单拎出来,像上面一样直接跟在后面也可以)
ansible_ssh_pass='1'

[backup]
192.168.71.12
[backup:vars] # 为backup组指定变量采用密钥登录,前提你必须对目标主机做好ssh密码登录才行
ansible_ssh_private_key_file=/root/.ssh/id_rsa

[www:children]  # 前面的小组都属于某一个业务,那我们可以整合为一个大组命名为www,www:children代表www这个大组下面包含多个小组
web_group1
nfs
db
backup

补充:

  1. 如果说环境中主机均做了ssh密钥登陆,那么主机清单文件只写ip就ok
    [root@m01 ~]# vim /etc/ansible/hosts 
    [web01] 
    192.168.71.14
    [web_group1]
    192.168.71.14
    192.168.71.15

    制作密钥登录
    ssh-keygen 
    ssh-copy-id root@192.168.71.14
    ssh-copy-id root@192.168.71.15 
  2. 查看
    [root@lb ansible]# ansible web01 --list-host
      hosts (1):
        192.168.71.14

四、模块


命令模块

# command
默认模块,远程执行命令
ansible web01 -m command -a 'free -m'
不支持特殊字符
ansible web01 -m command -a "ifconfig eth0 | awk 'NR==2 {print \$2}'"
​
​
# shell
ansible web01 -m shell -a 'free -m'
支持特殊字符
ansible web01 -m shell -a "ifconfig eth0 | awk 'NR==2 {print \$2}'"
​
​
# scripts
远程执行在控制机上的脚本
​
在控制机上
vim mkdir.sh
#!/bin/bash
mkdir /dir
​
ansible web_group -m script -a 'mkdir.sh'

软件管理模块

# yum
安装与卸载
# yum_repository
添加yum源

文件管理模块

# copy
本地文件上传到远程主机
# file
在目标主机上进行文件的一系列操作
# get_url
下载网站上的文件

ansible服务管理模块

# service / systemd
服务的启动、停止、重启、重载、开机自启

用户管理模块

# group
用户组操作
# user
用户的创建、删除及相关信息管理

其他模块

# cron
定时任务模块
# mount
挂载模块
# selinux
状态管理
# firewalld
配置及状态管理
# unarchive / archive
解压与压缩模块
​
# setup
内置模块,用于收集远程主机的详细系统信息(`facts`)
默认为true,play开始时自动调用,可关闭
- name: Skip gathering facts examplehosts: allgather_facts: false  # 设置为falsetasks:   - name: Print a message     debug:       msg: "Facts gathering is disabled."
获取web01主机所有信息
ansible web01 -m setup
获取主机IP
ansible web01 -m setup -a 'filter=ansible_default_ipv4'
获取主机名
ansible web01 -m setup -a 'filter=ansible_fqdn'
`常用参数`
ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_devices:仅显示磁盘设备信息。
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_eth0:仅显示eth0的信息。
ansible_hostname:仅显示主机名(不准确)
ansible_fqdn:仅显示主机名。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:显示cpu个数(只显示总的个数)。



五、ansible的两种使用方式

    ad-hoc模式:在命令行执行一次性命令,命令行模式    
    playbook模式:把任务写到yaml文件中,称之为剧本,可以重复执行

    总结下来就2点区别:
        1、简单任务可以用ad-hoc模式,复杂还是得用playbook        
        2、要重复执行的批量任务必须用playbook

ad-hoc模式

    ansible 匹配模式 -m 模块名 -a "传给模块的参数或选型"

    1、匹配模式:用来匹配被控制的机器,匹配的对象包含主机组名以及主机名或ip地址    
    2、模块名:模块被转换成python脚本然后分发到远程主机上执行,
建议用内置的模块(幂等性判断比较完善)
    3、-a后跟的是传给模块的参数,是可选项

    ad-hoc结果返回颜色
绿色: 代表被管理端主机没有被修改
黄色: 代表被管理端主机发现变更
红色: 代表出现了故障,注意查看提示

匹配模式----匹配被控制端
        注意两点:
            1、匹配的是存在于主机清单的组名或者组下的主机名或ip地址
            2、pattern建议统一都用单引号包裹来进行硬引用,防止特殊符号被bash解析而无法正常传递给ansible                

        具体用法:
            1、匹配主机组名:
            ansible 'web_group1' -m ping     # 组名
            ansible 'www' -m ping                       
            2、也可以匹配到组下的某个主机名或ip地址:
            ansible '192.168.71.115' -m ping  

            All :表示所有Inventory中的所有主机             
            ansible 'all' -m ping

            3、* :通配符:                
                ansible '*' -m ping            
                ansible 'web*' -m ping
                ansible '192.168.71.11*' -m ping

            4、正则表达式:~前缀代表启用正则,用的就是python的正则            
                ansible '~^n.*' -m ping
                ansible '~(nfs|db)' -m ping                        

模式匹配支持:与、或、非       
            逻辑或:':'
                ansible 'group1:group2:192.168.71.15' -m ping  # 存在于group1或group2中的主机或者是主机192.168.71.15         
            逻辑与 ':&'
                ansible 'group1:&group2' -m ping # 在group1组并且也在group2组内的主机         
            逻辑非 ':!'
                ansible 'group2:!group1' -m ping  # 存在于group2但不存在于group1,注意一定要用单引号         
            综合逻辑
                ansible 'group1:&group2:&group3:!group4' -m ping # 同时在group1、group2、group3中,但不在group4中                   

补充:
#1、列出所有模块
ansible-doc -l
#2、查看指定模块的用法:ansible-doc -s <module_name>
ansible-doc -s ping
ansible-doc -s command

playbook模式

    剧本的内容是定义在一个yaml文件中的,该文件称之为一个playbook
    而一个playbook可以包含多个play,每个paly由三个重要部分组成

    # 1、运行前先检查语法
    ansible-playbook --syntax-check  a.yaml 
    # 2、可以测试playbook的执行情况,但是不会真的执行(可选)
    ansible-playbook -C  a.yaml     
    # 3、真正执行
    ansible-playbook a.yaml -vvv

简单示例:

# 1、创建用户
- hosts: all
remote_user: root
vars:
user: "www"
tasks:
- name: create  user
user:
name: "{{ user }}"
shell: /sbin/nologin
# 2、部署配置httpd
- hosts: web_group1
remote_user: root
tasks:
- name: latest httpd version installed
yum:
name: httpd
state: latest
- name: correct index.html is present
copy:
src: /tmp/index.html
dest: /var/www/html/index.html
- name: Directory authorization
command: "chown -R www.www /var/www/html"
- name: 干掉之前残留的nginx
command: "pkill -9 ginx"
- name: start httpd service
systemd:
name: httpd
state: started
enabled: true

六、ad-hoc模式


ansible 匹配模式 -m 模块名 -a "传给模块的参数或选型"
​
1、匹配模式:用来匹配被控制的机器,匹配的对象包含主机组名以及主机名或ip地址
2、模块名:模块被转换成python脚本然后分发到远程主机上执行,建议用内置的模块(幂等性判断比较完善)
3、-a后跟的是传给模块的参数,是可选项
​
ad-hoc结果返回颜色  **绿色**: 代表被管理端主机没有被修改  **黄色**: 代表被管理端主机发现变更  **红色**: 代表出现了故障,注意查看提示
注意:
1、匹配的是存在于主机清单的组名或者组下的主机名或ip地址
2、pattern建议统一都用单引号包裹来进行硬引用,防止特殊符号被bash解析而无法正常传递给ansible

补充:
1、列出所有模块
ansible-doc -l
2、查看指定模块的用法:ansible-doc -s
ansible-doc -s ping
ansible-doc -s command
# 搜EXAMP 可以看到示例

七、playbook模式


1、概念

1、运行前先检查语法
ansible-playbook --syntax-check  a.yaml
2、可以测试playbook的执行情况,但是不会真的执行(可选)
ansible-playbook -C  a.yaml
3、真正执行
ansible-playbook a.yaml -vvv

部署对接配置

(1)本机提前写好配置文件拷贝覆盖至其他服务器 例如:yum源直接可以写好yaml文件远程拷贝到目标主机的对应目录下不用命令执行yum_repository

(2)安装组件相关的模块 (3)框架自定义变量

2、构成---四部分

1、Target section: 定义远程主机、用户、连接信息 2、Variable section: 定义playbook运行时需要使用的变量 3、Task section: 定义将要在远程主机上执行的任务列表 4、Handler section: 定义task执行完成以后需要触发的任务

忽略流程中的一个错误,使后续任务继续进行 ignore_errors: yes

- hosts: web_grouptasks:   - name: Check Httpd Server     #使用命令检查服务启动状态时,如果服务没有启动则会得到错误结果,剧本会停止运行     command: systemctl is-active httpd     #配置忽略错误可以继续执行剧本     ignore_errors: yes     register: check_httpd   - name: debug outprint     debug:       msg: "{{ check_httpd }}"   - name: Httpd Restart     service:       name: httpd       state: restarted     when: check_httpd.rc == 0

handler触发器

#关键特征:
无论它被通知多少次,每次 playbook 运行,每个 handler 只会执行一次,并且只有在所有任务都执行完毕后,handler 才会执行。handler自己不会主动执行,一定是被别人notify执行的。
​
主要在以下场景中使用:
(1)配置改变后需要重启服务
(2)在多个任务完成后执行一次操作
(3)在长期运行的任务完成后执行操作(比如清理工作)

3、语法---流程控制

条件语句

- 判断某个条件成立,则执行某个task
- when关键字后面跟着的是python的表达式,在表达式中你能够使用任何的变量或者fact,当表达式的结果返回的是false,便会跳过本次的任务
​
​
​
cat test1.yaml
- hosts: group3tasks:   - name: Install httpd     yum:       name: httpd       state: present     when: ansible_distribution == "Rocky"   - name: Install nginx     yum:       name: nginx       state: present     when: ansible_distribution == "CentOS"
# 逻辑或
when: ansible_distribution == "Rocky" or ansible_distribution == "CentOS"
# 逻辑与
when: ansible_distribution_version == "9.3" and ansible_kernel == "5.14.0-362.8.1.el9_3.x86_64"
when: - ansible_distribution_version == "9.3" - ansible_kernel == "5.14.0-362.8.1.el9_3.x86_64"
# 组合
when: =>( ansible_distribution == "Rocky" and ansible_distribution_major_version == "9" )or( ansible_distribution == "CentOS" and ansible_distribution_major_version == "7")

循环语句

循环就是重复做某件事,对应loop语法(Ansible2.5版本中新增)
​
(1)正常使用
- hosts: group1tasks:   - name: httpd and crond are running     service:       name: "{{ item }}"  # item是固定的变量名       state: restarted     loop:       - crond       - httpd
(2)提前赋值变量
# cat /workspace/my_vars.yaml
test_services: - crond - httpd
# cat install_pkgs.yml
- hosts: group1vars_files:   - /workspace/my_vars.yamltasks:   - name: postfix and crond are running     service:       name: "{{ item }}"       state: started     loop: "{{ test_services }}"

任务标签

- 在大型项目当中,通常一个playbook会有非常多的task。我们可能只是想要执行其中的一部分任务而已,并不想把整个playbook完整跑一遍。
- Ansible的标签(tag)功能可以给单独任务甚至整个playbook打上标签,然后我们利用这些标签来指定要运行playbook中的个别任务,或不执行指定的任务。
​
​
- hosts: nginx   - name: Config Nginx Server     copy:       src: /etc/nginx/nginx.conf       dest: /etc/nginx/     notify: restart_nginx     # 格式1     tags:       - reconf_nginx       - reconfig_nginx     # 格式2     # tags: ["reconf_nginx","reconfig_nginx"]     # 格式3:     # tags: ["reconf_nginx","reconfig_nginx"]
#查看标签
ansible-playbook 1.yml --list-tags
#指定tag运行
ansible-playbook  1.yml --tags "install_httpd"
ansible-playbook  1.yml --tags "conf_httpd,start_httpd"
ansible-playbook  1.yml --skip-tags "install_httpd" # 除了它其他task都执行

4、Jinja2模板

#jinja2是什么
Jinja2 是一个用 Python 开发的高性能模板引擎
​
在纯文本字符串中嵌入一些特殊语法格式的表达式,将其中嵌入的特殊语法部分解析替换成对应的结果字符串,解析并替换模板表达式的过程称为渲染。
​
#Jinja2与Ansible啥关系
Ansible通常会使用jinja2模板来修改被管理主机的配置文件等
如果在100台主机上安装redis,每台redis的监听地址都不一样,如何解决?
​
#Ansible如何使用Jinja2
使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。
​
#Ansible使用Jinja2注意事项
Ansible允许jinja2模板中使用模版语法的条件判断和循环,但是这些语法不允许在playbook中使用。

语法

#变量
{{ EXPR }} 引用变量值,模版文件与剧本文件中都可以用该语法引用变量
​
#条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% endif %}
​
#循环表达式
{% for i in EXPR %}
{% endfor %}
​
#Jinja2模板注释语法
{# COMMENT #}

示例:负载均衡

#playbook
[root@lb workspace]# cat lb.yaml
- hosts: group5vars_files: /workspace/upstream_vars.ymltasks:   - name: Config Nginx Upstream     template:       src: /workspace/upstream.j2       dest: /etc/nginx/conf.d/upstream.conf     notify: restert_upstream   - name: Start Nginx Server     systemd:       name: nginx       state: startedhandlers:   - name: restert_upstream     systemd:       name: nginx       state: restarted
​
​
#配置文件
#参考:正常的配置文件
[root@m01 workspace]# vim upstream.conf
upstream web {   server 172.16.1.7;   server 172.16.1.8;
}
server {   listen 80;   server_name linux.wp.com;   location / {       proxy_pass http://web;       proxy_set_header Host $http_host;   }
}
#编写:不正经的配置文件
[root@m01 workspace]# vim /workspace/upstream.j2
upstream {{ server_name }} {
{% for i in range(7,20) %}   server {{ net_ip }}.{{ i }};
{% endfor %}
}
server {   listen {{ web_port }};   server_name {{ server_name }};   location / {       proxy_pass http://{{ server_name }};       proxy_set_header Host $http_host;   }
}
​
​
#变量配置
cat > /workspace/upstream_vars.yml << "EOF"
server_name: linux.wp.com
web_port: 80
net_ip: 172.16.1
EOF

5、剧本的重用与解耦

1、不同业务逻辑应该扔到不同的文件中 2、不同的文件应该放到不同的文件夹中(文件夹的命名应该见名知意)

#实现方式---类似于建立文件夹管理
1、include
2、Roles(工程化开发一个项目)

include

#用include tasks指令来引入task文件
[root@m01 project]# vim main.yml
- hosts: group5tasks:   - include_tasks: /workspace/play1.yml   - include_tasks: /workspace/play2.yml#用import playbook来直接复用一整个剧本[root@m01 project]# cat main.yml
- import_playbook: ./base.yml
- import_playbook: ./nginx.yml
- import_playbook: ./php.yml
- import_playbook: ./wordpress.yml
- import_playbook: ./mariadb.yml

ansible roles

对每个组件创建角色进行模块化统一管理
​
# ansible-galaxy init first_role(快速创建一个符合Role文件组织规范的框架)
[root@lb workspace] tree first_role/
first_role/       # 角色名称,或者叫项目名
├── README.md
├── defaults      # 默认的变量(优先级很低)
│   └── main.yml
├── files         # 存放文件,使用copy模块时自动获取
├── handlers      # 存放触发器的配置
│   └── main.yml
├── meta          # 依赖的服务,执行该项目时先执行其他的项目
│   └── main.yml
├── tasks         # 默认执行的playbook
│   └── main.yml
├── templates     # 存放jinja2模板,使用template模块时自动获取
├── tests
│   ├── inventory
│   └── test.yml
└── vars          # 存放变量   └── main.yml

补充:

#依赖
vim /etc/ansible/roles/wordpress/meta/main.yml
dependencies: - { role: nginx } - { role: php }
如果编写了meta目录下的main.yml文件,那么Ansible会自动先执行meta目录中main.yml文件中的dependencies文件,如上所示,就会先执行nginx和php的安装。
​
​
#变量
(1)roles/xxx/defaults/main.yml 用于定义Role的默认变量(优先级最低)
(2)roles/xxx/vars/main.yml 用于定义其它变量

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

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

相关文章

flink不同环境切换 - --

代码: package com.yourcompany.flink; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;import java.util.Properties; /** * 最简版 - 所有代码在一个文件中 */public class Minima…

网站原则广州网站开发公司

RabbitMQ&#xff1a;高效的消息队列中间件及其 PHP 实现 一、什么是 RabbitMQ&#xff1f; RabbitMQ 是一个开源的消息队列中间件&#xff0c;使用 Erlang 编写&#xff0c;遵循 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议。它的主要功能是提供一种…

ps-填充色

ps-填充色一、填充颜色用矩形选框选中范围; Ctrl + delete:填充背景色; Alt + delete:填充前景色;不将就,不强求!

PythonStudio_圆的面积demo源代码

# Powered By Python Studio, The best Python GUI IDE to download from glsite.com. import os from glcl import *class Form1(Form):def __init__(self, owner):self.Button3 = Button(self)self.Button2 = Button…

HarmonyOS 5分布式数据同步实战:跨设备待办事项应用

🔧 一、前期准备:配置与权限 在开始编码前,需要进行一些基础配置。模块配置 (module.json5): 在 module.json5文件中申请分布式数据同步权限。 {"module": {"requestPermissions": [{"na…

深入理解HarmonyOS 5的AVSession:构建跨设备媒体播放器

🎯 一、AVSession 概述与核心价值 AVSession(媒体会话)是HarmonyOS分布式媒体控制的核心框架。它允许应用程序将本地播放的媒体信息和控制能力暴露给系统,使得其他设备(如手机、平板、智慧屏)可以发现、查看和控…

Extjs小例子

Extjs小例子 1.监听文本框是否已经修改过xtype : textfield,  fieldLable : 标题,  listeners : {     change : function(field,newValue,oldValue){ alert(newValue+---+oldValue);  …

郑州网站建设怎么样短视频推广方案怎么做

随着半导体技术的不断进步&#xff0c;晶圆制造作为集成电路产业的核心环节&#xff0c;对生产过程的精密性和洁净度要求日益提高。在众多晶圆制造工具中&#xff0c;PFA&#xff08;全氟烷氧基&#xff09;晶圆夹以其独特的材质和性能&#xff0c;在近年来逐渐受到业界的广泛关…

HT-AD4PS-1+ 一分四射频功分器:1-500 MHz 小尺寸/低插损,通信、医疗全能打

HT-AD4PS-1+ 一分四射频功分器:1-500 MHz 小尺寸/低插损,通信、医疗全能打成都恒利泰(HenryTech)HT-AD4PS-1+ 是一款全国产化的一分四表贴功分器/合路器,频率覆盖 1-500 MHz,插入损耗≤1.8 dB,体积小巧,可直接…

HarmonyOS资源管理与访问:多分辨率与多语言适配

本文将深入探讨HarmonyOS应用开发中的资源管理机制,重点介绍多分辨率适配和多语言本地化的完整解决方案。1. 资源管理系统架构 HarmonyOS提供了统一的资源管理框架,支持应用资源的分类、访问和适配。资源管理系统采用…

面试官:为什么没有虚拟线程池?

Java 官方文档明确指出:Do not pool virtual threads. 虚拟线程不是昂贵资源,永远不应该被池化。 应该为每个任务创建一个新的虚拟线程,它们应该是短暂的、任务级别的。这是为什么呢?为什么只有虚拟线程 Virtual T…

做外国网站自媒体网络工程师和做网站哪个难

————— 第二天 —————————————————下面我们一起来研究这三个问题。问题1&#xff1a;哪些是需要回收的&#xff1f;首先我们需要知道如何哪些垃圾需要回收&#xff1f;判断对象是否需要回收有两种算法。一种是引用计数算法、一种是可达性分析算法。引用计…

润生软件简介:以“重构与共生”引领商业未来

2014年,广东企业家陈总敏锐洞察到:当算力实现百倍跃升,数字信息将深刻重塑社会结构,传统行业与企业形态面临全面重构。基于此,他发起创立了润生公司(Reconstruction-Symbiosis Framework,简称RS),开启一场以“…

Python 并发编程

Python 并发编程是提升程序执行效率的核心技术,尤其在处理多任务场景(如网络请求、数据计算、文件 IO 等)时至关重要。 1、threading与线程池 多线程是 Python 中最常用的并发方式之一,通过创建多个线程实现任务并…

博物馆展陈设计公司搜索引擎优化什么意思

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 目标&#xff08;任务驱动&#xff09; 1.请重点的掌握I/O的。 场景&#xff1a;最近你在企业也想搞一个短视频又想搞一个存储的云盘&#xff0c;你一听回想到自己对于这些存储的基础还不是很清楚&#xff0c;于是回家开始了…

做液压的公司网站成都营销型网站建设中账号

文章目录 1. 命令概述2. 命令格式3. 常用选项4. 相关描述4.1 tree 命令安装 5. 参考示例5.1 创建树形目录5.2 使用 tree 命令查看树形目录 1. 命令概述 tree 命令用于在命令行界面以树状图形式显示目录及其子目录的内容。这个命令递归地列出所有子目录&#xff0c;并可选择显示…

安装pyautogui时与setuptool时冲突报错-module setuptools.dist has no attribute check_test_suite

采用离线的安装方式: 下载 命令: pip install E:\Codes\Wheels\PyAutoGUI-0.9.54.tar.gz --no-deps --target=..\myyolo1\Lib\site-packages

牛客周赛 Round 110 题解

View Post牛客周赛 Round 110 题解牛客周赛 Round 110 A 小苯的数字染色 ​ 手玩发现只有 \(n\) 为 \(1\) 不行。 void solve(){int n;cin >> n;if(n == 1){cout << "NO\n";}else{cout <<…

统计机器学习经典分类算法MATLAB实现

一、逻辑回归(Logistic Regression) 核心代码: % 加载数据(以鸢尾花数据集为例) load fisheriris; X = meas(:,1:2); % 选择前两个特征 Y = species;% 数据划分 cv = cvpartition(Y, HoldOut, 0.3); X_train = X(…

从安装到中文界面,一文带你玩转 DaVinci Resolve 20(零基础也能搞定)

软件介绍 DaVinci Resolve Studio v20.0.49是Blackmagic Design推出的专业影视后期制作软件,集成剪辑、调色、视觉特效、动态图形与音频后期功能于一体。该版本新增超100项创新功能,包括基于AI的UltraNR降噪工具、智…