ansible: Linux批量管理神器

我们已经知道,基于集群可实现服务器横向扩展slace out。可是,当上百台主机集合成共同为一个站点提供web页面访问的形式时,怎么管理整个集群体呢?
一些小伙伴大概听说过pxe等可实现自动安装系统。可是,要我们一台一台主机的开机,一个个的载入引导文件,当这个主机基数足够庞大时,那也着实不是一件轻松的事情。这样的工作做上个个把月,也就不用在运维界混了。
诶,不要怂。阿拉今天这不就要介绍这么一个可以帮我们实现批量化主机命令管理的工具了嘛!
试想一下,ansible用在年底扩容促销时简直无疑与一件大杀器。

但是,这样个玩意,也是有使用前提的。拿尼,只是运维界的业内规范而已————标准化、自动化、架构优化、过程优化。
哈哈,理想状态下的运维部门果然应该是如下的形式吧!

理想状态下的运维部门:
1、只有少数类型的硬件,便于管理
2、系统版本统一
3、目录结构规范
4、运维工程师水平层次高
5、无历史包袱
6、同一软件只有单一版本
7、同一类操作可自动化批量执行
8、工作效率高,无大量重复机械化操作
9、开发自己上线,运维比较轻松

然而,现实往往是只会让人吐血。不过还是暂行镇静,身体是自己的,且行且珍惜。所以,遇到下面的情形时,一定要平静心绪,摒弃兴奋,告诉自己憋激动。挑战即机遇,不过咱也得先做好不是!

目前多数公司遇到的运维问题现状:
1、硬件选型多样化 
2、系统多版本并存
3、目录结构混乱
4、运维人员水平参差不齐
5、历史遗留问题多
6、同一软件出现多个版本
7、无法批量化操作
8、工作效率低,故障率高
9、项目上线操作繁琐

至于大施拳脚的方式,那就仁者见仁智者见智了。各位都是运维界的精英,到时候说不定阿拉还有求到各位的地方,就希望大佬们到时候不吝赐教啦!
说起来以上也差不多就是咱运维的工作内容了,嗯,列举出来就是:

日常运维工作中的重要事件:
1、添加监控,收集系统指标
2、对日志进行归档以及管理
3、数据备份于恢复
4、对计划任务进行管理
5、对软件包进行部署和管理
6、对脚本进行批量执行
7、对文件进行批量复制和移动
8、设置文件或者目录对应的权限
9、关闭和启动服务
10、对代码程序进行上下线

企业里,在日常工作中不断优化系统架构和部署的合理性是一项长期而持续的工作。嗯,与诸君共勉!

生活真是不易又刺激啊!嘛,阿拉现在要说的,是基于标准化之后的系统环境之后的部分。哈哈。

ansible简介

安装

这个简单。配置好epel源的话直接yum install ansible就哦了。
另外ansible是python编写的。如果没pip,需先安装pip.yum可直接安装:yum install python-pip。

操作方式

Ansible系统由控制主机对被管节点的操作方式可分为两类,即ad-hoc和playbook。简单来说,ad-hoc是命令行管理,实现功能单一。playbook类似脚本,可通过ad-hoc命令堆砌的形式实现整体的功能,嘛,当成脚本理解是没错的。要说不同,就是这个命令行和脚本的语法有点怪了。

主配置文件

[root@cet7 ansible]# ls /etc/ansible -l
-rw-r--r-- 1 root root 14420 Dec 4 14:30 ansible.cfg
-rw-r--r-- 1 root root 1057 Dec 4 11:57 hosts
drwxr-xr-x 2 root root 6 Jan 17 2017 roles

  • [ ] 主配置文件里的日志开启下就可以直接使用了。
  • [ ] hoste文件定义主机,即ansible服务器所辖的节点。可按其功能定义不同的组,通过组来发出命令。
  • [ ] roles文件夹以结构化的形式定义出ansible执行命令所需的各因素。
  • [ ] 可以直接在此目录下定义.yml的独立playbook文件。也可与roles下定义的变量等相关联。

配置的详细信息下面还有专门的介绍。

命令执行过程

