Ansible playbook 详解与实战操作

一、概述

  • playbookad-hoc 相比,是一种完全不同的运用 ansible 的方式,类似与 saltstack 的 state 状态文件。ad-hoc 无法持久使用,playbook 可以持久使用。

  • playbook 是由一个或多个 play 组成的列表,play 的主要功能在于将事先归并为一组的主机装扮成事先通过 ansible 中的 task 定义好的角色。

  • 从根本上来讲,所谓的 task 无非是调用 ansible 的一个 module。将多个 play 组织在一个 playbook 中,即可以让它们联合起来按事先编排的机制完成某一任务。

参考文档:https://ansible-tran.readthedocs.io/en/latest/docs/playbooks.html

Ansible 的基础介绍和环境部署可以参考这篇文章:

图片

二、playbook 核心元素

  • Hosts 执行的远程主机列表

  • Tasks 任务集

  • Varniables 内置变量或自定义变量在 playbook 中调用

  • Templates 模板,即使用模板语法的文件,比如配置文件等

  • Handlers 和 notity 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行

  • Tags 标签,指定某条任务执行,用于选择运行 playbook 中的部分代码。

三、playbook 语法(yaml)

  • playbook 使用yaml语法格式,后缀可以是yaml,也可以是yml

  • YAML( /ˈjæməl/ )参考了其他多种语言,包括:XML、C 语言、Python、Perl 以及电子邮件格式 RFC2822,Clark Evans 在 2001 年 5 月在首次发表了这种语言,另外 Ingy döt Net 与 OrenBen-Kiki 也是这语言的共同设计者。

  • YAML 格式是类似 JSON 的文件格式。YAML 用于文件的配置编写,JSON 多用于开发设计。

1)YAML 介绍

1、YAML 格式如下
  • 文件的第一行应该以“---”(三个连字符)开始,表明 YAML 文件的开始。

  • 在同一行中,#之后的内容表示注释,类似于 shell,python 和 ruby。

  • YAML 中的列表元素以“-”开头并且跟着一个空格。后面为元素内容。

  • 同一个列表之中的元素应该保持相同的缩进,否则会被当做错误处理。

  • play 中 hosts、variables、roles、tasks 等对象的表示方法都是以键值中间以“:”分隔表示,并且“:”之后要加一个空格。

2、playbooks yaml 配置文件解释
Hosts:运行指定任务的目标主机
remoute_user:在远程主机上执行任务的用户;
sudo_user:
tasks:任务列表tasks的具体格式:tasks:- name: TASK_NAMEmodule: argumentsnotify: HANDLER_NAMEhandlers:- name: HANDLER_NAMEmodule: arguments##模块,模块参数:
格式如下:(1)action: module arguments(2) module: arguments
注意:shell和command模块后直接加命令,而不是key=value类的参数列表handlers:任务,在特定条件下触发;接受到其他任务的通知时被触发;
3、示例
---
- hosts: webremote_user: roottasks:- name: install nginx        ##安装模块,需要在被控主机里加上nginx的源yum: name=nginx state=present- name: copy nginx.conf    ##复制nginx的配置文件过去,需要在本机的/tmp目录下编辑nginx.confcopy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf backup=yesnotify: reload    #当nginx.conf发生改变时,通知给相应的handlerstags: reloadnginx    #打标签- name: start nginx service    #服务启动模块service: name=nginx state=startedtags: startnginx    #打标签handlers:- name: reloadservice: name=nginx state=restarted

2)variables 变量

variables 变量有四种定义方法。如下:

1、facts:可以直接调用

ansible 中有 setup 模块,这个模块就是通过 facts 组件来实现的,主要是节点本身的一个系统信息,bios 信息,网络,硬盘等等信息。这里的 variables 也可以直接调用 facts 组件的 facters 我们可以使用setup模块来获取,然后直接放入我们的剧本之中调用即可。

ansible web -m setup

图片

常用的几个参数:

