Ansible剧本playbooks详解
一、playbook简介
playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中一系列tasks,playbook字面意思是剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。
ansible使用playbook来管理自动化task,playbook是yaml格式的文件,其基本内容可以认为是多条ansible的ad-hoc的语句组成。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,是用yaml(Yet Another Markup Language)语言编写的文件,有着特定的组织格式。YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便,YAML语法能够简单的表示散列表,字典等数据结构。
playbook命令根据自上而下的顺序依次执行。同时,playbook开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。
二、Playbook核心元素
模块名 | 注释 |
Hosts | 执行的远程主机列表 |
Tasks | 任务集,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 |
Variables | 内置变量或自定义变量在playbook中调用 |
Templates | 模板,使用模板语法的文件,比如配置文件等 |
Handlers | 处理器,当changed状态条件满足时,(notify)触发执行的操作,和notity结合使用 |
tags | 标签,指定某条任务执行,用于选择运行playbook中的部分代码 |
Roles | 角色 |
三、Playbook语法
playbook使用yaml语法格式,后缀可以是yaml,也可以是yml,文件中有多个play,一个play中只能有一个tasks,一个tasks中可以有多个name任务。
- 在一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略
- 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能
- 使用#号注释代码
- 缩进必须统一,不能空格和tab混用
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的
- YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
- k/v的值可同行写也可以换行写。同行使用:分隔
- v可以是个字符串,也可以是一个列表
- 一个完整的代码块功能需要最少元素包括 name: task
四、playbook 运行方式
ansible-playbook <filename.yml> ... [options]#检测文件配置
ansible-playbook test.yaml --syntax-check
#执行文件
ansible-playbook test.yaml
ansible-playbook filename.yml [options]# ssh 连接的用户名
-u REMOTE_USER, --user=REMOTE_USER# ssh登录认证密码
-k, --ask-pass # sudo 到root用户,相当于Linux系统下的sudo命令
-s, --sudo # sudo 到对应的用户
-U SUDO_USER, --sudo-user=SUDO_USER # 用户的密码(—sudo时使用)
-K, --ask-sudo-pass # ssh 连接超时,默认 10 秒
-T TIMEOUT, --timeout=TIMEOUT# 指定该参数后,执行 playbook 文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改
-C, --check # 设置额外的变量如:key=value 形式 或者 YAML or JSON,以空格分隔变量,或用多个-e
-e EXTRA_VARS, --extra-vars=EXTRA_VARS # 进程并发处理,默认 5
-f FORKS, --forks=FORKS # 指定 hosts 文件路径,默认 default=/etc/ansible/hosts
-i INVENTORY, --inventory-file=INVENTORY # 指定一个 pattern,对- hosts:匹配到的主机再过滤一次
-l SUBSET, --limit=SUBSET # 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook
--list-hosts # 列出该 playbook 中会被执行的 task
--list-tasks # 私钥路径
--private-key=PRIVATE_KEY_FILE # 同一时间只执行一个 task,每个 task 执行前都会提示确认一遍
--step # 只检测 playbook 文件语法是否有问题,不会执行该 playbook
--syntax-check # 当 play 和 task 的 tag 为该参数指定的值时才执行,多个 tag 以逗号分隔
-t TAGS, --tags=TAGS # 当 play 和 task 的 tag 不匹配该参数指定的值时,才执行
--skip-tags=SKIP_TAGS # 输出更详细的执行过程信息,-vvv可得到所有执行过程信息。
-v, --verbose
检查文件是否有误:
ansible-playbook test.yaml --syntax-check
执行文件:
ansible-playbook test1.yaml
六、变量
- name: testhosts: testremote_user: rootvars: #定义变量- groupname: testgroup - username: testusertasks:- name: create groupgroup: name={{groupname}} system=yes gid=600 #使用 {{key}} 引用变量的值- name: create useruser: name={{username}} uid=600 group={{groupname}} - name: copy filecopy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt #在setup模块中可以获取facts变量信息
七、常用模块
1、when 模块
在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。
when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务
---
- hosts: allremote_user: roottasks:- name: test when service: name=httpd state=stoppedwhen: ansible_default_ipv4.address == "192.168.0.1" #when指令中的变量名不需要手动加上 {{}}
# 或 when: inventory_hostname == "<主机名>"
当主机 IP 是 192.168.0.1 才会启动 httpd ,否则不启动
2、with_items 模块
Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环;案例中with_item 相当于提供了2个变量,循环被调用执行任务
---
- name: playhosts: testgather_facts: falsetasks:- name: create directoriesfile:path: "{{item}}"state: directorywith_items:- /tmp/test1- /tmp/test2- name: add usersuser: name={{item.name}} state=present groups={{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root
或with_items:- {name:'test1', groups:'wheel'}- {name:'test2', groups:'root'}
3、template(模板)
Ansible 模板是一种强大的工具,可用于在自动化任务中以动态方式生成配置、文件和其他工件。模板使用 Jinja2 模板语言,这是一种功能强大的模板语言,可用于创建复杂的模板。
Jinja2 模板语言:使用字面量,有下面形式。
字符串:使用单引号或者双引号
数字:整数、浮点数
列表:[item1、item2、......]
元组:[item1、item2、......]
字典:[key1:value1,key2:value2,......]
布尔型:true/false
算数运算:+ ,-, *, /,/ /,%,**
比较操作:==, !=, >, >=, <, <=
逻辑运算:and、or、not
流表达式:If For When
template功能:根据模块文件动态生成对应的配置文件
template文件必须存放于templates目录下,且命名为 .j2 结尾 yaml/yml 文件需和templates目录平级,目录结构如下:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2
---
- hosts: 10.0.0.1remote_user: roottasks:- name: install packageyum: nginx- name: copy templatetemplate: src: nginx.conf.j2dest: /etc/nginx/nginx.conf- name: service startservice: name=nginx state=started enabled=yes
4、Playbooks中tasks语法使用
4.1、tags
如果写了一个很长的playbook,其中有很多的任务,这并没有什么问题,不过在实际使用这个剧本时,可能只是想要执行其中的一部分任务而已,或者,你只想要执行其中一类任务而已,而并非想要执行整个剧本中的全部任务,这个时候我们就可以借助 tags 标签实现这个需求。
tags可以帮助我们对任务进行’打标签’的操作,与模块名同级,当任务存在标签以后,我们就可以在执行playbook时,借助标签,指定执行哪些任务,或者指定不执行哪些任务了。
为playbook 添加标签的方式有如下几种:
- 对一个 task 打一个标签
- 对一个 task 打多个标签
- 对多个 task 打一个标签
使用标签的方式:
- -t 执行指定tag标签对用的任务
- --skip-tags 执行除 --skip-tags 标签之外的所有任务
---
- hosts: webremote_user: roottasks:- name: test1file:path: /tmp/abc1.txtstate: touchtags: t1,t4- name: test2file:path: /tmp/abc2.txtstate: touchtags: t2- name: test3file:path: /tmp/abc3.txtstate: touchtags: t3,t4
借助标签,除了能够指定“需要执行的任务”,还能够指定“不执行的任务” 使用--skip-tags 选项
ansible-playbook --skip-tags=t2 tags-test1.yaml
其实,ansible预置了5个特殊的标签,分别是
always :总是会被执行
never :总是不执行
tagged :表示只执行有标签的任务,没有标签的任务不会被执行。
untagged :只执行没有标签的任务,但是如果某些任务包含always标签,那么这些任务也会被执行。
all :特殊标签all表示所有任务会被执行,不用指定,默认情况下就是使用这个标签。
---
- hosts: webremote_user: roottasks:- name: test1file:path: /tmp/abc1.txtstate: absenttags: t1- name: test2file:path: /tmp/abc2.txtstate: absenttags: t2- name: test3file:path: /tmp/abc3.txtstate: absenttags: t3,always# task3的标签有两个,t3和always,在执行剧本时候,不指定t3,但是也会被执行,这就是always的作用。
如果不想执行标签中包含always的任务,可以使用--skip-tags=always 跳过他们。
4.2、file
file模块主要用于远程主机上的文件操作,file模块包含如下选项:
force | 需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,选项:yes/no |
group | 定义文件/目录的属组 |
mode | 定义文件/目录的权限 |
owner | 定义文件/目录的属主 |
path | 必选项,定义文件/目录的路径 |
recurse | 递归的设置文件的属性,只对目录有效 |
src | 要被链接的源文件的路径,只应用于state=link的情况 |
dest | 被链接到的目标路径,只应用于state=link的情况 |
state | directory:表示目录,如果目录不存在,则创建目录。 link:创建软链接 hard:创建硬链接 touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间 absent:删除目录、文件或者取消链接文件。 |
举例:
- hosts: 192.168.0.1remote_user: tomcattasks:- name: mkdir data directoryfile: path=/opt/data state=directory mode=0755- name: chmod binfile: dest=/opt/bigdata/jdk/bin mode=0755 recurse=yes- name: link filesfile: src=/etc/ssh/sshd_config dest=/mnt/sshd_config owner=sshd state=link- name: delete filesfile: path=/tmp/tomcat.tar.gz state=absent- name: chown filesfile: path=/mnt/test.txt owner=nobody group=nobody mode=0644
4.3、lineinfile
修改文件某一行文本
常用参数:
path | 必须参数,指定要操作的文件 |
regexp | 使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。 |
line | 指定修改后的文本内容 |
state | 当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present |
backrefs | 默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes,backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,参考下面的示例命令比较直观一点,backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变,如果没有理解,就按照下面的示例命令,动手操作一下吧,那样更加直观 |
insertafter | 借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略 |
insertbefore | 借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略 |
backup | 是否在修改文件之前对文件进行备份 |
create | 操作的文件不存在时是否创建 |
示例:
1、替换文件中匹配到得最后一个 SELINUX=,替换成 SELINUX=enforcing
- name: seline modify enforcinglineinfile:dest: /etc/selinux/configregexp: '^SELINUX='line: 'SELINUX=enforcing'
2、 insertbefore匹配内容在前面添加
- name: httpd.conf modify 8080lineinfile:dest: /opt/playbook/test/http.confregexp: '^Listen'insertbefore: '^#Port' line: 'Listen 8080'tags:- http8080
3、修改文件内容以及权限
- name: modify hostslineinfile:dest: /opt/playbook/test/hostsregexp: '^127\.0\.0\.1'line: '127.0.0.1 localhosts'owner: rootgroup: rootmode: 0644tags:- hosts
4、删除一行内容
- name: delete 192.168.0.1lineinfile:dest: /opt/playbook/test/hostsstate: absentregexp: '^192\.'tags:- delete192
4.4、replace
replace 模块根据指定得正则表达式替换文件中得字符串,文件中所有被正则匹配到得字符串都会被替换
- name: 替换配置文件中的文本hosts: servicetasks:- name: 替换单个文本replace:path: /etc/test/config.confregexp: 'old_text'replace: 'new_text'- name: 替换多个文本replace:path: /etc/test/config.confregexp: '(old_text1|old_text2)'replace: 'new_text'- name: 使用正则表达式替换replace:path: /etc/test/config.confregexp: 'pattern(.*)'replace: 'replacement\1'backrefs: yes
使用正则表达式替换:通过regexp参数指定一个正则表达式,使用括号捕获匹配的内容。通过replace参数指定替换的文本,并使用\1表示捕获的内容。replace模块会在文件中查找匹配的文本并进行替换。
4.5、shell
执行命令
- shell: mkdir /tmp/mytest
- shell: echo "export JAVA_HOME=/opt/jdk" >> /etc/profile
4.6、pause
暂停一定时间
常用参数:
- minutes:暂停多少分钟
- seconds:暂停多少秒
- prompt:打印一串信息提示用户操作
- name: 等待用户30s用于输入pause: seconds=30 prompt="ENTER to continue CTRL-C a to quit"
4.7、local_action
本地操作功能,在运行ansible命令机器上执行操作
4.8、ignore_errors
忽略错误,通常情况执行失败时 ansible 会停止运行,有时候需要继续执行,则需要添加次参数
- name: 删除临时目录shell: rm /tmp/dataignore_errors:yes
4.9、user/group
用户组管理
常用参数:
- name:指定组名称
- gid:指定GID
- state:动作参数
present:增加
absent:删除
4.10、yum
软件包管理
常用参数:
name:指定需要管理的软件包名
state:参数非常灵活,可以包含的值及含义如下
present:确保软件包已经安装了
installed:安装
latest:安装最新的软件包
removed/absent:删除对应的软件包
disable_gpg_check:用于禁用对rpm包公钥验证,默认值no表示不禁用验证,yes表示禁用验证
---
- name: install packagehosts: alltasks:- name: install php and mariaDByum:name:- php- mariadbstate: presentwhen: ansible_hostname in groups['dev'] - name: install the 'Development tools' package groupyum:name: "@Development tools"state: presentwhen: ansible_hostname in groups['dev']- name: upgrade all packagesyum:name: "*"state: latest
- name:安装httpd服务yum: name=httpd state=latest- name: 删除旧版gccyum: name = {{ item }} state=removedwith_items:- gcc- httpd- php
4.11、cron
定时任务,相当于crontab
常用参数:
name:任务名称
minute:分, hour:时,day:天,month:月,weekday:周
job:指定要执行的命令或者脚本
state:当设置为absent代表删除任务
- name: 新增一个定时查看路径任务cron: name=check minute=5 job='pwd'
5、wars 变量
- name: second playhosts: dbserversremote_user: rootvars: #定义变量- groupname: testgroup #格式为 key: value- username: testusertasks:- name: create groupgroup: name={{groupname}} system=yes gid=308 #使用 {{key}} 引用变量的值- name: create useruser: name={{username}} uid=309 group={{groupname}} - name: copy filecopy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt #在setup模块中可以获取facts变量信息
相关文章:
Ansible剧本playbooks详解
一、playbook简介 playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中一系列tasks,playbook字面意思是剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装&#x…...
vue3封装Element导航菜单
1. 导航外层布局 AsideView.vue <template><el-menu:default-active"defaultActive"class"my-menu":collapse"isCollapse":collapse-transition"false"open"handleOpen"close"handleClose"><menu…...
字符串的函数
头文件 # include <string.h> 五大函数: strlen()、strcpy、strcat()、strcmp()、strstr() 用法: strlen():计算字符串长度,但不计\0这个字符 #include <string.h> int main() {char arr[] "abcdef"…...
Linux安装redis(基于CentOS系统,Ubuntu也可参考)
前言:本文内容为实操记录,仅供参考! 一、下载并解压Redis 1、执行下面的命令下载redis:wget https://download.redis.io/releases/redis-6.2.6.tar.gz 2、解压redis:tar xzf redis-6.2.6.tar.gz 3、移动redis目录&a…...
ChatGPT引领量化交易革命:AI在金融创新的浪潮中崭露头角
随着科技的飞速发展,金融领域正迎来一场前所未有的创新浪潮。在这场变革中,ChatGPT凭借其卓越的自然语言处理能力和深度学习能力,正引领量化交易进入新时代。 量化交易,作为现代金融领域的一种重要交易方式,依赖于复杂的数学模型和大量的历史数据来制定交易策略。然而,传…...
无忧微服务:如何实现大流量下新版本的发布自由
作者:项良、十眠 微服务上云门槛降低,用好微服务才是关键 据调研数据显示,约 70% 的生产故障是由变更引起的。在阿里云上的企业应用如茶百道、极氪汽车和来电等,他们是如何解决变更引起的稳定性风险,实现了在白天高流…...
Halcon3D表面平面度检测-平面差值法
//倾斜平面矫正 https://blog.csdn.net/m0_51559565/article/details/137146179 //平面度和平面缺陷检测,平面矫正法 https://blog.csdn.net/m0_51559565/article/details/137163729前言 通常我们对表面平面度进行检测时,通常使用2种方式。1:…...
golang 在多线程中避免 CPU 指令重排
发布日期:2024-03-26 16:29:39 起因 golang 的发明初衷便是多线程,是一门专门用于多线程高并发的编程语言。其独创的 GMP 模型在多线程的开发上提供了很大的便利。 现代计算机基本上都是多核 CPU 的结构。CPU 在进行指令运行的时候,为了提高…...
自动化更新包文件--shell脚本
自动化更新包文件--shell脚本 背景手动更包自动化更包 背景 作为一名实施工程师,当然也协助做些测试的工作,当产品功能开发后,研发会将本次迭代涉及的前后端包文件提供过来。有时会因为一些原因研发没法现场开发,那就需要我们配合…...
Vue element-plus 导航栏 [el-menu]
导航栏 [el-menu] Menu 菜单 | Element Plus el-menu有很多属性和子标签,为网站提供导航功能的菜单。 常用标签: 它里面有两个子标签。el-menu-item,它其实就是el-menu每一个里面的item,item就是真实匹配到路由的每个栏目&#…...
数据结构——数组
数组定义: 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识。 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。 性…...
python asyncio websockets server
python websocket server在收到接受消息处理完后会默认关闭连接。需要在msg_handler里面加个while true就能一直保持连接了。 start_server websockets.serve(msg_handler, "0.0.0.0", 29967) asyncio.get_event_loop().run_until_complete(start_server) asyncio.…...
视频素材免费网站有哪些?8个视频素材库网站下载推荐
在视频创作领域,选择正确的高质量无水印素材网站能够极大地丰富您的作品,让每一帧都鲜活起来。下面,我们继续为您介绍更多优质的视频素材网站,每一个都是您创作旅程中的宝贵资源。 1. 蛙学府(中国) 集合了…...
ChatGPT与传统搜索引擎的区别:智能对话与关键词匹配的差异
引言 随着互联网的快速发展,信息的获取变得比以往任何时候都更加便捷。在数字化时代,人们对于获取准确、及时信息的需求愈发迫切。传统搜索引擎通过关键词匹配的方式为用户提供了大量的信息,然而,这种机械式的检索方式有时候并不…...
xargs后调用bash自定义函数(写该函数文本到脚本, 并引导PATH)
xargs后调用bash自定义函数 需要3步骤,如下 function to_markdown_href_func() { fp$1 #echo $fpecho -e "\n[${fp}](${PREFIX}/${fp})" }BIN/tmp/bin/ F$BIN/to_markdown_href_func.sh mkdir -p $BIN 获得函数to_markdown_href_func的文本 ,写文本到 /tmp/bin/to_ma…...
学术论文写作新利器:ChatGPT技巧详解
ChatGPT无限次数:点击直达 学术论文写作新利器:ChatGPT技巧详解 在如今信息爆炸的时代,学术论文写作变得愈发重要且具有挑战性。随着人工智能技术的不断发展,ChatGPT作为一种强大的写作辅助工具,为学术论文创作者提供了全新的可能…...
Spring整合JDBC
1、引入依赖 <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><depen…...
详解Qt中的布局管理器
Qt中的布局管理是用于组织用户界面中控件(如按钮、文本框、标签等)位置和尺寸调整的一种机制。说白了就是创建了一种规则,随着窗口变化其中的控件大小位置跟着变化。Qt提供了多种布局管理器,每种都有其特定用途和特点。以下是对Qt…...
MyBatis 参数重复打印的bug
现象 最近有个需求,需要在mybatis对数据库进行写入操作的时候,根据条件对对象中的某个值进行置空,然后再进行写入,这样数据库中的值就会为空了。 根据网上查看的资料,选择在 StatementHandler 类执行 update 的时候进…...
ES6学习之路:迭代器Iterator和生成器Generator
迭代器 一、知识背景 什么是迭代器 迭代器就是在一个数据集合中不断取出数据的过程迭代和遍历的区别 遍历是把所有数据都取出迭代器注重的是依次取出数据,它不会在意有多少数据,也不会保证能够取出多少或者能够把数据都取完。比如斐波那契额数列&#…...
如何使用 DynamiCrafter Interp Loop 无缝连接两张照片
DynamiCrafter Interp Loop 是一个基于 AI 的工具,可以用来无缝连接两张照片。它使用深度学习技术来生成中间帧,从而使两张照片之间的过渡更加自然流畅。 使用步骤 访问 DynamiCrafter Interp Loop 网站:https://huggingface.co/spaces/Dou…...
今天起,Windows可以一键召唤GPT-4了
ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 微软 AI 大计的最后一块拼图完成了? 把 Copilot 按钮放在 Window…...
使用Kaggle API快速下载Kaggle数据集
前言 在使用Kaggle网站下载数据集时,直接在网页上点击下载可能会很慢,甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包: pip install…...
java 通过 microsoft graph 调用outlook(二)
这次提供一些基础调用方式API PS: getMailFolders 接口返回的属性中,包含了未读邮件数量unreadItemCount 一 POM文件 <!-- office 365 --><dependency><groupId>com.google.guava</groupId><artifactId>guava<…...
【机器学习】代价函数
🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...
[leetcode] 100. 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3], q [1,2,3] 输出:true示例 2&a…...
08、Lua 函数
Lua 函数 Lua 函数Lua函数主要有两种用途函数定义解析:optional_function_scopefunction_nameargument1, argument2, argument3..., argumentnfunction_bodyresult_params_comma_separated 范例 : 定义一个函数 max()Lua 中函数可以作为参数传递给函数多返回值Lua函…...
【数据分析面试】1. 计算年度收入百分比(SQL)
题目 你需要为公司的营收来源生成一份年度报告。计算截止目前为止,在表格中记录的第一年和最后一年所创造的总收入百分比。将百分比四舍五入到两位小数。 示例: 输入: annual_payments 表 列名类型amountINTEGERcreated_atDATETIMEstatusV…...
数据库SQL语句速查手册
SQL 语句语法AND / ORSELECT column_name(s) FROM table_name WHERE condition AND|OR conditionALTER TABLEALTER TABLE table_name ADD column_name datatypeorALTER TABLE table_name DROP COLUMN column_nameAS (alias)SELECT column_name AS column_alias FROM table_name…...
智慧城市一屏统览,数字孪生综合治理
现代城市作为一个复杂系统,牵一发而动全身,城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。城市工作要树立系统思维,从构成城市诸多要素、结构、功能等方面入手,系统推进…...
网站开发工程师应聘书范文/网页广告调词平台
一、前言 CSS字体属性可以定义文本的字体系列、大小、加粗、颜色、风格(如斜体)和变形(如小型大写字母)。 CSS的字体属性: font-family设置字体系列font-size设置字体的尺寸font-weight 设置字体的粗细font-style设置字…...
软件开发培训机构多少钱/seo平台优化
//校验是否全由数字组成function isDigit(s){var patrn/^[0-9]{1,20}$/;if (!patrn.exec(s)) return falsereturn true}//校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串Java代码function isRegisterUserName(s){var patrn/^[a-zA-Z]{1}([a-zA…...
wordpress 调用分类列表/推销产品的软文500字
SpringCloud&RocketMQ分布式事务解决方案之最大努力通知mp.weixin.qq.com1.什么是最大努力通知 最大努力通知也是一种解决分布式事务的方案,下边是一个是充值的例子:交互流程:1、账户系统调用充值系统接口2、充值系统完成支付处理向账户系统发起…...
网站的设计风格与特点/个人接外包项目平台
【论文复现赛】DeepCFD 本项目基于PaddlePaddle框架复现DeepCFD网络。 一、论文简介 计算流体力学(Computational fluid dynamics, CFD)通过求解Navier-Stokes方程(N-S方程),可以获得流体的各种物理量的分布&#x…...
有没有做鸭子的网站/买卖友情链接
泸州老窖集团有限责任公司电子化职能化和网络化的管理新模式 泸州老窖集团有限责任公司是在明清36家古老酿酒作坊群的基础上,发展起来的大型国有企业集团。作为国家白酒酿造的骨干企业,泸州老窖在行业内一直处在第一集团军的地位。泸州老窖是行业内第一家…...
天津做网站企业/安徽做网站公司哪家好
类类的概念在许多语言中出现,是面向对象编程的基础,很容易理解。抽象出不同物体的共同特征,根据相似性原则,把彼此相似的物体归于相同的类概念, 它将数据和操作进行封装,以便将来的复用。模块模块ÿ…...