1、加载自己的配置文件 默认/etc/ansible/ansible.cfg
2、查找对应的主机配置文件,如hosts,找到要执行的主机或者组
3、加载自己对应的模块文件,如command
4、通过ansible将模块或命令生成对应的临时py文件(python格式),并将该文件传输至远程服务器
5、对应执行用户的家目录下的.ansible/tmp/XXX/XXX.PY文件
6、给文件+x执行
7、执行并返回结果
8、删除临时py文件,sleep 0退出

Ansible配置

主配置文件ansible.cfg

ansible有许多参数,下面列出常用的参数:

1.inventory

这个参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表。这个参数的配置实例如下:
inventory = /etc/ansible/hosts

2.library

Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录。配置实例如下:
library = /usr/share/ansible
Ansible支持多个目录方式,只要用冒号(:)隔开就可以,同时也会检查当前执行playbook位置下的./library目录。

3.forks

设置默认情况下Ansible最多能有多少个进程同时工作, 从Ansible 1.3开始,fork数量默认
自动设置为主机数量或者潜在的主机数量,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管节点的数量来确定,可能是50或100。默认值5是非常保守的值,配置实例如下:
forks = 5

4.sudo_user

这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数。配置实例如下:
sudo_user = root

5.remote_port

这是指定连接被管节点的管理端口,默认是22。除非设置了特殊的SSH端口,不然这个参数一般是 不需要修改的。配置实例如下:
remote_port = 22

6.host_key_checking

这是设置是否检查SSH主机的密钥。可以设置为True或False,关闭后第一次连接没有提示。配置实例:
host_key_checking = False

7.timeout

这是设置SSH连接的超时间隔,单位是秒。配置实例如下:
timeout = 60

8.log_path

Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录到日志文件中,需要设置log_path来指定一个存储Ansible日志的文件。配置实例如下:
log_path = /var/log/ansible.log
另外需要注意,执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录

主机清单设置文件hosts

/etc/ansible/hosts定义方式:

1、直接指明主机地址或主机名:

green.example.com
blue.example.com
192.168.100.1
192.168.100.10

2、定义一个主机组[组名]把地址或主机名加进去

[web]
node1.magedu.com
node2.magedu.com
#组成员可以使用通配符来匹配,如172.17.7.[101:1066]表示匹配从172.17.30.101——172.17.30.106的主机

Ansible命令集

1.ansible: Ansibe AD-Hoc临时命令执行工具,常用于临时命令的执行

命令格式:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
-a 跟模块的参数,如果执行默认COMMAND的模块,即是命令参数
-C 只是测试一下会改变什么内容,不会真正去执行
-f 并行任务数。需指定为一个整数,默认是5
-i 指定库存主机文件的路径,默认为/etc/ansible/hosts
-m 指定执行模块的名字,默认使用 command 模块
-S su,用 su 命令
-R 指定SU的用户,默认是root用户
-s sudo
-U sudo到哪个用户,默认为 root
-T 指定SSH默认超时时间,默认是10S
-t 将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上
-u 远程用户,默认是root用户
-v,-vv,-vvv 输出ansible的版本及详细信息

2.ansible-doc: Ansible模块功能查看工具

-l: 获取模块信息
-s: MOD_NAME 获取指定模块的使用帮助
-v: 显示ansible-doc的版本号查看模块列表

3.ansible-galaxy: 下载/上传优秀代码或Roles模块的官网平台,基于网络的
4.ansible-playbook: Ansible定制自动化的任务集编排工具
5.ansible-pull: Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
6.ansible-vault: Ansible 文件加密工具
7.ansible-console: Ansible基于Linux Consoble界面可与用户交互的命令执行工具

Ansible使用

Ansible配置公私钥

虽然ansible支持其他主机认证方式,但是我们最常用的的还是基于秘钥的认证:
1、首先生成秘钥

ssh-keygen -t rsa -P ''

2、然后向主机分发秘钥:

ssh-copy-id root@ #@后面跟主机名或者IP地址

3、如果出现以下情况:

# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.6.72
-bash: ssh-copy-id: command not found

