学习Ansible自动化
学习Ansible自动化
自动化运维工具
shell脚本/Ansible(无客户端)/Saltstack
目录
- 学习Ansible自动化
- 1.Ansible基本概述
- 2.Ansible能做什么
- 3.Ansible软件特点
- 4.Ansible架构介绍(见图说明)
- 5.ansible的配置
- 1.安装ansible
- 2.部署好公钥认证
- 3.配置主机清单
- 4.验证
- 主机组配置方式
- 第一种:[oldboy_pass]
- 第二中:支持变量的模式
- 第三种:支持嵌套组
- 6.调用模块来部署架构
- Ansible注意事项->提示颜色信息说明
- 1.command模块
- 2.shell模块
- 3.yum模块 对安装服务的控制
- 4.copy模块 对文件的控制
- 5.service模块 对服务的控制
- 6.group模块 创建组
- 7.user模块创建用户模块
- 8.file模块创建修改文件权限
- 9.mount模块 挂载
- 10.script模块 执行脚本
- 11.cron 计划任务
- 7.Ad-Hoc简介
- 8.Ansible playbook剧本使用
- **1.YAML三板斧 (语法结构)**
- **2.playbook的核心参数**
- **3.命令格式**
- 2.ansible playbook 安装apache示例
- 多个剧本合并:
- Ansible部署rsync+nfs+sersync实现方法
- **1.角色**
- 2.实现步骤:
- **3.基础部署(hosts:all)**
- 4.rsync部署
- 5.nfs部署
- 6.sersync部署
- 7.web部署
- 8.剧本合并
- 9.执行ansible剧本install_rsync+web1+nfs.yaml
1.Ansible基本概述
Ansible是一个配置管理系统configuration management system你只需要使用ssh访问你的服务器或设备就行
2.Ansible能做什么
ansible可以帮我们完成一些批量任务,或者完成一些经常重复的工作
比如:同时在100台服务器上安装nginx服务,并在安装后启动服务
3.Ansible软件特点
- ansible不需要单独安装客户端,ssh就相当于ansible客户端
- ansible不需要启动任何服务,仅需要安装工具即可
- ansible依赖大量的python模块来实现批量管理。
- ansible配置文件/etc/ansible/ansible.cfg
4.Ansible架构介绍(见图说明)
- 连接插件connectior plugins用于连接主机 用来连接被管理端
- 核心模块 core modules 连接主机实现操作, 它依赖于具体的模块来做具体的事情
- 自定义模块 custom modules,根据自己的需求编写具体的模块
- 插件 plugins,完成模块功能的补充
- 剧本 playbooks,ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
- 主机清单 inventor,定义ansible需要操作主机的范围
最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块
例如:ansible yan -m command -a “df -Th”
5.ansible的配置
部署环境
主机 | ip | 角色 |
---|---|---|
ansible | 192.168.101.90 172.16.20.90 | ansible管理端 |
NFS | 192.168.101.80 172.16.20.100 | ansible受控端 |
rsync_backup | 192.168.101.81 172.16.20.101 | ansible受控端 |
web1 | 192.168.101.82 172.16.20.102 | ansible受控端 |
web2 | 192.168.101.83 172.16.20.103 | ansible受控端 |
1.安装ansible
yum -y install ansible
2.部署好公钥认证
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.101.81
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.101.82
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.101.83
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.101.84
3.配置主机清单
vim /etc/ansible/hosts[oldboy_pass]
192.168.101.80
192.168.101.81
192.168.101.83
192.168.101.83
参数
ansible_ssh_host:定义host ssh地址
ansible_ssh_port:定义host ssh端口
ansible_ssh_user:定义host ssh 认证用户
ansible_ssh_pass:定义ssh认证密码
ansible_sudo:定义sudo用户
ansible_sudo_pass:定义sudu密码
ansible_sudo_exe:定义hosts sudo路径
ansible_connection:定义hosts连接方式
ansible_ssh_private_key_file:定义hosts私钥
ansible_ssh_shell_type:定义hosts shell类型
ansible_python_interpreter:定义hosts任我执行python路径
ansible_*_interpreter:定义hosts其他语言解析路径
例如 192.168.101.80 ansible_ssh_user=root ansible_ssh_pass=123456 ansible_ssh_port=22
4.验证
[root@m01 ~]# ansible yan -m ping
192.168.101.82 | SUCCESS => {"changed": false, "ping": "pong"
}
192.168.101.83 | SUCCESS => {"changed": false, "ping": "pong"
}
192.168.101.80 | SUCCESS => {"changed": false, "ping": "pong"
}
192.168.101.81 | SUCCESS => {"changed": false, "ping": "pong"
}ansible yan -m command -a "df -Th"
ansible yan -m command -a "ls"
ansible yan -m shell -a "df -h | grep /$
"
ansible清单管理
inventory文件通常用于自定义要管理主机的认证信息,列入ssh登录用户名、密码及key相关信息。如何配置Inventory文件
主机
- 支持主机名通配以及正则表达式、列入web[1:3].oldboy.com
- 支持基于非标准的ssh端口,列入www…oldboy.com:666
- 支持变量,可对个别主机的特殊配置,如登录用户、密码等
主机组配置方式
支持嵌套组,列入[oldboy:children],那么在oldboy模块下面的组都会被game
支持指定变量,列如[oldboy:vars]在下面至变量
如果没有做SSH秘钥认证,可以把用户名密码写到/etc/ansible/hosts
第一种:[oldboy_pass]
192.168.101.80 ansible_ssh_user=root ansible_ssh_pass=123456 ansible_ssh_port=22
192.168.101.81 ansible_ssh_user=root ansible_ssh_pass=123456 ansible_ssh_port=22
第二中:支持变量的模式
[yan]
192.168.101.80
192.168.101.81
192.168.101.82
192.168.101.83
[yan:vars]
ansible_ssh_pass=123.com.cn
第三种:支持嵌套组
nfs]
192.168.101.80
[rsync_backup]
192.168.101.81
[web1]
192.168.101.82
[web2]
192.168.101.83
[zong:children]
nfs
rsync_backup
web1
web2
6.调用模块来部署架构
安装软件包-修改配置文件-创建程序用户组-创建目录,并修改所属和权限-挂载-启动服务-测试
Ansible注意事项->提示颜色信息说明
- 翔黄色:对远程节点进行相应修改
- 帽子绿:对远程节点不进行相应修改
- 深红色:操作执行命令有异常
- 浅紫色:表示对命令执行发出警告信息(可能存在的问题,给你一下意见)
ansible的帮助工具
ansible-doc 模块名
ansible-doc 模块名 -s 列出改模块的所有着选项
ansible-doc -l 列出所有模块
1.command模块
[root@m01 ~]# ansible oldboy -m command -a "hostname"
2.shell模块
[root@m01 ~]# ansible oldboy -m shell -a "df -h | grep /$" -f 3 -f =forks //结果返回的数量
注意:command和shell模块区别:
command只能调用一条指令
shell可以使用管道
3.yum模块 对安装服务的控制
[root@m01 ~]# ansible web1 -m yum -a "name=httpd state=installed"
- name //指定要安装的软件包名称,如果要有多个,用“,”隔离开
- state //指定使用yum的方法
- installed,present //安装软件包
- removed,absent //移除软件包
- latest //安装最新软件包
4.copy模块 对文件的控制
#推送文件模块,
[root@m01 ~]#ansible ansible -m copy -a "src=/etc/hosts dest=/etc/"
#在推送覆盖远程端文件前,先远程已有文件进行备份,按时间信息备份
[root@m01 ~]#ansible ansible -m copy -a "src=/etc/hosts dest=/etc/ backup=yes"
#直接向远端文件内写入数据信息,并且会覆盖远端文件原有数据信息
[root@m01 ~]# ansible web1 -m copy -a "content='123:qqqq' dest=/root/test123a.txt"
#推送远端文件,改变文件权限属组、属主
[root@m01 ~]# ansible ansible -m copy -a "content='123.com' dest=/root/aa.txt owner=www group=www mode=600"
参数
- src —推送数据的源文件信息
- dest ----推送数据的目标路径
- backup ----推送传输过去的文件,进行备份
- content ----直接批量在呗管理端文件种添加内容
- group ----将本地文件推送到远端,指定文件属组信息
- owner ----将本地文件推送到远端,指定文件属主信息
- mode ----将本地文件推送到远端,指定文件权限信息
5.service模块 对服务的控制
[root@m01 ~]# ansible web1 -m service -a "name=named state=started enabled=yes"
- name #定义要启动服务的名称
- state #指定服务状态是停止或是运行,停止和运行指定要写成过去式
started #启动
stoped #停止
restarted #重启
reloaded #装载 - enabled #是否让服务开机自启动
6.group模块 创建组
[root@m01 ~]# ansible all -m group -a "name=www gid=666" //创建ansible组
[root@m01 ~]# ansible web -m group -a "name=ansible state=absent" //删除ansible组
- gid 设置组id
- name 需要管理的组名
- state 执行状态,absent删除、
present创建(默认)
7.user模块创建用户模块
[root@m01 ~]# ansible web -m user -a "name=zhangsan uid=103 group=ansible shell=/sbin/nologin "[root@m01 ~]# echo "123"| openssl passwd -1 -stdin //-1使用MD5进行加密 --stdin 非交互式
$1$eaawW9Ns$XPSPMJQVb/UWnknWw44cw/
[root@m01 ~]# ansible web -m user -a "name=zhangsan uid=103 group=ansible shell=/sbin/nologin " 注意:password不能使用明文加密;需要加密、passowrd的加密值需要使用双引号。
- =name #用户名
- uid #uid
- group #gid或groupname
- state #执行状态,absent(删除)、present(创建)默认
- shell #登录shell /bin/bash(默认)、/sbin/nologin
- create_home #创建用户时,是否创建家目录,create_home=no/yes
- password #这只密码,不能使用中文,需要使用openssl加密后的密码
注意:password不能使用明文加密,需要加密
#-1使用MD5进行加密 --stdin 非交互式
8.file模块创建修改文件权限
[root@m01 ~]# ansible web -m file -a "path=/data owner=www group=www mode=777 state=touch" //创建文件
[root@m01 ~]# ansible web -m file -a "path=/data1 owner=www group=www mode=777 state=directory" //创建目录
[root@m01 ~]# ansible web -m file -a "path=/data1 owner=www group=www mode=777" //修改文件属性
[root@m01 ~]# ansible web -m file -a "src=/etc/hosts path=/opt/hosts1 state=link" //创建软连接
[root@nginx_web2 opt]# ll
总用量 0
lrwxrwxrwx 1 root root 10 1月 14 12:29 hosts1 -> /etc/hosts
- path 目标文件路径
copy模块的dest
其他模块的name - src #源文件路径
- owner #属主
- group #属组
- mode #权限
- state #absent 删除
#directory 创建目录
#file 修改文件属性(默认)
#touch 创建文件
#link hard 链接 - recurse #递归 recurse=yes
总结:file模块进适合创建目录,修改所属,创建软连接,开除这些操作的其他文件管理都通过copy模块来实现
9.mount模块 挂载
案例1:通过nfs实现网络文件共享
安装nfs
[root@m01 ~]# ansible web2 -m yum -a "name=nfs-utils,rpcbind state=installed"
[root@m01 ~]# ansible web2 -m service -a "name=rpcbind state=started"
[root@m01 ~]# ansible web2 -m service -a "name=nfs state=started"
修改配置文件
[root@m01 ~]# ansible web2 -m copy -a "content='/date 192.168.101.0/24(rw,all_squash,sync,anonuid=666,anongid=666)' dest=/etc/exports"
创建目录、用户、并修改所属
[root@m01 ~]# ansible web2 -m file -a "path=/data group=www owner=www"
重载配置文件
[root@m01 ~]# ansible web2 -m service -a "name=nfs state=restarted"
挂载
[root@m01 ~]# ansible web1 -m mount -a "src=192.168.101.83:/date path=/var/www/html fstype=nfs state=mounted" //挂载设备,则开机自动挂载
[root@m01 ~]# ansible web1 -m mount -a "src=192.168.101.83:/date path=/var/www/html fstype=nfs state=umounted" //卸载设备
- path #挂载点
- src #需要挂载的设备
- fstype #需要挂载文件系统
iso9660 光驱
ext4
nfs
cifs samba的共享文件系统
ntfs windows磁盘文件系统 - opts #挂载属性
noatime
noexec
nosuid - state #挂载动作
present #开机挂载,进将挂再配置写入/etc/fstab
mounted #挂载设备,并将配置写入/etc/fstab
unmounted #卸载设备,不会清楚/etc/fstab
absent #卸载设备,会清楚/etc/fstab
10.script模块 执行脚本
ansible web -m script -a "/root/useradd.sh"
11.cron 计划任务
列子:每天的凌晨1点执行rsync_backup
[root@m01 ~]# ansible all -m copy -a "src=/root/rsync_backup.sh dest=/root/ mode=a+x"[root@m01 ~]# ansible all -m cron -a "name='Rsync Backup' hour=1 minute=0 job='/bin/bash /root/rsync_backup.sh &> /dev/null'"
推送脚本至每天受控端
- name #描述,必须要写,否则无法删除
- job #任务(命令)
- state #执行状态,absent 删除 、present创建(默认)
- minute 分钟
Minute when the job should run ( 0-59, *, */2, etc )
[Default: *] - month 月
Month of the year the job should run ( 1-12, *, */2, etc )
[Default: *] - hour 小时
Hour when the job should run ( 0-23, *, */2, etc )
[Default: *] - day 天数
Day of the month the job should run ( 1-31, *, */2, etc )
(Aliases: dom)[Default: *]
7.Ad-Hoc简介
所谓ad-hoc命令是什么呢?
这其实是一个概念性的名字,是相对于写Ansible playbook来说的。类似于再命令行敲入shell命令和写shell scripts两者之间的关系。
如果我们敲入一些命令去比较快速的完成一些事情,而不需要将这些执行的命令特别的保存下来,这样的命令叫做ad-hoc命令。
ansible提供两种方式去完成任务
- d-hoc命令,:执行shell命令或shell脚本。可以执行一些简单的命令,不需要将这些命令保存下来,适合执行简单的命令
- asible playbook :可以解决较复杂的任务,可以将命令保存下来。适合执行配置管理或部署客户机。
ad-hoc是指将ansible临时执行的一条命令,并且不需要保存的命令,对复杂的命令会使用playbook。ad-hoc的执行依赖于模块,ansible官方提供了大量的模块。如:command、raw、shell、file、cron等具体可以通过ansible-doc -了来进行查看。可使用用ansible-doc-s module来查看某个模块的参数,也可以使用ansible-doc help module来查看改模块更详细的信息。
8.Ansible playbook剧本使用
playbook是由一个或多个模块组成,使用多个不同模块,完成一件事情
playbook通过yaml语法识别描述的状态文件。扩展名是.yaml
1.YAML三板斧 (语法结构)
缩进:
YAML使用一个固定的缩进风格表示层级结构,你每个缩进由两个空格组成,不能使用tab(默认,因为tab=4个空格)
解决方法:
[root@m01 ~]# cat .vimrc
set tabstop=2
冒号:
以冒号结尾的除外,其他所有冒号后面必须有空格
短横线:
表示列表项,使用一个段横杠加一个空格
多个项使用同样的缩进级别作为同一个列表。
2.playbook的核心参数
hosts:主机清单
tasks:任务
vars:变量
handlers:特定条件触发的任务
template:包含模板的文本文件
3.命令格式
ansible-playbook [选项参数] 剧本文件
命令常用选项**
- -C, --check 模拟运行
- –list-hosts 列出剧本主机清单
- –list-tags 列出剧本标记
–list-tasks 列入剧本任务 - –syntax-check 检查语法
2.ansible playbook 安装apache示例
[root@m01 ansible_playbook]# vim apache.yaml
hosts: web2 //主机清单
tasks: //任务name: Install Httpd //描述yum: name=httpd state=installed name: Configure Httpd_confcopy: src=./conf/httpd.conf dest=/etc/httpd/conf/httpd.confnotify: Restart Http Service //关联handlers 此命令操作就执行handlers name: Start Http Serverservice: name=httpd state=started enabled=yeshandlers: //与上面的notify关联name: Restart Http Serviceservice: name=httpd state=restarted#模拟检测并执行
[root@m01 playbook_yaml]# ansible-playbook -C apache.yaml
[root@m01 playbook_yaml]# ansible-playbook apache.yaml
多个剧本合并:
vim mail.yaml
- import_playbook: base.yaml
- import_playbook: rsync.yaml
- import_playbook: nfs.yaml
- import_sersync.yaml
- import_web.yaml
Ansible部署rsync+nfs+sersync实现方法
1.角色
设备名 | ens192 | ens224 |
---|---|---|
NFS | 192.168.101.80 | 172.16.20.100 |
rsync_backup | 192.168.101.81 | 172.16.20.101 |
web1 | 192.168.101.82 | 172.16.20.102 |
web2 | 192.168.101.83 | 172.16.20.103 |
2.实现步骤:
- 保证ssh密钥认证失效
- 安装ansible
- 准备相关文件并修改
-rw-r–r-- 1 root root 542 1月 16 10:32 config
-rw-r–r-- 1 root root 67 1月 16 12:59 exports
-rw-r–r-- 1 root root 11753 1月 16 10:37 httpd.conf
-rw-r–r-- 1 root root 17 1月 16 10:43 index.html
-rwxr-xr-x 1 root root 563 1月 16 17:12 rsync_backup.sh
-rw-r–r-- 1 root root 624 1月 16 17:11 rsyncd.conf
-rw-r–r-- 1 root root 27 1月 16 10:36 rsync.passwd
-rw-r–r-- 1 root root 4 1月 16 10:36 rsync.password
drwxr-xr-x 2 root root 41 1月 16 16:20 sersync
3.基础部署(hosts:all)
vim all.yaml
- hosts: alltasks:- name: Disable selinux #关闭selinuxcopy: src=/etc/ansible/conf/config dest=/etc/selinux/config- name: Create Group #创建组group: name=www gid=777- name: Create User #创建用户user: name=www uid=777 group=www shell=/sbin/nologin createhome=no- name: Install NFS #安装nfs rpcbindyum: name=nfs-utils,rsync state=installed- name: Install RPCbind #安装nfs rpcbindyum: name=rpcbind state=installed- name: Stop friewalld #关闭防火墙service: name=firewalld state=stopped- name: Copy rsync_backup.sh #复制脚本copy: src=/etc/ansible/conf/rsync_backup.sh dest=/root/rsync_backup.sh mode=a+x- name: cron rsync_backup #址作任务计划cron: name='Rsync_backup' hour=0 minute=0 job='/bin/bash /root/rsync_backup.sh &> /dev/null'
4.rsync部署
vim install_rsync.yaml
hosts: rsync_backup
tasks:- name: Copy Rsyncd.conf #复制配置文件copy: src=/etc/ansible/conf/rsyncd.conf dest=/etc/rsyncd.confnotify: Restarted rsync- name: Copy Rsync.passwd #复制认证密码copy: src=/etc/ansible/conf/rsync.passwd dest=/etc/rsync.passwd mode=600- name: Create path=/backup #创建目录file: path=/backup group=www owner=www state=directory- name: Create path=/html #创建html目录file: path=/html group=www owner=www state=directory- name: Start Rsyncd #启动rsyncservice: name=rsyncd state=started enabled=yeshandlers:- name: Restarted rsync #重启rsyncservice: name=rsyncd state=restarted
5.nfs部署
vim install_nfs.yaml
- hosts: nfs-servicetasks:- name: Copy File exports #复制nfs配置文件copy: content='/html 192.168.101.0/24(rw,all_squash,sync,anonuid=777,anongid=777)' dest=/etc/exportsnotify: Restarted nfs- name: Copy File rsync.password #复制认证密码copy: src=/etc/ansible/conf/rsync.password dest=/etc/rsync.password mode=600- name: Create path=/html #创建目录file: path=/html group=www owner=www state=directory- name: bianxie .html #编辑htmlcopy: content='rsync+nfs hellword' dest=/html/index.html- name: Start rpcbind #启动nfsservice: name=rpcbind state=started enabled=yes- service: name=rpcbind state=started enabled=yes- name: Start nfs #启动startservice: name=nfs state=started enabled=yeshandlers:- name: Restarted nfs #重启nfsservice: name=nfs state=restarted
6.sersync部署
vim install_sersync.yaml
- hosts: nfs-servicetasks:- name: Copy file sersync #复制sersync文件copy: src=/etc/ansible/conf/sersync dest=/usr/local/ mode=777- name: sersync #运行sersync脚本shell: /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
7.web部署
vim install_httpd.yaml
hosts: web1
tasks:- name: Install Httpd #安装httpdyum: name=httpd state=installed- name: Copy httpd.conf #复制配置文件copy: src=/etc/ansible/conf/httpd.conf dest=/etc/httpd/conf/httpd.confnotify: Restarted httpd- name: Start httpd #启动httpdservice: name=httpd state=started- name: Mount 192.168.101.82:/html /var/www/html #挂载html目录mount: src=192.168.101.82:/html path=/var/www/html fstype=nfs state=mountedhandlers:- name: Restarted httpd #重启httpdservice: name=httpd state=restarted
8.剧本合并
[root@m01 playbook_yaml]# vim install_rsync+web1+nfs.yaml - import_playbook: all.yaml
- import_playbook: install_rsync.yaml
- import_playbook: install_nfs.yaml
- import_playbook: install_sersync.yaml
- import_playbook: install_httpd.yaml
9.执行ansible剧本install_rsync+web1+nfs.yaml
#模拟检测
[root@m01 playbook_yaml]# ansible-playbook -C install_rsync+web1+nfs.yaml
#执行
[root@m01 playbook_yaml]# ansible-playbook install_rsync+web1+nfs.yaml
学习Ansible自动化相关推荐
- ansible自动化部署(一)
ansible自动化部署 最近因为工作需要学习了ansible,把这几天所学的东西做了个总结,和大家分享一下: 1.什么是ansible?ansible能干什么? ansible是新出现的自动化运维工 ...
- 一小时学会Ansible自动化运维
[欢迎关注微信公众号:厦门微思网络] 微思网络(官网):https://www.xmws.cn/ 今天分享一个讲解 Ansible 的 PPT,内容非常全面,可帮助你更好的学习Ansible. 红帽R ...
- K8S实战集训第一课 Ansible自动化部署k8s、弹性伸缩、Helm包管理、k8s网络模型介绍
Ansible自动化部署K8S集群 一.Ansible自动化部署K8S集群 1.1 Ansible介绍 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部 ...
- ansible自动化运维工具
ansible自动化运维工具 ansible自动化运维脚本工具 ansible自动化运维工具 一.ssh工作原理和基本命令 1.ssh原理 2.ssh的基本命令 二.anible 自动化运维工具 1. ...
- ansible自动化运维从入门到精通
ansible自动化运维 Ansible介绍 Ansible是一个同时管理多个远程主机的软件(任何可以通过SSH协议登录的机器),因此Ansible可以管理远程虚拟机.物理机,也可以是本地主机. An ...
- @ansible自动化运维详解(总述)
ansible [自动化运维应用场景] "运维的未来是,让研发人员能够借助工具.自动化和流程,并且让他们能够在运维干预极少的情况下部署和运营服务,从而实现自助服务.每个角色都应该努力使工作实 ...
- Ansible自动化运维(五)----Ansible剧本
Ansible自动化运维(五)----Ansible剧本 Ansible核心的功能,作用就是进行配置管理. Ansible需要编写的 playbook 剧本需要遵循一定的规则,格式,这个格式就称之为y ...
- Ansible自动化运维工具介绍与部署
ansible自动化运维工具介绍与部署 文章目录 一.什么是自动化运维? 二.常用的自动化运维工具 2.1 Ansible 2.2 SaltStack 2.3 Puppet 2.4 三种自动化工具特点 ...
- 基于强化学习的自动化剪枝模型
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨AI科技评论 编辑丨极市平台 导读 GitHub上最新开源的一 ...
最新文章
- 如何更改gridview中任意单元格颜色或者内容。
- 近期遇到的一些信号处理的问题,做一下总结
- undefined symbol: _Py_ZeroStruct
- input[type=file] 异步上传文件
- 01,完全,多重,分组
- CMake基础 第5节 安装项目
- Tomcat端口占用相关的问题
- ORA-01756: quoted string not properly terminated
- layui 自动渲染_Layui表格自动渲染
- LUA验证系统PHP,用Nginx+Lua实现高性能、高可靠、安全的登陆验证
- 使用ENVI对遥感图像进行图像镶嵌、图像裁剪。
- number数据类型
- 《郭论》郭德纲/著 读后得2021-02-22
- 为你的网站添加 htpps
- 【简单详细】为Unity游戏制作开场动画video,新手必看
- 可以远程控制的浏览器(双核)让浏览器动起来
- Win10调整各窗口的任务栏位置
- win 10 安装时候无法格式化分区,错误 0x80070057
- 网络七层协议具体是什么?
- 海外调查问卷渠道平台
热门文章
- 2020最新尚硅谷- 大数据课程
- python 例外 重试_Python例外:简介
- python office转pdf linux_python 如何将office文件转换为PDF
- 视频转换格式,用DOS命令
- JavaScript倒计时算法(计算剩余多少天)实现
- Hibernate:Acquisition Attempt Failed Clearing pending acquires.
- A reference for learning process
- mysql插入时间少八个小时
- 数据库课程设计之通讯录管理系统之目录
- android到底要多少内存,手机内存究竟要多大才够用?