ansible_all_ipv4_addresses # ipv4的所有地址
ansible_all_ipv6_addresses # ipv6的所有地址
ansible_date_time # 获取到控制节点时间
ansible_default_ipv4 # 默认的ipv4地址
ansible_distribution # 系统
ansible_distribution_major_version # 系统的大版本
ansible_distribution_version # 系统的版本号
ansible_domain #系统所在的域
ansible_env #系统的环境变量
ansible_hostname #系统的主机名
ansible_fqdn #系统的全名
ansible_machine #系统的架构
ansible_memory_mb #系统的内存信息
ansible_os_family # 系统的家族
ansible_pkg_mgr # 系统的包管理工具
ansible_processor_cores #系统的cpu的核数(每颗)
ansible_processor_count #系统cpu的颗数
ansible_processor_vcpus #系统cpu的总个数=cpu的颗数*CPU的核数
ansible_python # 系统上的python

搜索

ansible web -m setup -a 'filter=*processor*'

图片

2、用户自定义变量

自定义变量有两种方式

  • 通过命令行传入

ansible-playbook命令行中的 -e VARS,--extra-vars VARS,这样就可以直接把自定义的变量传入

使用 playbook 定义变量,实例如下:

---
- hosts: webremote_user: roottasks:- name: install {{ rpmname }}yum: name={{ rpmname }} state=present- name: copy {{ rpmname }}.confcopy: src=/tmp/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.conf backup=yesnotify: reloadtags: reload{{ rpmname }}- name: start {{ rpmname }} serviceservice: name={{ rpmname }} state=startedtags: start{{ rpmname }}handlers:- name: reloadservice: name={{ rpmname }} state=restarted

使用:

ansible-playbook nginx.yml -e rpmname=keepalived
ansible-playbook nginx.yml --extra-vars rpmname=keepalived
  • 在 playbook 中定义变量

##在playbook中定义变量如下:
vars:- var1: value1- var2: value2

使用:

---
- hosts: webremote_user: rootvars:- rpmname: keepalivedtasks:- name: install {{ rpmname }}yum: name={{ rpmname }} state=present- name: copy {{ rpmname }}.confcopy: src=/tmp/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.conf backup=yesnotify: reloadtags: reload{{ rpmname }}- name: start {{ rpmname }} serviceservice: name={{ rpmname }} state=startedtags: start{{ rpmname }}handlers:- name: reloadservice: name={{ rpmname }} state=restarted
3、通过 roles 传递变量

下面介绍 roles 会使用 roles 传递变量,小伙伴可以翻到下面看详解讲解。

4、 Host Inventory

可以在主机清单中定义,方法如下:

#向不同的主机传递不同的变量
IP/HOSTNAME varaiable=value var2=value2#向组中的主机传递相同的变量
[groupname:vars]
variable=value

3)流程控制

1、用 when 来表示的条件判断
- hosts: webremote_user: root#代表用root用户执行,默认是root,可以省略tasks:- name: createfilecopy: content="test3" dest=/opt/p1.ymlwhen: a=='3'- name: createfilecopy: content="test4" dest=/opt/p1.ymlwhen: a=='4'

如果 a"3",就将“test3”,写入到 web 组下被管控机的/opt/p1.yml 中,
如果 a"4",就将“test4”,写入到 web 组下被管控机的/opt/p1.yml 中。

执行

# 语法校验
ansible-playbook  --syntax-check p1.yml#执行
ansible-playbook -e 'a="3"' p1.yml
2、标签(只执行配置文件中的一个任务)
- hosts: webtasks:- name: installnginxyum: name=nginx- name: copyfilecopy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conftags: copyfile- name: startservice: name=nginx static=restarted

执行

# 语法校验
ansible-playbook  --syntax-check p2.yml#执行
ansible-playbook -t copyfile p2.yml
3、循环 with_items

创建三个用户

- hosts: webtasks:- name: createruseruser: name={{ item }}with_items:- shy1- shy2- shy3- name: creategroupgroup: name={{ item }}with_items:- group1- group2- group3

执行

#语法校验
ansible-playbook  --syntax-check p3.yml#执行
ansible-playbook p3.yml
4、循环嵌套(字典)

用户 shy1 的属组是 group1,用户 shy2 的属组是 group2,用户 shy3 的属组是 group3