请尝试:
yum -y install openssh-clientsansible

Ansible常用模块

1.ping:主机连通性测试:

[root@desperadochn ~]# ansible all -m ping
192.168.253.138 | SUCCESS => { “changed”: false, “ping”: “pong” }
192.168.253.137 | SUCCESS => { "changed": false, "ping": 

2.command:在远程主机执行命令;不支持|管道命令

  • [ ] 命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作符如”小于”<“,”>”, “|”, “;”,”&”‘ 工作(需要使用(shell)模块实现这些功能)。
  • [ ] 该模块可使用的子选项如下(定义在-a后):
    chdir # 在执行命令之前,先切换到该目录
    creates # 一个文件名,当这个文件存在,则该命令不执行,可以用来做判断
    executable # 切换shell来执行命令,需要使用命令的绝对路径
    free_form # 要执行的Linux指令,一般使用Ansible的-a参数代替。
    removes # 一个文件名,这个文件不存在,则该命令不执行,与creates相反的判断
[root@cet7 ansible]# ansible web -m command -a 'ls'  
node1.magedu.com | SUCCESS | rc=0 >>
172.17.30.102
5
anaconda-ks.cfg
bin
hello.jpg
initial-setup-ks.cfg
mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
nohup.outnode2.magedu.com | SUCCESS | rc=0 >>
anaconda-ks.cfg
bin
crontab
FLUSH
initial-setup-ks.cfg
mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
UNLOCK[root@cet7 ansible]# ansible web -m command -a 'chdir=/app ls'
node1.magedu.com | SUCCESS | rc=0 >>
fastdfs
mogilefs
zabbix-release-3.4-1.el7.centos.noarch.rpmnode2.magedu.com | SUCCESS | rc=0 >>
fastdfs
zabbix
zabbix-release-3.4-1.el7.centos.noarch.rpm

3、shell模块在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等

[root@cet7 ansible]# ansible web -m shell -a 'cat /etc/passwd|grep "root"'
node1.magedu.com | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologinnode2.magedu.com | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

4.copy:复制文件到远程主机,可以改权限等
相关选项如下:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代“src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
用法:
(1) 复制文件

-a "src= dest= "
[root@cet7 ansible]# ansible web -m copy -a 'dest=/etc/nginx/nginx.conf src=/tmp/nginx.conf backup=yes'             
node1.magedu.com | SUCCESS => {"backup_file": "/etc/nginx/nginx.conf.98474.2017-12-05@19:08:38~", "changed": true, "checksum": "c5001a957cc53286f448b5519183f21c3ac82a90", "dest": "/etc/nginx/nginx.conf", "gid": 0, "group": "root", "md5sum": "2ca5097c8b871a904650b483da85cc65", "mode": "0644", "owner": "root", "size": 2466, "src": "/root/.ansible/tmp/ansible-tmp-1512472114.1-112119450637656/source", "state": "file", "uid": 0
}
node2.magedu.com | SUCCESS => {"backup_file": "/etc/nginx/nginx.conf.126834.2017-12-05@19:08:39~", "changed": true, "checksum": "c5001a957cc53286f448b5519183f21c3ac82a90", "dest": "/etc/nginx/nginx.conf", "gid": 0, "group": "root", "md5sum": "2ca5097c8b871a904650b483da85cc65", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:httpd_config_t:s0", "size": 2466, "src": "/root/.ansible/tmp/ansible-tmp-1512472118.6-139130457070354/source", "state": "file", "uid": 0
}

(2) 给定内容生成文件

-a "content= dest= "
[root@cet7 ansible]# ansible web -m copy -a 'content="hello jone" dest=/root/a.txt backup=yes'
node1.magedu.com | SUCCESS => {"changed": true, "checksum": "dc302a377c9890ad3ea20b0d252d8c06e437ff97", "dest": "/root/a.txt", "gid": 0, "group": "root", "md5sum": "de66aa1fe06344d982e2e7448cbdfb20", "mode": "0644", "owner": "root", "size": 10, "src": "/root/.ansible/tmp/ansible-tmp-1512472257.6-80857257348609/source", "state": "file", "uid": 0
}
node2.magedu.com | SUCCESS => {"changed": true, "checksum": "dc302a377c9890ad3ea20b0d252d8c06e437ff97", "dest": "/root/a.txt", "gid": 0, "group": "root", "md5sum": "de66aa1fe06344d982e2e7448cbdfb20", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 10, "src": "/root/.ansible/tmp/ansible-tmp-1512472258.3-112721288787897/source", "state": "file", "uid": 0
}
[root@cet7 ansible]# ansible web -m shell -a 'cat /root/a.txt'
node1.magedu.com | SUCCESS | rc=0 >>
hello jonenode2.magedu.com | SUCCESS | rc=0 >>
hello jone

5、其他模块

(1) file模块: Sets attributes of files
用法:
<1> 创建链接文件:*path= src= state=link
<2> 修改属性:path= owner= mode= group= 
<3> 创建目录:path= state=directory

注意:state属性的可用值:file,directory,link,hard,touch,absent

(2) get_url模块: Downloads files from HTTP, HTTPS, or FTP to node

*url=
*dest=
sha256sum=
owner, group, mode

(3) git模块:Deploy software (or files) from git checkouts

                    repo=dest=version=

(4) deploy_helper模块:Manages some of the steps common in deploying projects.

(5) haproxy模块:Enable, disable, and set weights for HAProxy backend servers using socket commands.

backend=
host=
state=
weight=

(6) cron 模块:Manage cron.d and crontab entries.

minute=
day=
month=
weekday=
hour=
job=
*name=
state=(present:创建\|absent:删除)

(7) hostname模块:Manage hostname

name=

(8) pip模块:Manages Python library dependencies.

name=
state=
version=

(9) npm模块:Manage node.js packages with npm

name=
state=
version=

(10) yum模块:Manages packages with the `yum' package manager

name=(程序包名称,可以带版本号)
state=present, latest, installedabsent, removed
  • [ ] 其它的包管理工具:apt(debian), zypper(suse), dnf(fedora), rpm, dpkg, ...

(11) service模块:管理服务

*name=
state=startedstoppedrestarted
enabled=
runlevel=

(12) setup模块:获取facters,即获取系统相关的各项参数

Playbook

Playbook是YAML语言写成的剧本,但其本质仍是模板调用。剧本用来执行一系列命令,类似脚本。

YAML语言以缩进区分级别,以-区分键值,所以次语言对格式要求很高。

比如以下:
用命令行写的远程安装redis的命令转化为playbook的格式即是:

ansible node1.magedu.com -m yum -a "name=redis state=latest"
vim first.yaml
---
- hosts: node1.magedu.comremote_user: roottasks: - name: install redisyum: name=redis state=latest

hosts: 后跟的主机,需在/etc/ansible/hosts里事先定义;
remote_user: 远程主机执行命令的用户身份;
tasks: 顾名思义,任务列表;
name: 一个name代表一个任务,后跟任务名,实际作用为区分所执行的任务;
yum: 调用的模块。后跟的内容对应命令行-a后的内容。

单个任务而言显然是命令行更高效。单要是一长串的任务playbook的优势就明显了。比如安装后启动redis。

vim second.yaml
---
- hosts: node1.magedu.comremote_user: roottasks: - name: install redisyum: name=redis state=latest- name: start redisservice: name=redis start=started

一个稍微全面的playbook如下,里面还有我们尚未提及的内容:

vim third.yaml
---
- hosts: allremote_user: roottasks: - name: install redisyum: name=redis state=latest- name: copy config filecopy: src=/root/playbook/redis.conf dest=/etc/redis.conf owner=redisnotify: restart redistags: configfile- name: start redisservice: name=redis start=startedhandlers: - name: restart redisservice: name=redis state=restarted

notify: 定义触发任务。这里指copy config file任务执行成功会触发执行restart redis任务;
handlers: 由特定条件触发才会执行相对应的任务;
tags: 为任务添加标签,可调用单独执行一个命令,如: ansible-playbook -t configfile third.yaml,意为只执行标签为configfile的任务,即只拷贝redis的配置文件。

对应此,我们详细说下playbook。

运行playbook的方式:

(1) 测试

  • [ ] ansible-playbook --check: 只检测可能会发生的改变,但不真正执行操作;
  • [ ] ansible-playbook --list-hosts: 列出运行任务的主机;
  • [ ] ansible-playbook --list-tasks: 列出要运行的任务列表
  • [ ] ansible-playbook --syntax-check: 语法检查

(2) 运行

  • [ ] ansible-playbook xx.yaml

playbook的基础组件:

Hosts:运行指定任务的目标主机;
remoute_user: 在远程主机上执行任务的用户;sudo_user:
tasks:任务列表模块,模块参数;格式:(1) action: module arguments(2) module: arguments注意:shell和command模块后面直接跟命令,而非key=value类的参数列表;(1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;(2) 任务可以通过"tags"打标签,而后可在ansible-playbook命令上使用-t指定进行调用;handlers:任务,在特定条件下触发;接收到其它任务的通知时被触发;
notify: HANDLER TASK NAMEvariables:(1) facts:可直接调用;注意:可使用setup模块直接获取目标主机的facters;(2) 用户自定义变量:(a) ansible-playbook命令的命令行中的-e VARS, --extra-vars=VARS                      (b) 在playbook中定义变量的方法:vars:- var1: value1- var2: value2变量引用:{{ variable }}(3) 通过roles传递变量;(4) Host Inventory(a) 用户自定义变量(i) 向不同的主机传递不同的变量;IP/HOSTNAME  varaiable=value var2=value2(ii) 向组中的主机传递相同的变量;[groupname:vars]variable=value(b) invertory参数用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量;ansible_ssh_hostansible_ssh_portansible_ssh_useransible_ssh_passansbile_sudo_pass...补充模块:setup模块:template模块:基于模板方式生成一个文件复制到远程主机*src=*dest=owner=group=mode=模板:templates文本文件,嵌套有脚本(使用模板编程语言编写)Jinja2:字面量:字符串:使用单引号或双引号;数字:整数,浮点数;列表:[item1, item2, ...]元组:(item1, item2, ...)字典:{key1:value1, key2:value2, ...}布尔型:true/false算术运算:+, -, *, /, //, %, **比较操作:==, !=, >, >=, <, <=逻辑运算:and, or, not 示例: - hosts: websrvsremote_user: roottasks:- name: install nginxyum: name=nginx state=present- name: install conf filetemplate: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.confnotify: restart nginxtags: instconf- name: start nginx serviceservice: name=nginx state=startedhandlers:- name: restart nginxservice: name=nginx state=restarted                 模板配置文件 :nginx.conf.j2worker_processes {{ ansible_processor_vcpus - 1 }};listen {{ http_port }};server_name 条件测试:when语句:在task中使用,jinja2的语法格式tasks: - name: install conf file to centos7template: src=files/nginx.conf.c7.j2when: ansible_distribution_major_version == "7"- name: install conf file to centos6template: src=files/nginx.conf.c6.j2when: ansible_distribution_major_version == "6"               循环:迭代,需要重复执行的任务;对迭代项的引用,固定变量名为”item“而后,要在task中使用with_items给定要迭代的元素列表;列表方法:字符串字典- name: install some packagesyum: name={{ item }} state=presentwith_items:- nginx- memcached- php-fpm- name: add some groupsgroup: name={{ item }} state=presentwith_items:- group11- group12- group13- name: add some usersuser: name={{ item.name }} group={{ item.group }} state=presentwith_items:- { name: 'user11', group: 'group11' }- { name: 'user12', group: 'group12' }- { name: 'user13', group: 'group13' }角色(roles):角色集合:roles/mysql/httpd/nginx/memcached/每个角色,以特定的层级目录结构进行组织:mysql/files/ :存放由copy或script模块等调用的文件;templates/:template模块查找所需要模板文件的目录;tasks/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;vars/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;default/:设定默认变量时使用此目录中的main.yml文件;在playbook调用角色方法1:- hosts: websrvsremote_user: rootroles:- mysql- memcached- nginx在playbook调用角色方法2:传递变量给角色- hosts: remote_user:roles:- { role: nginx, username: nginx }键role用于指定角色名称;后续的k/v用于传递变量给角色;还可以基于条件测试实现角色调用;roles:- { role: nginx, when: "ansible_distribution_major_version == '7' " }ansible-vcs:https://github.com/andrewrothstein/ansible-vcs本文转自阿拉杜美美51CTO博客,原文链接:http://blog.51cto.com/amelie/2049108 ,如需转载请自行联系原作者

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

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

相关文章

[转载] Python numpy函数:all()和any()比较矩阵

参考链接&#xff1a; Python中的any和all 数组元素的比对&#xff0c;我们可以直接使用“”进行比较&#xff0c;比如&#xff1a; 但是当数组元素较多时&#xff0c;查看输出结果便变得很麻烦&#xff0c;这时我们可以使用all&#xff08;&#xff09;方法&#xff0c;直接…

MySQL初识-架构-安装-初始化-连接-管理工具-数据文件

MySQL架构和结构分析 官方架构图 内部组件结构图 MySQL安装方式 MySQL初始化 MySQL工作模式及常用命令 交互式模式&#xff1a;mysql> 1234567891011121314# 交互式模式下的客户端命令mysql> help # 获取命令帮助 mysql> \? # 同上 mysql> \c # 取消命令执行 mysq…

[转载] Java基础——关联、聚合、组合

参考链接&#xff1a; Java中的关联 | 组合和聚合 一.引言 其实自己也不知道&#xff0c;在需求设计、架构设计、开发阶段是否真正需要弄明白“关联、聚合、组合”。原本计划这篇博文写“继承“和”多态”&#xff0c;但是一翻阅资料&#xff0c;基本上都会把“继承”和“组…

[转载] WSDL2Java详细使用说明【官方最全说明】

参考链接&#xff1a; Java中的this说明 WSDL to Java 命名 wsdl2java - 获取WSDL文档并生成完全带注释的Java代码&#xff0c;并实现相关服务。 概要 用例 : wsdl2java -fe|-frontend <front-end-name> -db|-databinding <data-binding-name> -wv <…

mdm.Dialogs.promptModal()使用

这是prompt的扩展&#xff0c;提供了更多的功能&#xff0c;比如可以添加其他按钮和图标import mdm.*;mdm.Application.init(this, onInit);function onInit():void {// 启动程序...}quit.addEventListener(MouseEvent.CLICK,quitProgram);function quitProgram(evt:MouseEvent…

[转载] JAVA 构造函数及其重载

参考链接&#xff1a; Java重载Overload public class Student{ public int stuId; public String stuName; public int stuAge; public int stuScore; public Student(){ } public Student(int sId,String sName){ stuId sId; sName stuName; } public Student(int sld,S…

学生机房虚拟化(十)系统操作设计实现

引入&#xff1a; 在前篇思路的指导下&#xff0c;进行了为期三个星期的调试最终建立了一个初步成熟的&#xff0c;具有亲和力的配置界面&#xff0c;现在此虚拟系统已经初步部署了一个机房&#xff0c;用来学生日常上课。在本篇中&#xff0c;本人并不试图去花篇幅讲解彼此之间…

[转载] java之重写toString

参考链接&#xff1a; Java程序的输出| 重写Override 1.toString()就是是重写&#xff0c;对于一般的对象来说都会有这个方法&#xff0c;其实这个方法的目的&#xff0c;主要就是将对象按字符串的方式输出出来&#xff1a;打个比方&#xff0c;比如一个People类&#xff0c;里…

Gson的使用,对于不需要html escape的情况的处理

引入&#xff1a; 虽然是小问题&#xff0c;但是我还是需要记录下&#xff0c;我们知道&#xff0c;Google提供了一个Gson框架让我们高效的吧普通对象&#xff08;一般VO为佳&#xff09; 和json字符串之间进行互转。因为转换多数是和浏览器打交道的&#xff0c;所以一般默认的…

[转载] Java 重写paint绘图

参考链接&#xff1a; 用Java重写Override 感谢原文&#xff1a;https://zhidao.baidu.com/question/260060153.html 这个方法需要注意的地方不多&#xff0c;也就是重写时&#xff0c;先调用 super.paint(g) 方法 paint方法不需要编写代码调用&#xff0c;只需要重写。 其他…

教你如何进入有密码的 XP 系统(下)

自动登录时禁用Shift键 当使用自动登录功能时&#xff0c;用户可通过按住Shift键忽略登录进程&#xff0c;输入其他用户名及密码进入电脑。该技巧可以禁用自动登录时的Shift键功能。操作步骤如下&#xff1a;打开“注册表编辑器”&#xff0c;找到[HKEY_LOCAL_MACHINE\Softwar…

[转载] 2020最新Java面试题,常见面试题及答案汇总

参考链接&#xff1a; Java程序的输出| 18(重写Override) 发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全&#xff0c;希望对大家有帮助哈~ 博主已将以下这些面试题整理成了一个Java面试手册&#xff0c;是PDF版的。 关注…

【心随笔】叙述你成功完成一件事情的方法

一、situation 先描述你曾经处于的困难状况 二、task / target 说一说你是怎样做出打算的 三、action / attitude 告诉别人你做出的行动 四、result 最后获得了怎样的成绩转载于:https://www.cnblogs.com/tnxlvlxy/p/7806142.html

[转载] java排序compareTo:降序输出学生成绩

参考链接&#xff1a; Java程序的输出| 18(重写Override) 一道简单程序题&#xff1a; 编写一个程序&#xff0c;输入学生的姓名、分数信息&#xff0c;要求程序按照成绩降序排序后并输出。 实现方法有很多 方法一 public class ScoreSort2 { private String name; pr…

300GB*6 SCSI RAID5 LINUX服务器数据恢复手记

[摘要]某数码冲印网站&#xff0c;采用DELL POWEREDGE2850服务器&#xff0c;存储部分由6块300G硬盘组成RAID5&#xff0c;LINUX平台&#xff0c;1.5T逻辑磁盘中只包含一个卷&#xff0c;文件系统为EXT3&#xff0c;存储所有客户数码照片&#xff0c;服务器的故障导致整个公司无…

[转载] public static void main(String[] args) 隐含了什么?

参考链接&#xff1a; 了解Java中“ public static void main”中的“ static” public class TestSort { public static void main(String[] args) { // 需要分别用Javac和Java命令行编译和运行 int[] arr; int temp 0; arr new int [9]; for (int i 0; i < arr.length…

在C#中创建DataTable

经常遇到对DataTable进行各种运算&#xff0c;这方面的资料经常散落在各处&#xff0c;使用起来不方面&#xff0c;我想还是把他们集中到博客中&#xff0c;下次要用到的时候可以直接查看。下面是创建一个空白的DataTable&#xff0c;并定义相关的字段&#xff1a;DataTable dt…

[转载] Java中的静态方法不能被子类重写

参考链接&#xff1a; 可以在Java中重载或重写静态方法吗 Java中的静态方法不能被子类重写 特点&#xff1a;静态方法属于类的方法&#xff0c;也属于对象的方法&#xff0c;但是静态方法随类的存在。 结论&#xff1a;Java中的静态方法不能被子类重写&#xff0c;实际上&…

2015-03-19 create php alternative for myslq_result in mysqli(PHP)--PDO Tutorial for Mysql Developers

来源&#xff1a;http://www.bestwebframeworks.com/tutorials/php/152/create-php-alternative-for-mysql_result-in-mysqli/ 内容&#xff1a; If you are migrating from PHP 5.5 to a newer version of PHP - you might be interested in a MySQL to MySQLi/PDO migration …

[转载] [OpenGL] shadow mapping(实时阴影映射)

参考链接&#xff1a; Java中静态函数的阴影(方法隐藏) 转载原创&#xff1a;ZJU_fish1996 http://blog.csdn.net/zju_fish1996/article/details/51932954 source:原文地址 code:点击可以直接下载源代码 1978年&#xff0c;Lance Williams在其发表的论文《Casting cur…