- hosts: webtasks:- name: creategroupgroup: name={{item}}with_items:- group3- group4- group5- name: createuseruser: name={{item.user}} group={{item.group}}with_items:- {'user': shy3,'group': group3}- {'user': shy4,'group': group4}- {'user': shy5,'group': group5}

执行

#语法校验
ansible-playbook  --syntax-check p4.yml#执行
ansible-playbook p4.yml

4)模板 templates

  • 模板是一个文本文件,嵌套有脚本(使用模板编程语言编写)

  • Jinja2 是 python 的一种模板语言,以 Django 的模板语言为原本

该模板支持:

字符串:使用单引号或双引号;数字:整数,浮点数;列表:[item1, item2, ...]元组:(item1, item2, ...)字典:{key1:value1, key2:value2, ...}布尔型:true/false算术运算:+, -, *, /, //, %, **比较操作:==, !=, >, >=, <, <=逻辑运算:and, or, not
  • 通常模板都是通过引用变量来运用的

【示例】

1、定义模板

user  nginx; #设置nginx服务的系统使用用户
worker_processes  {{ ansible_processor_vcpus }}; #工作进程数error_log  /var/log/nginx/error.log warn; #nginx的错误日志
pid        /var/run/nginx.pid; #nginx启动时候的pidevents {worker_connections  1024; #每个进程允许的最大连接数
}http { #http请求配置,一个http可以包含多个server#定义 Content-Typeinclude       /etc/nginx/mime.types;default_type  application/octet-stream;#日志格式 此处main与access_log中的main对应#$remote_addr:客户端地址#$remote_user:http客户端请求nginx认证的用户名,默认不开启认证模块,不会记录#$timelocal:nginx的时间#$request:请求method + 路由 + http协议版本#status:http reponse 状态码#body_bytes_sent:response body的大小#$http_referer:referer头信息参数,表示上级页面#$http_user_agent:user-agent头信息参数,客户端信息#$http_x_forwarded_for:x-forwarded-for头信息参数log_format  main  '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';#访问日志,后面的main表示使用log_format中的main格式记录到access.log中access_log  /var/log/nginx/access.log  main;#nginx的一大优势,高效率文件传输sendfile        on;#tcp_nopush     on;#客户端与服务端的超时时间,单位秒keepalive_timeout  65;#gzip  on;server { #http服务,一个server可以配置多个locationlisten       {{ nginxport }}; #服务监听端口server_name  localhost; #主机名、域名#charset koi8-r;#access_log  /var/log/nginx/host.access.log  main;location / {root   /usr/share/nginx/html; #页面存放目录index  index.html index.htm; #默认页面}#error_page  404              /404.html;# 将500 502 503 504的错误页面重定向到 /50x.htmlerror_page   500 502 503 504  /50x.html;location = /50x.html { #匹配error_page指定的页面路径root   /usr/share/nginx/html; #页面存放的目录}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}}include /etc/nginx/conf.d/*.conf;
}

2、定义 yaml 编排

---
- hosts: webremote_user: rootvars:- rpmname: nginx- nginxport: 8088tasks:- name: install {{ rpmname }}yum: name={{ rpmname }} state=present- name: copy {{ rpmname }}.confcopy: src=/tmp/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.conf backup=yesnotify: reloadtags: reload{{ rpmname }}- name: start {{ rpmname }} serviceservice: name={{ rpmname }} state=startedtags: start{{ rpmname }}handlers:- name: reloadservice: name={{ rpmname }} state=restarted

使用

##使用reloadnginx标签,重新加载剧本
ansible-playbook nginx.yml -t reloadnginx

copy 与 template 的区别

  • copy 模块不替代参数,template 模块替代参数

  • template 的参数几乎与 copy 的参数完全相同

5)handlers(触发事件)

notify:触发
handlers:触发的动作

使用上场景:修改配置文件时

【示例】 正常情况时 handlers 是不会执行的

- hosts: webtasks:- name: installredisyum: name=redis- name: copyfiletemplate: src=redis.conf dest=/etc/redis.conftags: copyfilenotify: restart- name: startservice: name=redis state=startedhandlers:- name: restartservice: name=redis

执行

ansible-playbook -t copyfile p6.yml

6)roles

1、roles 介绍与优势

一般情况下将 roles 写在**/etc/ansible/roles**中,也可以写在其他任意位置(写在其他位置要自己手动建立一个 roles 文件夹)

  • 对于以上所有方式有个缺点就是无法实现同时部署 web、database、keepalived 等不同服务或者不同服务器组合不同的应用就需要写多个 yaml 文件,很难实现灵活的调用

  • roles 用于层次性,结构化地组织 playbook。roles 能够根据层次结果自动装载变量文件、tasks 以及 handlers 等。

  • 要使用 roles 只需要在 playbook 中使用 include 指令即可。

  • 简单来讲,roles 就是通过分别将变量(vars)、文件(files)、任务(tasks)、模块(modules)以及处理器(handlers)放置于单独的目录中,并且可以便捷的 include 它们地一种机制。

  • 角色一般用于基于主机构建服务的场景中,但是也可以用于构建守护进程等场景中。

2、目录结构

创建目录

mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}

图片

  • roles/

  • mysql/:mysql 服务的 yml 文件

  • httpd/:apached 服务的 yml 文件

  • nginx/:nginx 服务的 yml 文件

  • files/:存储由 copy 或者 script 等模块调用的文件或者脚本;

  • tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各个 task;其他文件需要由main.yml进行包含调用;

  • handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各个 handler;其他文件需要由 main.yml 进行包含调用;

  • vars/:此目录至少应该有一个名为main,yml的文件,用于定义各个 variable;其他的文件需要由main.yml进行包含调用;

  • templates/:存储由 templates 模块调用的模板文件;

  • meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定以及依赖关系,其他文件需要由main.yml进行包含调用;

  • default/:此目录至少应该有一个名为main.yml的文件,用于设定默认变量;

3、实战操作

【1】创建目录

mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}

【2】定义配置文件

先下载 nginx rpm 部署包

# 下载地址:http://nginx.org/packages/centos/7/x86_64/RPMS/wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-1.el7.ngx.x86_64.rpm -O nginx/files/nginx-1.18.0-1.el7.ngx.x86_64.rpm
  • nginx/tasks/main.yml

- name: cpcopy: src=nginx-1.18.0-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm
- name: installyum: name=/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm state=latest
- name: conftemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.conftags: nginxconfnotify: new conf to reload
- name: start serviceservice: name=nginx state=started enabled=true
  • nginx/templates/nginx.conf.j2
user  nginx; #设置nginx服务的系统使用用户
worker_processes  {{ ansible_processor_vcpus }}; #工作进程数error_log  /var/log/nginx/error.log warn; #nginx的错误日志
pid        /var/run/nginx.pid; #nginx启动时候的pidevents {worker_connections  1024; #每个进程允许的最大连接数
}http { #http请求配置,一个http可以包含多个server#定义 Content-Typeinclude       /etc/nginx/mime.types;default_type  application/octet-stream;#日志格式 此处main与access_log中的main对应#$remote_addr:客户端地址#$remote_user:http客户端请求nginx认证的用户名,默认不开启认证模块,不会记录#$timelocal:nginx的时间#$request:请求method + 路由 + http协议版本#status:http reponse 状态码#body_bytes_sent:response body的大小#$http_referer:referer头信息参数,表示上级页面#$http_user_agent:user-agent头信息参数,客户端信息#$http_x_forwarded_for:x-forwarded-for头信息参数log_format  main  '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';#访问日志,后面的main表示使用log_format中的main格式记录到access.log中access_log  /var/log/nginx/access.log  main;#nginx的一大优势,高效率文件传输sendfile        on;#tcp_nopush     on;#客户端与服务端的超时时间,单位秒keepalive_timeout  65;#gzip  on;server { #http服务,一个server可以配置多个locationlisten       {{ nginxport }}; #服务监听端口server_name  localhost; #主机名、域名#charset koi8-r;#access_log  /var/log/nginx/host.access.log  main;location / {root   /usr/share/nginx/html; #页面存放目录index  index.html index.htm; #默认页面}#error_page  404              /404.html;# 将500 502 503 504的错误页面重定向到 /50x.htmlerror_page   500 502 503 504  /50x.html;location = /50x.html { #匹配error_page指定的页面路径root   /usr/share/nginx/html; #页面存放的目录}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}}include /etc/nginx/conf.d/*.conf;
}
  • nginx/vars/main.yml

nginxport: 9999
  • nginx/handlers/main.yml

- name: new conf to reloadservice: name=nginx state=restarted
  • 定义剧本文件(roles.yml

- hosts: webremote_user: rootroles:- nginx

最后的目录结构如下:

图片

执行

ansible-playbook roles.yml

图片

到这里一个完整版的 roles 演示示例就完成了,接下来也会真正使用 ansible playbook roles 应用到真实场景中

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

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

相关文章

电脑玩《刺客信条》时中,遇到找不到d3dx9_42.dll的问题是什么原因?缺失d3dx9_42.dll应该怎么解决呢?下面一起来看看吧!

电脑玩《刺客信条》时&#xff0c;找不到d3dx9_42.dll的原因及解决办法 对于许多热爱《刺客信条》这款游戏的玩家来说&#xff0c;在游戏中遇到找不到d3dx9_42.dll的问题无疑是非常令人头疼的。这一错误不仅会导致游戏无法启动&#xff0c;还可能引发运行过程中的图形错误、卡…

Apache Solr RCE(CVE-2017-12629)--vulhub

Apache Solr 远程命令执行漏洞&#xff08;CVE-2017-12629&#xff09; Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…

Mysql索引类型总结

按照数据结构维度划分&#xff1a; BTree 索引&#xff1a;MySQL 里默认和最常用的索引类型。只有叶子节点存储 value&#xff0c;非叶子节点只有指针和 key。存储引擎 MyISAM 和 InnoDB 实现 BTree 索引都是使用 BTree&#xff0c;但二者实现方式不一样&#xff08;前面已经介…

中间件 redis安装

redis官网地址&#xff1a;Redis - The Real-time Data Platform 环境 CentOS Linux release 7.9.2009 (Core) java version "17.0.12" 2024-07-16 LTS 1、通过压缩包安装redis 1&#xff0c;远程下载redis压缩包&#xff0c;或去官网下载&#xff1a;Downloads …

台球助教平台系统开发APP和小程序信息收藏功能需求解析(第十二章)

以下是开发台球助教系统客户端&#xff08;APP&#xff0c;小程序&#xff0c;H5&#xff09;几端的信息收藏功能的详细需求和功能说明&#xff0c;内容比较详细&#xff0c;可以说是一个教科书式的详细说明了&#xff0c;这套需求说明不仅仅用在我们的台球助教系统程序上&…

freertos入门---堆的概念

freertos入门—堆的概念 堆就是一块空闲的内存。下面举个例子更好的理解堆的概念&#xff1a;   堆是一块空闲的内存&#xff0c;我们可以定义一个数组char heap_buf[1024]&#xff0c;可以看到该数组就是一个空闲的内存&#xff0c;我们只需要在它上面实现内存的分配和释放那…

操作系统(17)文件和文件系统

一、文件 定义&#xff1a;文件是数据的有序集合&#xff0c;是用户存储信息于辅存的基本逻辑单位。文件可以是字符流构成的无结构文件&#xff0c;也可以是包含相似记录的结构化文件。 类型&#xff1a; 按性质和用途&#xff1a;系统文件&#xff08;由系统软件构成的文件&a…

ASP.NET|日常开发中读写TXT文本详解

ASP.NET&#xff5c;日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用StreamReader类 二、写入 TXT 文本2.1 使用StreamWriter类 三、文件编码问题3.1 常见编码格式 四、错误处理和性能考虑4.1 错误处理4.2 性能考虑 结束语优质源码分享 ASP.NET&#xff5c;日常开发中…

notepad++快捷键-多行编辑中如何使所有行的光标都向后移动一个单词的长度(每行单词长度不一定一致)

问题&#xff1a;在使用notepad进行多行编辑&#xff08;多行光标移动一个单词长度&#xff09;时&#xff08;将下图由左边变为右边&#xff09;&#xff0c;在使用Ctrl左键拖拽选中多行后&#xff0c;想要将每行的光标向后移动一个单词的长度&#xff08;每行的单词长度不一样…

【IC】Hybrid Bonding技术

从纳米到埃米&#xff0c;芯片制造商正在竭尽全力缩小电路的尺寸。但面对算力需求的激增&#xff0c;一项涉及更大尺寸&#xff08;数百或数千纳米&#xff09;的技术——混合键合&#xff08;Hybrid Bonding&#xff09;——将在未来五年内扮演重要角色。近日&#xff0c;IEEE…

洛谷 B3643 图的存储 C语言

题目&#xff1a;https://www.luogu.com.cn/problem/B3643 题目描述 给定一个 n 个顶点 m 条边的无向图。请以邻接矩阵和邻接表的形式输出这一张图。 输入格式 第一行输入两个正整数 n 和 m&#xff0c;表示图的顶点数和边数。 第二行开始&#xff0c;往后 m 行&#xff0…

MATLAB里面,try-catch-end系列语言的含义与用法(含例程)

在 MATLAB 中&#xff0c;try-catch-end 语句用于处理可能会引发错误的代码。它允许你在“尝试”部分执行代码&#xff0c;如果代码执行过程中发生错误&#xff0c;将转到“捕获”部分执行相应的处理。这种错误处理机制可以提高程序的健壮性&#xff0c;避免因小错误导致整个程…

Python练习之列表的使用

&#xff08;搭配主页知识点&#xff09; 【练习要求】 针对知识点列表定义、追加、列表元素读取、查找安排的本实例。要求实现&#xff1a;有一个列表&#xff0c;内容是:[21,25,21,23,22,20]&#xff0c;记录的是一批学生的年龄请通过列表的功能(方法)&#xff0c;对其进行…

安装虚拟机(VMware)教程+win7

VMware 一.下载VMware Wworkstation Pro二、安装VMware三、安装虚拟机 一.下载VMware Wworkstation Pro 1.去vmware官网下载 官网 2.网盘下载 通过网盘分享的文件&#xff1a;vmware 链接: https://pan.baidu.com/s/1bOff79NFAmDlISQo6LK6PQ?pwdhunr 提取码: hunr --来自百…

C语言总共n位数,将后面的K个数与前面的数对调位置,前后二部分的数字顺序不变

例如&#xff1a;n5&#xff0c;k2&#xff0c;要处理的数字是12345&#xff0c;则处理后变成45123 这个问题可以通过以下步骤解决&#xff1a; 确定前后两部分的分界点。 对前后两部分分别进行反转。 以下是一个简单的C语言示例代码&#xff1a; #include<stdio.h>…

C# Winform双色纸牌接龙小游戏源码

文章目录 一、设计来源双色纸牌接龙小游戏讲解1.1 主界面1.2 游戏界面1.3 游戏界面快成功了 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/144419994 …

无人机航测系统技术特点!

一、无人机航测系统的设计逻辑 无人机航测系统的设计逻辑主要围绕实现高效、准确、安全的航空摄影测量展开。其设计目标是通过无人机搭载相机和传感器&#xff0c;利用先进的飞行控制系统和数据处理技术&#xff0c;实现对地表信息的全方位、高精度获取。 需求分析&#xff1…

分割双声道音频-Audacity和ffmpeg

双声道音频资源&#xff1a; https://download.csdn.net/download/yudelian/90135217 1、ffmpeg分割双声道音频 ffmpeg -i input.wav -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wav 2、audacity分割双生音频并且播放 选择分离立体声轨 可以看出分离出了两个音频…

以太网帧、IP数据报图解

注&#xff1a;本文为 “以太网帧、IP数据报”图解相关文章合辑。 未整理去重。 以太网帧、IP数据报的图解格式&#xff08;包含相关例题讲解&#xff09; Rebecca.Yan已于 2023-05-27 14:13:19 修改 一、基础知识 UDP 段、IP 数据包&#xff0c;以太网帧图示 通信过程中&…

docker简单命令

docker images 查看镜像文件 docker ps -a 查看容器文件 docker rm 0b2 删除容器文件&#xff0c;id取前三位即可 docker rmi e64 删除镜像文件&#xff08;先删容器才能删镜像&#xff09;&#xff0c;id取前三位即可 在包含Dockerfile文件的目录…