
暂无个人介绍
能力说明:
深度理解Python的语法与数据类型知识,对运算符、控制语句、列表、元组、字典的应用等具有清晰的认知。理解Flask、Django等Web开发框架的原理、构建方法,掌握利用Python爬虫技术与常用工具进行数据收集的应用能力。
能力说明:
掌握计算机基础知识,初步了解Linux系统特性、安装步骤以及基本命令和操作;具备计算机基础网络知识与数据通信基础知识。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明基础操作1:修改主机名master、node1、node2主机修改hostnamectl set-hostname master && bash hostnamectl set-hostname node1 && bash hostnamectl set-hostname node2 && bash2:设置hostsmaster、node1、node2主机修改echo " 192.168.3.128 master 192.168.3.129 node1 192.168.3.130 node2 " >> /etc/hosts3:配置无密码登陆master、node1、node2主机修改ssh-copy-id root@master ssh-copy-id root@node1 ssh-copy-id root@node24:关闭交换分区master、node1、node2主机修改swapoff -a5:修改内核参数master、node1、node2主机修改modprobe br_netfilter echo "modprobe br_netfilter" >> /etc/profile cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl -p /etc/sysctl.d/k8s.conf6:关闭firewalld和selinuxmaster、node1、node2主机修改systemctl stop firewalld ; systemctl disable firewalld sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config setenforce 07:配置阿里云repomaster、node1、node2主机修改cd /etc/yum.repos.d/ mkdir /root/yum.repo mv * /root/yum.repo/ wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo yum clean all yum makecache8:配置阿里云docker源master、node1、node2主机修改yum -y install yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo9:配置阿里云kubernetes源master、node1、node2主机修改cat > /etc/yum.repos.d/kubernetes.repo <<EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 EOF10:开启ipvsmaster、node1、node2主机修改[root@master ~]# vim /etc/sysconfig/modules/ipvs.modules #!/bin/bash ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack" for kernel_module in ${ipvs_modules}; do /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1 if [ 0 -eq 0 ]; then /sbin/modprobe ${kernel_module} fi done [root@master ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs11:安装基础软件包master、node1、node2主机修改yum -y install epel-release yum install -y yum-utilsdevice-mapper-persistent-data lvm2 wgetnet-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-develcurl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconfautomake zlib-devel python-devel epel-release openssh-server socat ipvsadmconntrack ntpdate telnet ipvsadm12:安装dockermaster、node1、node2主机修改yum install docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io -y systemctl start docker&& systemctl enable docker.service13:配置docker镜像加速器master、node1、node2主机修改sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://vvjfywn5.mirror.aliyuncs.com"],"exec-opts":["native.cgroupdriver=systemd"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker14:安装初始化k8s所需软件包master、node1、node2主机修改yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6 systemctl enable kubelet && systemctl start kubelet systemctl status kubelet\#上面可以看到kubelet状态不是running状态,这个是正常的,不用管,等k8s组件起来这个kubelet就正常了。15:kubeadm初始化k8s集群master、node1、node2主机修改docker pull registry.aliyuncs.com/google_containers/coredns docker pull registry.aliyuncs.com/google_containers/pause docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.20.6 docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.20.6 docker pull calico/cni docker pull calico/pod2daemon-flexvol docker pull calico/kube-controllers docker pull calico/node docker pull registry.aliyuncs.com/google_containers/etcd:3.1.13-0 docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.20.6 docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.20.616:使用kubeadm初始化k8s集群master主机修改kubeadm init --kubernetes-version=1.20.6 --apiserver-advertise-address=192.168.3.128 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification出现如下界面则表示安装成功Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.3.128:6443 --token 1w70yh.ejzxa2rckpu1p25o \ --discovery-token-ca-cert-hash sha256:aaa612678ea7d9a2a902467d13191412d9d66c8462bd57d9c20fb2a24601da1用此命令将node节点加入集群kubeadm join 192.168.3.128:6443 --token 1w70yh.ejzxa2rckpu1p25o \ --discovery-token-ca-cert-hash sha256:aaa612678ea7d9a2a902467d13191412d9d66c8462bd57d9c20fb2a24601da1\#配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理master主机修改[root@master ~]# mkdir -p $HOME/.kube [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady control-plane,master 110s v1.20.617:扩容k8s集群如果刚刚忘记保存加入集群的命令,可以用以下命令来查看master主机修改kubeadm token create --print-join-command将node节点加入集群node1、node2主机修改kubeadm join 192.168.3.128:6443 --token 38jn8o.taun5799cxwq3s5j --discovery-token-ca-cert-hash sha256:aaa612678ea7d9a2a902467d13191412d9d66c8462bd57d9c20fb2a24601da16出现如下界面则执行成功Run 'kubectl get nodes' on the control-plane to see this node join the cluster.在master节点查看是否有node节点master主机修改[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady control-plane,master 8m10s v1.20.6 node1 NotReady <none> 4m38s v1.20.6 node2 NotReady <none> 4m38s v1.20.618:安装网络插件calicomaster主机修改calico地址:https://docs.projectcalico.org/manifests/calico.yaml[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady control-plane,master 8m10s v1.20.6 node1 NotReady <none> 4m38s v1.20.6 node2 NotReady <none> 4m38s v1.20.6查看calico状态,状态全部是running,就说明运行正常了master主机修改[root@master ~]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-56c7cdffc6-ntlfs 1/1 Running 0 4m25s calico-node-jd9ds 1/1 Running 0 4m25s calico-node-k5n4f 1/1 Running 0 4m25s calico-node-q2tm9 1/1 Running 0 4m25s ..........查看node节点,Ready状态就说明是正常的 master主机修改[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready control-plane,master 16m v1.20.6 node1 Ready <none> 13m v1.20.6 node2 Ready <none> 13m v1.20.619:测试部署tomcatnode1、node2主机修改node1、node2节点下载tomcat镜像docker pull tomcat:8.5-jre8-alpinemaster节点[root@master ~]# vim tomcat.yaml apiVersion: v1 #pod属于k8s核心组v1 kind: Pod #创建的是一个Pod资源 metadata: #元数据 name: demo-pod #pod名字 namespace: default #pod所属的名称空间 labels: app: myapp #pod具有的标签 env: dev #pod具有的标签 spec: containers: #定义一个容器,容器是对象列表,下面可以有多个name - name: tomcat-pod-java #容器的名字 ports: - containerPort: 8080 image: tomcat:8.5-jre8-alpine #容器使用的镜像 imagePullPolicy: IfNotPresent [root@master ~]# kubectl apply -f tomcat.yaml pod/demo-pod create [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE demo-pod 1/1 Running 0 20s执行tomcat.yml文件[root@master ~]# vim tomcat-service.yaml apiVersion: v1 kind: Service metadata: name: tomcat spec: type: NodePort ports: - port: 8080 nodePort: 30080 selector: app: myapp env: dev [root@master ~]# kubectl apply -f tomcat-service.yaml service/tomcat created [root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24m tomcat NodePort 10.104.85.10 <none> 8080:30080/TCP 7s在浏览器访问node1IP:30080、node2IP:30080有什么问题可以在下面留言!
介绍 rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。 常用场景一 无密码同步 1、安装rsync [root@localhost /]# yum -y install rsync 2、新建rsyncd.conf文件 vim /etc/rsyncd.conf #This is the rsync daemon configuration #global settings pid file = /var/run/rsyncd.pid port = 873 lock file = /var/run/rsyncd.lock log file = /var/log/rsync.log gid = root uid = root #module settings [share_data] #共享名称 path = /web/rsync/share_data #共享路径 use chroot = no max connections = 15 read only = yes write only = no list = no ignore errors = yes timeout = 120 保存 3、执行命令 /usr/bin/rsync --daemon mkdir -p /web/rsync/share_data #新建共享目录,实例中直接输入要共享文件的就好,可省去次步 客户端 1、安装rsync [root@localhost /]# yum -y install rsync 2、输入命令进行同步 rsync -avz --progress root@192.168.1.98::share_data /home/hadoop/share_data ↓ ↓ ↓ 服务器IP 配置文件共享目录名 客户端收纳目录 3、限制流量同步 限制流量同步: rsync -avz --bwlimit=50 --progress root@192.168.1.98::share_data /home/hadoop/share_data 常用场景二 有密码同步 服务端配置 1、配置文件修改 vim /etc/rsyncd.conf #This is the rsync daemon configuration #global settings pid file = /var/run/rsyncd.pid port = 873 lock file = /var/run/rsyncd.lock log file = /var/log/rsync.log gid = root uid = root #module settings [auth_data] path = /web/rsync/auth_data use chroot = no max connections = 15 read only = yes write only = no list = no ignore errors = yes timeout = 120 auth users = hadoop secrets file = /etc/rsyncd.passwd 3、执行命令 echo "hadoop:password123" > /etc/rsyncd.passwd chmod 600 /etc/rsyncd.passwd mkdir -p /web/rsync/auth_data 客户端配置 1、保存密码 echo "password123" > /home/hadoop/rsyncd.passwd chmod 600 /home/hadoop/rsyncd.passwd 2、远程同步 rsync -avz --progress --password-file=/home/hadoop/rsyncd.passwd hadoop@192.168.1.98::auth_data /home/hadoop/auth_data 或者是: export RSYNC_PASSWORD="password123" rsync -avz --progress hadoop@192.168.1.98::auth_data /home/hadoop/auth_data 常用场景三 写入同步 服务端 1、配置文件 vim /etc/rsyncd.conf #global settings pid file = /var/run/rsyncd.pid port = 873 lock file = /var/run/rsyncd.lock log file = /var/log/rsync.log gid = root uid = root #module settings [write_data] path = /web/rsync/write_data use chroot = no max connections = 15 read only = no list = no ignore errors = yes timeout = 120 auth users = hadoop secrets file = /etc/rsyncd.passwd 保存 2、执行命令 mkdir -p /web/rsync/write_data 客户端 1、输入同步命令 echo "123" > /home/hadoop/write_file export RSYNC_PASSWORD="password123" rsync -avz --progress --delete /home/hadoop/write_file hadoop@192.168.1.98::write_data 常用场景四 限定IP或网段 服务端 1、配置文件修改 #global settings pid file = /var/run/rsyncd.pid port = 873 lock file = /var/run/rsyncd.lock log file = /var/log/rsync.log gid = root uid = root #module settings [write_data] path = /web/rsync/write_data use chroot = no max connections = 15 read only = no list = no ignore errors = yes timeout = 120 auth users = hadoop secrets file = /etc/rsyncd.passwd hosts allow = 192.168.2.32 192.168.1.0/24 常见情景例子 指定端口 rsync -avz --port=8081 --progress /home/hadoop/auth_data hadoop@192.168.1.98::auth_data 限速 rsync --bwlimit=100 -avz --progress /home/hadoop/auth_data hadoop@192.168.1.98::auth_data 限速100kb/s同步数据 Rsync通过SSH传输 rsync -e "ssh -p 22" --progress /home/hadoop/auth_data hadoop@192.168.1.98::auth_data 本文参考:ggjucheng 更多命令参考 客户端 https://download.samba.org/pub/rsync/rsync.html 服务端 https://download.samba.org/pub/rsync/rsyncd.conf.html
之前讲解了如何配置Zabbix 服务端和客户端,现在我们来讲解下如何在zabbix监控端添加主机 Zabbix服务端:Centos 配置 Zabbix服务端 Zabbix客户端:Centos 配置 Zabbix客户端 1、登陆zabbix服务器,首先修改下中文界面,因为安装好之后的zabbix是英文界面 2、Language选择Chinese(Zh_CN),点击update 3、找到组态-->主机-->新建主机 4、输入主机名称,选择所属群组,输入监控端IP地址,点击添加 5、找到添加的主机,选择我们需要监控主机的模版 找到模版- 连接新模板-选择-勾选上需要添加的模版,先点击上面连接新模板的添加,再点击下面的添加
如需搭建zabbix server端,请参考:Zabbix-Server配置 环境: Zabbix-Server: Centos 6.8 IP:192.168.126.129 #Zabix-Server地址(此篇文章可不必在意) Zabbix-Agent: Centos 6.8 IP:192.168.126.136 1、安装源码 [root@localhost ~]# rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm Retrieving http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm warning: /var/tmp/rpm-tmp.KgKscI: Header V4 DSA/SHA1 Signature, key ID 79ea5ed4: NOKEY Preparing... ################################# [100%] Updating / installing... 1:zabbix-release-2.4-1.el6 ################################# [100%] 2、安装zabbix客户端 [root@localhost ~]# yum install zabbix-agent -y Loaded plugins: langpacks base | 3.6 kB 00:00:00 docker-main-repo | 2.9 kB 00:00:00 elrepo …………………………………………………………………………………… Installed: zabbix-agent.x86_64 0:2.4.8-1.el6 Dependency Installed: zabbix.x86_64 0:2.4.8-1.el6 Complete! 3、zabbix配置文件 [root@localhost ~]# cd /etc/zabbix/ [root@localhost zabbix]# ls zabbix_agentd.conf zabbix_agentd.d [root@localhost zabbix]# vi zabbix_agentd.conf Server=zbbix server ip ServerActive= zbbix server ip Hostname=本机ip 4、重启服务 [root@localhost zabbix]# service zabbix-agent start Starting zabbix-agent (via systemctl): [ OK ] [root@localhost zabbix]#chkconfig zabbix-agent on
zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 zabbix由2部分构成,zabbix server与可选组件zabbix agent。 zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD,OS X等平台上。 zabbix agent需要安装在被监视的目标服务器上,它主要完成对硬件信息或与操作系统有关的内存,CPU等信息的收集。zabbix agent可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD, OS X, Tru64/OSF1, Windows NT4.0, Windows (2000/2003/XP/Vista)等系统之上。 zabbix server可以单独监视远程服务器的服务状态;同时也可以与zabbix agent配合,可以轮询zabbix agent主动接收监视数据(agent方式),同时还可被动接收zabbix agent发送的数据(trapping方式)。另外zabbix server还支持SNMP (v1,v2),可以与SNMP软件(例如:net-snmp)等配合使用。 环境: Zabbix-Server: Centos 6.8 IP:192.168.126.129 Zabbix-Agent: Centos 6.8 IP:192.168.126.136 1、查看系统 [root@localhost ~]# uname -a Linux localhost 2.6.32-642.6.2.el6.x86_64 2、安装源码 [root@localhost ~]# rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm Retrieving http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm warning: /var/tmp/rpm-tmp.abr6zK: Header V4 DSA/SHA1 Signature, key ID 79ea5ed4: NOKEY Preparing... ########################################### [100%] 1:zabbix-release ########################################### [100%] 3、安装组件 [root@localhost ~]# yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent mysql-server mysql -y Loaded plugins: fastestmirror Setting up Install Process Repository base is listed more than once in the configuration Repository updates is listed more than once in the configuration Repository extras is listed more than once in the configuration Repository epel is listed more than once in the configuration Determining fastest mirrors * base: mirrors.cloud.aliyuncs.com ………………………………………………………………………………. Installed: mysql.x86_64 0:5.1.73-8.el6_8 mysql-server.x86_64 0:5.1.73-8.el6_8 zabbix-agent.x86_64 0:2.4.8-1.el6 zabbix-server-mysql.x86_64 0:2.4.8-1.el6 zabbix-web-mysql.noarch 0:2.4.8-1.el6 Dependency Installed: OpenIPMI-libs.x86_64 0:2.0.16-14.el6 apr.x86_64 0:1.3.9-5.el6_2 apr-util.x86_64 0:1.3.9-3.el6_0.1 apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 dejavu-fonts-common.noarch 0:2.33-1.el6 dejavu-sans-fonts.noarch 0:2.33-1.el6 fontpackages-filesystem.noarch 0:1.41-1.1.el6 fping.x86_64 0:2.4b2-16.el6 freetype.x86_64 0:2.3.11-17.el6 gnutls.x86_64 0:2.12.23-21.el6 httpd.x86_64 0:2.2.15-60.el6.centos.6 httpd-tools.x86_64 0:2.2.15-60.el6.centos.6 iksemel.x86_64 0:1.4-2.el6 libX11.x86_64 0:1.6.4-3.el6 libX11-common.noarch 0:1.6.4-3.el6 libXau.x86_64 0:1.0.6-4.el6 libXpm.x86_64 0:3.5.10-2.el6 libjpeg-turbo.x86_64 0:1.2.1-3.el6_5 libpng.x86_64 2:1.2.49-2.el6_7 libtool-ltdl.x86_64 0:2.2.6-15.5.el6 libxcb.x86_64 0:1.12-4.el6 libxslt.x86_64 0:1.1.26-2.el6_3.1 lm_sensors-libs.x86_64 0:3.1.1-17.el6 mailcap.noarch 0:2.1.31-2.el6 net-snmp.x86_64 1:5.5-60.el6 net-snmp-libs.x86_64 1:5.5-60.el6 perl-DBD-MySQL.x86_64 0:4.013-3.el6 perl-DBI.x86_64 0:1.609-4.el6 php.x86_64 0:5.3.3-49.el6 php-bcmath.x86_64 0:5.3.3-49.el6 php-cli.x86_64 0:5.3.3-49.el6 php-common.x86_64 0:5.3.3-49.el6 php-gd.x86_64 0:5.3.3-49.el6 php-mbstring.x86_64 0:5.3.3-49.el6 php-mysql.x86_64 0:5.3.3-49.el6 php-pdo.x86_64 0:5.3.3-49.el6 php-xml.x86_64 0:5.3.3-49.el6 unixODBC.x86_64 0:2.2.14-14.el6 zabbix.x86_64 0:2.4.8-1.el6 zabbix-server.x86_64 0:2.4.8-1.el6 zabbix-web.noarch 0:2.4.8-1.el6 Dependency Updated: mysql-libs.x86_64 0:5.1.73-8.el6_8 Complete! 4、启动Mysql服务 [root@localhost ~]# service mysqld start Initializing MySQL database: WARNING: The host 'localhost' could not be looked up with resolveip. ................................................. Please report any problems with the /usr/bin/mysqlbug script! [ OK ] Starting mysqld: [ OK ] 5、Mysql设置 [root@localhost ~]# chkconfig mysqld on [root@localhost ~]# mysql_secure_installation #根据提示进行操作 主要内容如下 Set root password? [Y/n] //设置root密码(最好自己设置密码,选Y) anonymous users? [Y/n] //删除匿名用户(选Y) Disallow root login remotely? [Y/n] //禁止root用户远程登录(选n) Remove test database and access to it? [Y/n] //删除默认的 test 数据库(选Y) Reload privilege tables now? [Y/n] //是否马上应用最新的设置(选Y) 6、Zabbix数据库设置 [root@localhost /]# mysql -u root -p Enter password: #输入刚刚设置的密码 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1143 Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create database zabbix character set utf8; Query OK, 1 row affected (0.00 sec) mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> exit Bye 7、导入数据库 [root@localhost /]# cd /usr/share/doc/zabbix-server-mysql-2.4.8/create/ [root@localhost create]# ls data.sql images.sql schema.sql [root@localhost create]# mysql -u root -p zabbix < schema.sql Enter password: #输入数据库root密码 [root@localhost create]# mysql -u root -p zabbix < images.sql Enter password: #输入数据库root密码 [root@localhost create]# mysql -u root -p zabbix < data.sql Enter password: #输入数据库root密码 #如果出错,注意导入顺序 8、修改Zabbix配置文件 [root@localhost /]# vim /etc/zabbix/zabbix_server.conf #注意一下配置文件中是否和以下内容相似,如不相似请参照如下进行修改 DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=zabbix 9、PHP配置文件修改 [root@localhost ~]# cp /etc/php.ini /etc/php.ini.bak [root@localhost ~]# sed -i 's/^.*date.timezone =.*$/date.timezone = Asia\/Shanghai/g' /etc/php.ini [root@localhost ~]# sed -i 's/^.*post_max_size =.*$/post_max_size = 16M/g' /etc/php.ini [root@localhost ~]# sed -i 's/^.*max_execution_time =.*$/max_execution_time = 300/g' /etc/php.ini [root@localhost ~]# sed -i 's/^.*max_input_time =.*$/max_input_time = 300/g' /etc/php.ini 10、启动服务 [root@localhost ~]# service zabbix-server start Starting Zabbix server: [ OK ] [root@localhost ~]# service zabbix-agent start Starting Zabbix agent: [ OK ] [root@localhost ~]# service httpd restart Stopping httpd: [ OK ] 11、添加开机启动 [root@localhost ~]# chkconfig mysqld on [root@localhost ~]# chkconfig zabbix-server on [root@localhost ~]# chkconfig zabbix-agent on [root@localhost ~]# chkconfig httpd on 12、访问zabbix http://192.168.126.129/zabbix Next-下一步 Next-下一步 注意User、Password,输入完成之后点击 Test connection看状态是否Ok,Next-下一步 Name名字可以写成:zabbix129(后跟IP地址的尾部),没有限制,Next-下一步 登录zabbix(Admin/zabbix 注意Admin第一个字母大写) 登陆成功,搭建完成! 如需配置Zabbix-Agent客户端,可以参考:Zabbix-Agent客户端配置
Keepalived keepalived是一个类似于layer3, 4 & 7交换机制的软件,也就是我们平时说的第3层、第4层和第7层交换。Keepalived是自动完成,不需人工干涉。 简介: Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。 作用: 主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。 高可用web架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选 可不选) 环境: Keepalived-Master:Centos6.8 192.168.126.129 Keepalived-Slave: Centos6.8 192.168.126.136 Web-Server:Centos6.8 192.168.126.135 Web-Server:Centos6.8 192.168.126.134 事先已经搭建好Lvs,如果是全新环境,请参考:配置Lvs 1、安装编译环境、关闭防火墙 [root@localhost /]# service iptables stop [root@localhost /]#yum -y install openssl-devel kernel-devel make gcc openssl-devel libnl* popt* 2、下载安装包 [root@localhost /]#wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz [root@localhost /]#http://mirror.centos.org/centos/6/os/x86_64/Packages/popt-static-1.13-7.el6.x86_64.rpm[root@localhost /]#yum -y install popt-static-1.13-7.el6.x86_64.rpm 3、解压安装Keepalived [root@localhost /]#ln -s /usr/src/kernels/2.6.32-220.13.1.el6.x86_64/ /usr/src/linux #设置软连接 [root@localhost /]#tar zxvf keepalived-1.2.7.tar.gz [root@localhost /]#cd keepalived-1.2.7 [root@localhost keepalived-1.2.7]# ./configure --with-kernel-dir=/usr/src/kernels/2.6.32-358.2.1.el6.x86_64/ 执行完上条命令,看是否和下图红色框中一致 继续执行 4、编译 [root@localhost keepalived-1.2.7]# make && make install [root@localhost keepalived-1.2.7]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ [root@localhost keepalived-1.2.7]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ [root@localhost keepalived-1.2.7]# mkdir /etc/keepalived [root@localhost keepalived-1.2.7]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ [root@localhost keepalived-1.2.7]# cp /usr/local/sbin/keepalived /usr/sbin/ 5、The First:打开IP Forward功能,如不打开此功能下面的配置都无济于事 [root@localhost keepalived-1.2.7]# vim /etc/sysctl.conf # Kernel sysctl configuration file for Red Hat Linux # # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and # sysctl.conf(5) for more details. # # Use '/sbin/sysctl -a' to list all possible parameters. # Controls IP packet forwarding net.ipv4.ip_forward = 1 #此处原本是0,一定要修改为1,一定要为1. [root@localhost keepalived-1.2.7]# sysctl -p #使配置立即生效 以上配置,需要在Master和Slave进行配置,以下配置请看清楚Master和Slave服务器 Master服务器进行Keepalived配置 - Keepalived-Master 1、修改Keepalived配置 [root@localhost keepalived-1.2.7]# vim /etc/keepalived/keepalived.conf 具体的参数详情请参考:http://zhumeng8337797.blog.163.com/blog/static/100768914201191762253640/ 下面是我配置好的文件内容 (可以删除原先的配置,把下面的配置进行修改然后粘贴进去,邮箱我这边没有配置,如果你有需求可以进行配置) global_defs { notification_email { willam@cn.accommate.com #设置报警邮件单个或多个地址 } notification_email_from server@laiwojia.la #邮件的发送地址 smtp_server 192.168.138.10 #smtp 地址 smtp_connect_timeout 30 #连接smtp服务器超时的实际 router_id LVS_MASTER #路由ID两台机器不能相同。LVS2更改为不同 } #vrrp 实例定义部分 vrrp_instance VI_1 { state MASTER #keepalived 的角色 MASTER 表示主服务器。LVS2更改为:BACKUP interface eth0 #指定监测网卡 virtual_router_id 51 #虚拟路由标示,相同实例,需相同标示。 priority 150 #优先级 数字越大 优先级越高 MASTER的优先级高于BACKUP优先级(如master 150,backup 100) advert_int 1 #设定主备之间检查时间 单位s authentication { #设定验证类型和密码 auth_type PASS auth_pass 1111 } virtual_ipaddress { #设定虚拟IP地址 可以设置多个 每行一个 192.168.126.100 } } #虚拟服务器部分 virtual_server 192.168.126.100 80 { delay_loop 6 #设定运行情况检查时间 单位s lb_algo rr #负载调度算法 rr即轮叫算法 lb_kind DR #设置LVS负载机制 NAT TUN DR 三种模式可选 persistence_timeout 0 #会话时间 #会话保持在某个服务节点 #用户在动态页面50s内没有任何动作,那么后面就会被分发到其他节点 #用户一直动作,不受50s限制 protocol TCP #使用协议 #以下为real_server部分 real_server 192.168.126.135 80 { weight 1 #服务节点权值,数字越大,权值越高 #权值的大小可以为不同性能的服务器分配不同的负载 #这样才能有效合理的利用服务器资源 TCP_CHECK { #状态检查部分 connect_timeout 3 #3s无响应超时 nb_get_retry 3 #重试次数 delay_before_retry 3 #重试间隔 connect_port 80 #连接端口 } } real_server 192.168.126.134 80 { weight 1 #服务节点权值,数字越大,权值越高 #权值的大小可以为不同性能的服务器分配不同的负载 #这样才能有效合理的利用服务器资源 TCP_CHECK { #状态检查部分 connect_timeout 3 #3s无响应超时 nb_get_retry 3 #重试次数 delay_before_retry 3 #重试间隔 connect_port 80 #连接端口 } } } 2、重启服务 [root@localhost keepalived-1.2.7]# chkconfig keepalived on [root@localhost keepalived-1.2.7]# service keepalived start 3、查看进程 [root@localhost keepalived-1.2.7]# ps aux | grep keepalived 结果如下 Keepalived正常运行时,共启动3个进程,其中一个进程是父进程,负责监控其子进程;一个是vrrp子进程;另外一个是checkers子进程。 如果此时只看到2个进程,请从安装keepalived的步骤重新执行。 root 5082 0.0 0.1 42172 1008 ? Ss 07:02 0:00 keepalived -D #进程1 root 5084 0.1 0.2 44400 2312 ? S 07:02 0:00 keepalived -D #进程2 root 5085 0.2 0.1 44276 1640 ? S 07:02 0:00 keepalived -D #进程3 root 5087 0.0 0.0 103324 892 pts/2 S+ 07:03 0:00 grep keepalived 4、查看虚拟IP(重要) [root@localhost keepalived-1.2.7]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:27:22:3f brd ff:ff:ff:ff:ff:ff inet 192.168.126.129/24 brd 192.168.126.255 scope global eth0 inet 192.168.126.100/32 brd 192.168.126.100 scope global eth0:0 #如果看到此条信息,说明虚拟IP已经自动配置上了 inet6 fe80::20c:29ff:fe27:223f/64 scope link valid_lft forever preferred_lft forever 还有3个命令在先列示下,并不用执行 显示集群中服务器ip信息:ipvsadm -ln 查看日志:tail -f /var/log/messages 查看请求转发情况:ipvsadm -lcn | grep 虚拟IP 至此,Keepalived_MASTER服务器已经配置好并启动了 ------------------------------------------------------------------------------------------------ Slave服务器进行Keepalived配置 - Keepalived-Slave 1、修改Keepalived配置文件 [root@localhost keepalived-1.2.7]# vim /etc/keepalived/keepalived.conf (注:相比keepalived-master,只有三处不同global_defs中的router_id、vrrp_instance中的state、priority (注意keepAlived的配置文件中有一个网卡设备,虚拟机的网卡设备可能是不一样的,有的是eth0,有的是eth1,所以也是要改动的,否则从服务器的服务器很有可能服务不正常) ) ! Configuration File for keepalived global_defs { notification_email { willam@cn.accommate.com } notification_email_from admin@test.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_BACKUP #BACKUP } vrrp_instance VI_1 { state BACKUP #BACKUP interface eth1 virtual_router_id 51 #此数值两边保持一致 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.126.100 } } virtual_server 192.168.126.100 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.126.135 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.126.134 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } 2、重启服务 [root@localhost keepalived-1.2.7]# chkconfig keepalived on [root@localhost keepalived-1.2.7]# service keepalived start 测试LVS层 1、执行ip a主服务器 LVS_Master中的IP信息 LVS_Backup中的IP信息 现在停掉LVS_Master的Keepalived服务,看看LVS_Backup中是否可以自动家长虚拟IP地址,并且转发请求 LVS_Master LVS_Backup: 切换成功,访问网页:http://192.168.126.100 看看是否能正常显示 测试WEB服务器,断掉web2访问网页 断掉web1开启web2访问网页 经过不断的测试,终于完成了,望大家能够指正。还有一点就是很多时候都是配置文件中的一些小毛病造成的,比如: 1、keepAlived中的通知邮箱好像必须要写,否则不正确; 2、keepAlived中的网卡设备要注意,按照服务器的实际情况填写; 3、使用时,必要的端口要打开,或者关掉防火墙。否则有事不提供服务; 4、一些命令行的执行,少一些参数执行就可能会有一些问题。 . 我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。 宗旨: 使用集群技术和Linux操作系统实现一个高性能、高可用的服务器. 很好的可伸缩性(Scalability) 很好的可靠性(Reliability) 很好的可管理性(Manageability)。 特点: 可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。 优点: 1、开源,免费 2、在网上能找到一些相关技术资源 3、具有软件负载均衡的一些优点 缺点: 1、最核心的就是没有可靠的支持服务,没有人对其结果负责; 2、功能比较简单,支持复杂应用的负载均衡能力较差,如算法较少等; 3、开启隧道方式需重编译内核; 4、配置复杂; 5、主要应用于LINUX,目前没有专门用于WINDOWS的版本,不过可以通过配置,使windows成为LVS集群中的real server(win2003、win2008中)。 环境: Web-Server:Centos6.8 192.168.126.135 Web-Server:Centos6.8 192.168.126.134 在Web服务器上搭建web: 1、安装web系统,在centOS上可以使用命令yum install进行安装,-y 表示安装过程中全部选择yes,我这里做测试环境,所以简单安装 yum -y install httpd 2、设置httpd、mysqld为开机启动服务 chkconfig httpd on 3、启动服务、关闭防火墙 service httpd startservice iptables stop #为了测试方便,直接关闭防火墙 4、安装虚拟IP管理工具:ipvsadm yum -y install ipvsadm 5、新建脚本: #!/bin/bash VIP=192.168.126.100 #假设126.100是VIP RIP1=192.168.126.135 #web-1 RIP2=192.168.126.134 #web-2 case "$1" in start) echo "开始配置LVS Director Server" ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up route add -host $VIP dev eth0:0 echo "1">/proc/sys/net/ipv4/ip_forward ipvsadm -C ipvsadm -A -t $VIP:80 -s rr ipvsadm -a -t $VIP:80 -r $RIP1:80 -g ipvsadm -a -t $VIP:80 -r $RIP2:80 -g ipvsadm echo "配置成功" ;; stop) echo "正在关闭LVS Director Server" echo "0">/proc/sys/net/ipv4/ip_forward ipvsadm -C ifconfig eth0:0 down echo "关闭成功!" ;; *) echo "用法:$0 {start|stop}" exit 1 esac 6、赋予脚本权限并运行脚本 [root@localhost /]# sh lvs.sh start 开始配置LVS Director Server IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.126.100:http rr #虚拟IP -> 192.168.126.134:http Route 1 0 0 #WEB-1 -> 192.168.126.135:http Route 1 0 0 #WEB-2 配置成功 在另一台 Web服务器上搭建web: 1、安装web系统,在centOS上可以使用命令yum install进行安装,-y 表示安装过程中全部选择yes,我这里做测试环境,所以简单安装 yum -y install httpd 2、设置httpd、mysqld为开机启动服务 chkconfig httpd on 3、启动服务、关闭防火墙 service httpd startservice iptables stop #为了测试方便,直接关闭防火墙 4、安装虚拟IP管理工具:ipvsadm yum -y install ipvsadm 5、新建脚本: [root@localhost /]# vim lvs.sh #!/bin/bash VIP=192.168.126.100 #VIP case "$1" in start) echo "配置lvs Real Server开始..." ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up route add -host $VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce ;; stop) echo "正在关闭lvs Real server" ifconfig lo:0 down echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "用法:$0 {start|stop}" exit 1 esac [root@localhost /]# sh lvs.sh start 配置lvs Real Server开始... 配置完成! 打开浏览器访问VIP地址:http://192.168.126.100 持续刷新网页看会不会出现访问到两个web服务器地址的页面 如果你需要进一步配置LVS+Keepalived,可以参考:LVS+keepalived配置
首先确保本机已经安装上Git,其次确认可以正常访问Gitlab服务器 环境: Git:Centos 7.x 192.168.126.138 Gitlab: Centos7.x 192.168.126.137 1:填写Gitlabn仓库信息 登陆到Gitlab服务器地址,新建仓库 创建成功后会自动跳转至该仓库的页面: 上面红色框内,是仓库地址,我们尝试把仓库克隆到本地仓库: [root@localhost 123]#git clone http://192.168.126.137/root/Accommate.git #192.168.126.137是指Gitlab服务器地址,可以修改成域名,看自己爱好 Cloning into 'Accommate'... Username for 'http://192.168.126.137': root #Gitlab 账号 Password for 'http://root@192.168.126.137': #Gitlab 密码 warning: You appear to have cloned an empty repository. 将该Gitlab版本仓库添加到本机的远程列表中: [root@localhost Accommate]# git remote add Accommate git@192.168.126.137:root/Accommate.git[root@localhost Accommate]# git remoteAccommategoodboysorigin 编写一个新文件: [root@localhost /]# cd Accommate/ [root@localhost Accommate]# echo "This is Test txt - Accommate" > accommate 将该文件提交到本地的Git版本仓库: [root@localhost Accommate]# git add accommate [root@localhost Accommate]# git commit -m "add accommate" [master (root-commit) 743413d] add accommate 1 file changed, 1 insertion(+) create mode 100644 accommate 然后将本地的Git仓库同步到远程Git服务器上(第一次请加上参数-u,代表关联本地与远程): [root@localhost Accommate]# git push -u origin master Username for 'http://192.168.126.137': root #Gitlab 账号 Password for 'http://root@192.168.126.137': #Gitlab 密码 Counting objects: 3, done. Writing objects: 100% (3/3), 238 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To http://192.168.126.137/root/Accommate.git #上传的仓库 * [new branch] master -> master Branch master set up to track remote branch master from origin. 查看下Web端的Accommate: (上传文件前) (上传文件后)刷新下web页面: 查看下是不是我们之前写的内容: 注:如果上传至Github,需要定义SSH-Key
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。 1. 安装并配置必要的依赖关系 如果你想使用 Postfix 发送邮件,请在安装过程中根据提示选择 'Internet Site'。 你也可以用 Sendmail 或者 配置一个自定义的 SMTP 服务 并 把它作为一个 SMTP 服务器。 在 CentOS 系统上,下面的命令将会打开系统防火墙 HTTP 和 SSH 的访问。 sudo yum -y install curl policycoreutils openssh-server openssh-clientssudo systemctl enable sshdsudo systemctl start sshdsudo yum -y install postfixsudo systemctl enable postfixsudo systemctl start postfix sudo firewall-cmd --permanent --add-service=http sudo systemctl reload firewalld 2. 添加 GitLab 镜像源并安装 curl -sS http://packages.gitlab.com.cn/install/gitlab-ce/script.rpm.sh | sudo bash sudo yum install gitlab-ce 如果你不太习惯使用命令管道的方式安装镜像仓库,你可以在这里找到 完整的安装脚本 或者 选择系统对应的安装包 使用下面的命令手动安装。 curl -LJO https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-XXX.rpm rpm -i gitlab-ce-XXX.rpm 3. 配置并启动 GitLab sudo gitlab-ctl reconfigure 4. 通过浏览器访问上一步配置的域名 第一次访问 GitLab,系统会重定向 url 到重置密码的页面,你需要输入初始化管理员账号的密码。 设置完成后,系统会重定向到登录界面,你就可以使用刚才输入的密码登录系统了。 系统默认的管理员账号为 root, 登录系统后,你可以修改管理员账号为自己喜欢的账号。 如需修改访问地址以及端口, vim /etc/gitlab/gitlab.rb -- external_url 'http://localhost:90' 文章来源:GITLAB
GIT(分布式版本控制系统) Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 很多 Freedesktop 的项目迁移到了 Git 上。 分布式版本控制系统最大的特点是不需要每次提交都把文件推送到版本控制服务器,而是采用分布式版本库的机制,使得每个开发人员都够从服务器中克隆一份完整的版本库到自己计算机本地,不必再完全依赖于版本控制服务器,使得源代码的发布和合并更加方便,并且因为数据都在自己本地,不仅效率提高了,而且即便我们离开了网络依然可以执行提交文件、查看历史版本记录、创建分支等等操作,真的是开发者的福音啊。 Git不仅是一款开源的分布式版本控制系统,而且有其独特的功能特性,例如大多数的分布式版本控制系统只会记录每次文件的变化,说白了就是只会关心文件的内容变化差异,而Git则是关注于文件数据整体的变化,直接会将文件提交时的数据保存成快照,而非仅记录差异内容,并且使用SHA-1加密算法保证数据的完整性。 使用Git服务程序 在正式使用前,我们还需要弄清楚Git的三种重要模式,分别是已提交、已修改和已暂存: 已提交(committed):表示数据文件已经顺利提交到Git数据库中。 已修改(modified):表示数据文件已经被修改,但未被保存到Git数据库中。 已暂存(staged):表示数据文件已经被修改,并会在下次提交时提交到Git数据库中。 提交前的数据文件可能会被随意修改或丢失,但只要把文件快照顺利提交到Git数据库中,那就可以完全放心了,流程为: 1.在工作目录中修改数据文件。 2.将文件的快照放入暂存区域。 3.将暂存区域的文件快照提交到Git仓库中。 部署Git服务器 主机名称 操作系统 IP地址 GIT服务器 Centos 7 192.168.126.137 GIT客户端 Centos 7 192.168.126.138 首先我们在Git服务器和客户端上安装Git服务程序 [root@accommate ~]# yum install -y git Loaded plugins: langpacks, product-id, subscription-manager ………………省略部分安装过程……………… Installing: git x86_64 1.8.3.1-4.el7 rhel7 4.3 M Installing for dependencies: perl-Error noarch 1:0.17020-2.el7 rhel7 32 k perl-Git noarch 1.8.3.1-4.el7 rhel7 52 k perl-TermReadKey x86_64 2.30-20.el7 rhel7 31 k ………………省略部分安装过程……………… Complete!然后创建Git版本仓库,一般规范的方式要以.git为后缀: [root@accommate ~]# mkdir accommate.git 修改Git版本仓库的所有者与所有组: [root@accommate ~]# chown -Rf git:git accommate.git/ 初始化Git版本仓库: [root@accommate ~]# cd accommate.git/ [root@accommate accommate.git]# git --bare init Initialized empty Git repository in /root/accommate.git/ 其实此时你的Git服务器就已经部署好了,但用户还不能向你推送数据,也不能克隆你的Git版本仓库,因为我们要在服务器上开放至少一种支持Git的协议,比如HTTP/HTTPS/SSH等,现在用的最多的就是HTTPS和SSH,我们切换至Git客户机来生成SSH密钥: [root@localhost /]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: b0:74:b6:97:98:ad:a3:f0:24:a8:b6:f4:e5:d8:31:73 root@localhost.localdomain The key's randomart image is: +--[ RSA 2048]----+ | | | | | o o | | . = = . | | . S + | | . o | | .. o=.Eo | |.o. ===. . | |o..o oo | +-----------------+ 将客户机的公钥传递给Git服务器: [root@localhost /]# ssh-copy-id 192.168.126.137 The authenticity of host '192.168.126.137 (192.168.126.137)' can't be established. ECDSA key fingerprint is 0a:89:0f:71:fb:0e:75:f7:37:9b:50:37:56:b7:95:25. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.126.137's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '192.168.126.137'" and check to make sure that only the key(s) you wanted were added. 此时就已经可以从Git服务器中克隆版本仓库了(此时目录内没有文件是正常的): [root@localhost /]# git clone root@192.168.126.137:/accommate.git Cloning into 'accommate'... warning: You appear to have cloned an empty repository. 向Git版本仓库提交一个新文件: [root@localhost accommate]# echo "I successfully cloned the Git repository" > readme.txt [root@localhost accommate]# git add readme.txt [root@localhost accommate]# git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: readme.txt # [root@localhost accommate]# git commit -m "Clone the Git repository" [master (root-commit) 1709f48] Clone the Git repository 1 file changed, 1 insertion(+) create mode 100644 readme.txt [root@localhost accommate]# git status # On branch master nothing to commit, working directory clean 但是这次的操作还是只将文件提交到了本地的Git版本仓库,并没有推送到远程Git服务器,所以我们来定义下远程的Git服务器吧: [root@localhost accommate]# git remote add server root@192.168.126.137:/accommate.git 将文件提交到远程Git服务器吧: [root@localhost accommate]# git push -u server master Counting objects: 3, done. Writing objects: 100% (3/3), 272 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To root@192.168.126.137:/accommate.git * [new branch] master -> master Branch master set up to track remote branch master from server. 为了验证真的是推送到了远程的Git服务,你可以换个目录再克隆一份版本仓库(虽然在工作中毫无意义): [root@localhost accommate]# cd ../Desktop [root@localhost accommate Desktop]# git clone root@192.168.10.10:/root/accommate.git Cloning into 'accommate'... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Receiving objects: 100% (3/3), done. [root@linuxprobe Desktop]# cd accommate/ [root@linuxprobe linuxprobe]# cat readme.txt I successfully cloned the Git repository
SVN SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。 安装说明 1:操作系统:Centos-6.8 2:安装方法:yum 3:安装软件:SVN 检查自己是否已安装SVN [root@localhost]# rpm -qa subversion #如果有已安装版本,进行卸载旧版本 [root@localhost]# yum remove subversion 安装SVN [root@localhost]# yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql 确认已安装了svn模块 [root@localhost /]# cd /etc/httpd/modules [root@localhost modules]# ls | grep svn mod_authz_svn.so mod_dav_svn.so 验证安装 检验已经安装的SVN版本信息 [root@localhost modules]# svnserve --version svnserve,版本 1.6.11 (r934486) 编译于 Aug 17 2015,08:37:43 版权所有 (C) 2000-2009 CollabNet。 Subversion 是开放源代码软件,请参阅 http://subversion.tigris.org/ 站点。 此产品包含由 CollabNet(http://www.Collab.Net/) 开发的软件。 下列版本库后端(FS) 模块可用: * fs_base : 模块只能操作BDB版本库。 * fs_fs : 模块与文本文件(FSFS)版本库一起工作。 Cyrus SASL 认证可用。 代码库创建 SVN软件安装完成后还需要建立SVN库 [root@localhost modules]# mkdir -p /opt/svn/repositories [root@localhost modules]# svnadmin create /opt/svn/repositories 执行上面的命令后,自动建立repositories库,查看/opt/svn/repositories 文件夹发现包含了conf, db,format,hooks, locks, README.txt等文件,说明一个SVN库已经建立。 配置代码库 进入上面生成的文件夹conf下,进行配置 [root@localhost modules]# cd /opt/svn/repositories/conf 用户密码passwd配置 [root@localhost password]# cd /opt/svn/repositories/conf [root@admin conf]# vi + passwd 修改passwd为以下内容: [users] # harry = harryssecret # sally = sallyssecret willam=123456 权限控制authz配置 [root@admin conf]# vi + authz 目的是设置哪些用户可以访问哪些目录,向authz文件追加以下内容: #设置[/]代表根目录下所有的资源 [/] willam=rw 服务svnserve.conf配置 [root@admin conf]# vi + svnserve.conf 追加以下内容: [general] #匿名访问的权限,可以是read,write,none,默认为read anon-access=none #使授权用户有写权限 auth-access=write #密码数据库的路径 password-db=passwd #访问控制文件 authz-db=authz #认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字 realm=/opt/svn/repositories 配置防火墙端口 [root@localhost conf]# vi /etc/sysconfig/iptables 添加以下内容: -A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT 保存后重启防火墙 [root@localhost conf]# service iptables restart 启动SVN svnserve -d -r /opt/svn/repositories 查看SVN进程 [root@localhost conf]# ps -ef|grep svn|grep -v grep root 12538 1 0 14:40 ? 00:00:00 svnserve -d -r /opt/svn/repositories 检测SVN 端口 [root@localhost conf]# netstat -ln |grep 3690 tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 停止重启SVN [root@localhost password]# killall svnserve //停止 [root@localhost password]# svnserve -d -r /opt/svn/repositories // 启动 测试 SVN服务已经启动,使用客户端测试连接。 客户端连接地址:svn co svn://192.168.126.129 用户名/密码: willam/123456 如果想创建多个版本库 mkdir -p /opt/svn/repositories/svn2 ##创建目录 svnadmin create /opt/svn/repositories/svn2 重复步骤4的配置方法 killall svnserve #关闭svn服务 svnserve -d -r /opt/svn/repositories #启动svn,注意目录,不包含svn2 删除版本库 rm -rf svn2/ 同个svn库下根据不同的权限访问不同的目录 vim /opt/svn/repositories/conf/authz #作为参考 [groups] chanpin = user1,user2 yanfa = user3,user4 [svn1:/] test = rw other = rw anyone = rw @chanpin = rw @yanfa = rw [svn1:/chanpin] other = rw @chanpin = rw * = [svn1:/yanfa] anyone = rw @yanfa = rw * =
Mysql 读写分离 主:192.168.153.130 从:193.168.153.131 Mysql-Proxy:193.168.153.132 这里省略mysql主从同步,如果有需要,请查看:Mysql,主从同步 1、 安装Lua 官网下载:http://www.lua.org/download.html Lua 是一个小巧的脚本语言。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。 一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。 1)、安装lua需要依赖很多软件包。 可以通过rpm -qa | grep name检查以下软件是否安装: gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmcrypt* libtool* flex* pkgconfig* libevent glib* 若缺少相关的软件包,可通过yum -y install方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh方式安装。(我的话一般是直接在系统光盘软件库中找到直接rpm安装的,有些找不到,则先在网上下载然后在ftp传给linux再进行安装) 2)、依赖软件安装完毕后则进行编译安装lua MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。 官网下载:http://www.lua.org/download.html(下载源码包) wget http://www.lua.org/ftp/lua-5.1.4.tar.gz tar zxvf lua-5.1.4.tar.gz cd lua-5.1.4 make linux make install export LUA_CFLAGS="-I/usr/local/include" LUA_LIBS="-L/usr/local/lib -llua -ldl" LDFLAGS="-lm" 2、 安装mysql-proxy 1)、首先查看linux版本确认是32位还是64为系统 查看linux内核版本 cat /etc/issue 查看linux版本 cat /proc/version 2)、按系统位数下载 https://downloads.mysql.com/archives/proxy/ 3)、安装 tar –zxvf mysql-proxy-0.8.5- linux-rhel5-x86-64bit.tar.gz mkdir /usr/local/mysql-proxy cp ./ mysql-proxy-0.8.5-linux-rhel5-x86-64bit/* /usr/local/mysql-proxy cd /usr/local/mysql-proxy 3、 读写分离测试 1)、修改rw-splitting.lua文件 修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离 cp /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ./ # vi rw-splitting.lua 2)、修改完成后,启动mysql-proxy cd /usr/local/mysql/bin ./mysql-proxy --proxy-read-only-backend-addresses=192.168.153.131:3306 --proxy-backend-addresses=192.168.153.130:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua & 参数: --proxy-read-only-backend-addresses #只读服务器地址(ip) --proxy-backend-addresses #服务器地址(主服务器) --proxy-lua-script #lua脚本路劲 & #表示后台执行 3)、创建用于读写分离的数据库连接用户 用户名:proxy1 密 码:321 mysql>grant all on *.* to 'proxy1'@'192.168.153.132' identified by '321'; mysql>use aa; mysql>create table tab1(id int auto_increment,name varchar(32) not null,primary key(id)); 【因为已经开启了主从复制所以,130、131主机mysql中都创建了这个用户】 4)、测试登陆账号proxy1@192.168.153.132进行添加数据 可以使用任意ip客户端登陆这个账号 在192.168.153.132登陆: mysql -u proxy1 -P4040 -h192.168.153.132 –p mysql> use aa; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> insert into tab1 (name) values('proxy111'); Query OK, 1 row affected (0.00 sec) mysql> insert into tab1 (name) values('proxy222'); Query OK, 1 row affected (0.00 sec) 在两个mysql中查看结果:一致 结果表明:账号使用 5)、关闭131mysql的从复制 mysql> stop slave; 6)、证明写分离 使用proxy1@192.168.95.13账号打开多个客户端进行插入数据 mysql> insert into tab1 (name) values('stop_slave11111'); …. mysql> insert into tab1 (name) values('stop_slave6666’); 查看: 分别登陆11mysql与12mysql查看aa.tab1中的数据 主数据库: 从数据库: 结果中显示插入的数据存在与主数据库,而从数据库没有,所以证明写能够分离。 7)、证明读分离 使用proxy1@192.168.95.13账号登陆mysql,查看aa.tab1中的数据 mysql>use aa; mysql>select*from tab1; 结果中显示只有从数据库的数据,结合上面的测试,可以证明读分离。可以继续加入数据,查看是否是主写从读。
配置之前,请先阅读mysql主从复制: Mysql-主从复制 原: 主从环境: 主服务器:192.168.153.130 从服务器:192.168.153.131 1、从数据库创建同步用户,将主数据库作为从库原从数据库192.168.153.131上执行创建主从复制的帐号,将192.168.153.130作为从库: mysql -u root -p mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO backup@'192.168.153.130' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.00 sec) 2、原主数据库上执行 mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 358 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) mysql> stop slave; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CHANGE MASTER TO MASTER_HOST='192.168.153.131', MASTER_USER='backup', MASTER_PASSWORD='123456', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=358, MASTER_CONNECT_RETRY=10; Query OK, 0 rows affected (0.05 sec) mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.153.131 Master_User: backup Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 275 Relay_Log_File: mysqld-relay-bin.000002 Relay_Log_Pos: 420 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 275 Relay_Log_Space: 576 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) 3、测试主从双向数据同步分别在主库和从库插入一条数据,会发现,都可以同步到另一部数据库。至此,MySQL主从双向同步完毕。 如果想配置读写分离,点击跳转:Mysql读写分离
实例环境: MySQL-Master:Centos-6.8:192.168.153.130 MySQL-Slave:Centos-6.8:192.168.153.131 1、两台服务器安装mysql yum -y install mysql mysql-server 2、打开mysqld服务并设置密码 [root@localhost /]# service mysqld start 初始化 MySQL 数据库: Installing MySQL system tables... OK Filling help tables... OK To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: /usr/bin/mysqladmin -u root password 'new-password' /usr/bin/mysqladmin -u root -h localhost.localdomain password 'new-password' Alternatively you can run: /usr/bin/mysql_secure_installation which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. See the manual for more instructions. You can start the MySQL daemon with: cd /usr ; /usr/bin/mysqld_safe & You can test the MySQL daemon with mysql-test-run.pl cd /usr/mysql-test ; perl mysql-test-run.pl Please report any problems with the /usr/bin/mysqlbug script! [确定] 正在启动 mysqld: [确定] [root@localhost /]# mysql_secure_installation #此命令来设置mysql root密码以及其他 NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MySQL to secure it, we'll need the current password for the root user. If you've just installed MySQL, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MySQL root user without the proper authorisation. Set root password? [Y/n] #单击回车,或者输入Y点击回车 New password: #输入需要设置的密码 Re-enter new password: #再次输入需要设置的密码 Password updated successfully! #下面一路y就可以,也可以根据自己的需求来选择 Reloading privilege tables.. ... Success! By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] ... Success! By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] ... Success! Cleaning up... All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL! 3、修改mysqld配置文件,修改mysql-主配置文件 [root@localhost /]# vim /etc/my.cnf 添加以下配置 server-id=1 log-bin=mysql-bin #这个一定得设置,否则没有日志的话,从数据库上会报错 [root@localhost /]# service mysqld stop 停止 mysqld: [确定] [root@localhost /]# service mysqld start 正在启动 mysqld: [确定] [root@localhost /]# service mysqld status mysqld (pid 3682) 正在运行... 4、创建主从复制账号 mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO backup@'192.168.153.131' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.00 sec) #192.168.153.131:从服务器地址 #backup是授权给从服务器链接的数据库账户 #123456是密码 5、解锁表 mysql> UNLOCK TABLES; Query OK, 0 rows affected (0.00 sec) 6、正确状态应该如下 mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 275 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) 7、修改数据库配置,修改从库设置 [root@localhost /]# vim /etc/my.cnf [mysqld] 添加语句 log-bin = mysql-bin server_id = 2 master-host = 192.168.137.33 master-user = backup master-pass = 123456 master-port = 3306 master-connect-retry = 60 8、进入数据库开始配置 mysql -u root -p Enter password: #开始配置 mysql> CHANGE MASTER TO MASTER_HOST='192.168.153.130', #主服务器地址 MASTER_USER='backup', #主服务器授权的账户 MASTER_PASSWORD='123456', #主服务器授权的账户密码 MASTER_PORT=3306, #数据库端口 MASTER_LOG_FILE='mysql-bin.000001', #主服务器log-file MASTER_LOG_POS=251, #主服务器Position MASTER_CONNECT_RETRY=10; #重新连接时间 Query OK, 0 rows affected (0.02 sec) 如果上一步出现失败,查看是否slave服务已经打开,如果发现打开,先关闭slave服务才能继续进行配置 9、测试主从是否配置好 mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.153.130 Master_User: backup Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 275 Relay_Log_File: mysqld-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes #这两个一定要是Yes , 要不然会数据同步不过来 Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 275 Relay_Log_Space: 407 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) 10、数据库测试: 在主服务器上创建test数据库 mysql> create database test; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ 3 rows in set (0.00 sec) mysql> 在从服务器上查看下是否有test数据库 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ 3 rows in set (0.00 sec) mysql> 至此,就完成了主从复制的服务。 主从复制完成,但是还不能满足我们的需求。这种配置方式只是将主库的数据同步到从库。 我们设想下:有一天我们往从库插入或者删除数据,那么主库的数据不会得到改变。就会造成数据不一致。 如果想配置主从双向同步,点击跳转: Mysql主从双向同步 如果想配置读写分离,点击跳转:Mysql读写分离
很多时候,自己都太多安逸。 疲惫了思想,即便身体十分灵活,却再也动不起来。 希望把握我好机会,尽自己的可能多让自己过的充实点。 难道,真如父母所说,你能不能胜任你的工作?能不能过好你的生活? 所以,努力真的不够。 你已经不是小孩子了。 抛开颓废的标签,希望你活得精彩。 我是王小贱,一个喜欢安静的人,一个希望自己什么都会但是什么都不会的人,一个碌碌无为的人。 我是王小贱,一个喜欢在家里看着综艺笑得撕心裂肺但是在外面却没有太多笑容的人,一个悲观的人。 我是王小贱,就像电影中的王小贱一样,我-不-贱。 我是王小贱,一个努力努力再努力的王晓磊。
01 在知乎上看过一个问题:“你见过最不求上进的人是什么样子?” 点赞数第一的回答是: “我见过的最不求上进的人,他们为现状焦虑,又没有毅力践行决心去改变自己。 三分钟热度,时常憎恶自己的不争气,坚持最多的事情就是坚持不下去。 终日混迹社交网络,脸色蜡黄地对着手机和电脑的冷光屏,可以说上几句话的人却寥寥无几。 他们以最普通的身份埋没在人群中,却过着最最煎熬的日子。” 短短的几行文字,竟描绘出普通人每日的生活轨迹。 上班摸鱼、下班打游戏,熬夜刷着各种娱乐新闻和社交网站,没有兴趣与爱好、周末只想葛优瘫。 放弃早起、放弃健身、放弃有益的阅读和交际,不肯花时间好好思考自己的人生。 你是否就像这样,终日浑浑噩噩、随波逐流、得过且过。也曾为生活焦虑,但仍找不到奋斗的方向、无意义地耗费着生命。 几年前,经历过一场变故的我,渐渐形成了这样的人生观:做人应当活在当下、及时行乐。因为你永远也不知道明天和意外哪一个会先到来。 然而,当懒散成了习惯、不自律成了生活的常态,我却发现自己越来越痛苦。 《少有人走的路》里有这样一句话:“自律,是解决人生问题的首要工具,也是消除人生痛苦的重要手段。” 我开始明白,不自律会慢慢摧毁一个人的心智、外貌、甚至是人生。 唯有自律,才是解决人生痛苦的根本途径。 02 我表弟今年上大二,常常在微信上找我聊天,说大学生活无聊透顶、空虚至极。 他列举了他日复一日的大学生活状态:“白天上课,晚上去食堂吃个饭,回宿舍就和舍友一起打游戏、开黑。打完几局就觉得没意思,但又没有其他事可做。” 我问他怎么不花时间去读书,不要每次都等到考试前才临时抱佛脚,他却振振有词:“宿舍那么吵,我根本就读不进去。” “那你可以去图书馆或者自习室啊。” 他却总有理由:“图书馆离我们宿舍太远了,在路上要浪费太多时间。” 我又建议他去参加社团活动、或者约同学一起打篮球、跑步,他却说白天的课程已经让他筋疲力尽,提不起精神去运动。 我终于明白他的问题所在:“你并不是无事可做,而是你只想打游戏。” “我能怎么办?我舍友、我同学,人人都靠着玩游戏打发时间,这难道是我一个人的问题吗?” 表弟始终不愿意承认沉迷于游戏是他自己的责任,他觉得外界干扰和影响才是罪魁祸首。他没有办法解决,只能消极应对,因此将大学生活过得一塌糊涂。 许多人习惯将自己不自律的原因推卸给他人和外界环境: “上班太累了,下班后哪有精力去读书写作?只想看无脑综艺放松一下。” “我的体质就是喝水都会胖,就算去健身房锻炼也没用的。” 推卸责任的时候,可能感觉舒服和痛快,但却永远无法进步、心智永远无法成熟。趋利避害、逃避责任是人类的天性,但是每个人的人生轨迹,都是由自己主宰。 畅销书作家严歌苓,曾被人问过怎么能写那么多书。 她说,我当过兵,对自己是有纪律要求的。当你懂得自律,那些困难都不算什么,人必须对自己负责。 她的自律,就是每天至少写作六小时,隔一天游泳1000米,几十年如一日。就算每次坐到书桌前,她都会全身颤抖、痛苦到不行,但她知道,唯有自律,才能找到自己存在的价值。 推卸责任容易,坚持一件事很难。想要变得自律,必须从敢于承担责任开始。 03 那些自律到极致的人,都活成了什么样子? 前段时间被国产电视剧《人民的名义》刷屏,剧中的老戏骨们,不仅演技在线,连身材也是全程刷存在感。 剧中扮演沙书记的张丰毅,尽管已经61岁,6块腹肌却从不离身。 他的秘诀便是烟酒不沾,每天早晨7点起床跑步,下午必去健身房举铁。 明星工作时常常过着黑白颠倒的生活,但张丰毅曾在采访中说过,自己不管在什么条件下都会坚持运动:“在剧组也会每天运动,睡前抽空锻炼一下,第二天早晨也会比其他人早起半小时运动。” 因该剧而圈粉无数的达康书记扮演者吴刚,今年也已55岁,但剧中的他身手矫健、身材匀称。在处理大风厂事件的那一集,他毫不费力地攀爬脚架的镜头给观众留下了深刻的印象。 50多岁的年龄,也许在很多人眼里已经可以放任自流了。 但吴刚仍然严格要求自己,坚持跑步5公里和游泳,拍戏的时候也是一有空就去健身房。 自律帮助他在拍戏时保持良好的状态、精力充沛。 反观我们身边,有多少年龄刚过30的男人,纵欲过度、无法自控,腆着啤酒肚,眼神也变得越来越浑浊。 虽然人各有志,选择什么样的生活完全取决于自己,别人没有权利去干涉。 但就像康德所说,假如我们像动物一样,听从欲望、逃避痛苦,我们并不是真的自由,因为我们成了欲望和冲动的奴隶。我们不是在选择,而是在服从。唯有自律,自律使我们与众不同,自律令我们活得更高级。 对于成功者来说,自律已经融入了血液和骨骼,成为身体和灵魂的一部分。他们在自律中超越自我、慢慢成就自我。 04 并不是说自律一定能带来成功,但是自律的过程一定会让你更加爱自己。 我仍记得第一次看《百元之恋》这部电影时给我带来的震撼。 女主是32岁的大龄未婚女性,终日过着颓靡废柴的生活。在家啃老、足不出户、大口咀嚼垃圾食品、每天打着游戏度日,没有目标、毫无自律可言。 这多像当下将“努力不一定成功,但不努力会很轻松”挂在嘴边的年轻人的生活状态。 然而,就算废柴如女主,因为喜欢上了一个拳击手而开始接触拳击,开始慢慢改变。她加入了拳击俱乐部,每天挥汗如雨、坚持练习,戒掉了烟酒,连饮料也从可乐换成了矿泉水。 由于年龄限制,她有且仅有一次代表俱乐部参加专业拳赛的机会。她为此付出了全部的努力,拳击场上的她变得光芒四射、与几个月前的颓靡形象形成了巨大的反差。 但是,现实生活中并没有那么多励志故事,电影的结局并没有以豪迈收场。女主在首轮就被淘汰,她被打得鼻青脸肿、满嘴流血。 就算输掉了比赛,但以此为分界点,她彻底与过去的人生告别。自律让她赢得了尊严,她不再自暴自弃,人生从此不再颓靡。 05 自律和不自律的人生,真的有着天差地别。 我问过身边考研失败的朋友,是否后悔过曾经自律到极致的那段时光? 她说,考研的那段日子,是我人生中最美好的时光。现在的我,每当遇到困难想要放弃,我都会想起,自己曾经为了一个目标,可以自律成那种模样。 你最拼命的时候是什么样的? 你是否为自己的人生、好好地燃过一次? 能坚持下去的自律,都会成为蜕变的契机。 以此共勉. 文章来源: 小椰子 麦子熟了
1:字符串类型转换 1 num = 100 2 3 num2 = "100" 4 5 #num是整数类型的值,num2是字符串类型的值,如果把他们两个的类型转换下呢? 6 7 int(num2) #int 整形成整数 8 9 str(num) #转换成字符串 2:组成字符串的两种方式 1 #This One 2 3 a = "lao" 4 b = "wang" 5 c = "zhao" 6 7 #如果我们想打印 “laozhao”和“laowang”改如何打印 8 9 d = a + b #这样打印d的结果是:laowang 10 e = a + c #这样打印e的结果是:laozhao 11 12 #如果我们想打印 “===laowang===” 13 14 f = "===" + a + b + "===" 15 16 #这样是不是很麻烦 17 18 #This Two 我们试试第二种方法 19 20 g = "===%s==="%(a+b) 3:字符串中的下标 字符串的下标是什么呢?就像我们去坐火车每一节车厢的座位号,这个及就类似于我们的下标 我们定义一个字符串,name = “ABCEDF” , 里面的adcdef就类似于座位号,每一个字符都有一个下标,注意Python的下标是从0开始计算的,我们来看 中括号里面的数值,我们称之为下标 如果你想打印一个变量里面的最后一个字符,那请问你如何获取变量里一共写了多少字符? len :测试长度 比如 : 测试name的变量 len(name) 如何获取变量中最后一个字符呢? name[-1] 4:切片、字符串的逆序 切片:取一片内容。就像一块羊肉,切一片的意思。 注意:切片的取值,取不到截至点的值,只能取到截至点前的一位数字 如果你冒号后面没有写截至点的话,那就默认显示后面所有的字符,我们来试试 如果我们想从第二个数字取到倒数第二个数字,我们应该如何操作? 假如我想取 name = "abcdefABCDEF" 中 ceACE我该如何操作,就是我跳着取值该如何操作? 语法为 :name[起始位置:终止位置:步长] 我们在来说说逆序,也就是倒序 上面的方法也可以写成: 我怎么去判断,冒号前面是从左边开始切片,还是右边呢?就看后面的步长,如果是 -1的话,冒号的左边变成了右边,而冒号的右边变成了字符串的最左边。 5:字符串的常见操作 find : 查找 比如:我们写一个字符串 6是什么意思呢 ? 指查找的内容在字符串的第几位,从0开始world的w是在6位 我输入错误的时候,为什么程序也会显示出来。如果找到了就会显示出位置数,如果不是,那就显示-1,找不到信息就显示 -1. 运行find的时候,找的顺序就是从左边开始找,那如果我们想从右边也就是后面开始找的话, 那我们该怎么写? index也是索引的意思,也可以用来查找,但是唯一不同的是,find查找不到也会返回信息,index查找不到无法返回信息。除了找不到的时候功能显示不一样,其他的都一样。 count:查看在字符串中该字符一共出现几次 replace:替换字符串中的字符。相当于replace的返回值,愿字符串不变 我们再来试一次 那如果我们只想修改一个呢?,后面的1表示个数,你想修改的个数是几。 split:切割 我们把name变量里面的字符串用split来分割,按照空格来切割 capitalize:把字符串的第一个字符大写 title:把所有字符串的首字母大写 startswith:检查输入的信息是否与字符串的开头相同,如果相同就返回True,如果不是就返回False endwhith:检查输入的信息是否与字符串的末尾相同,如果相同就返回True,如果不是就返回False lower:把字符串中所有的大写字符串成小写 upper:把字符串中所有的小写字符串成大写 ljust:靠左居中 rjust:靠右居中 center:居中显示,居中的长度用户自己定义,center(50),前后各50 lstrip:删除左边的空白字符 rstrip:删除右边的空白字符 strip:删除两端的空白字符 rfind:类似于find()函数,不过是从右边开始查找 rindex:类似于index()函数,不过是从右边开始查找 partition:讲字myStr字符串中的,willam前,willam,和willam后分为三段显示出来 可以自己尝试在里面放置两个同样的字符,用partition和rpartition来看看什么效果 splitlines:按照行分隔,返回一个包含各行作为元素的列表 isalpha:判断是否为字母 isdigit:判断是否为数字 isalnum:判断是否为字母和数字 isspace:判断是不是纯空格,如果是返回True,如果不是返回False join:构建一个新的字符串 6:列表 如果我们想把公司的任意一个人定义成一个变量,是没问题的,那我们想把每个部门的每个人都定义呢,也可以这样做,那会比较麻烦,这样用列表就比较简单了 那我们应该如何对列表进行 增删改查? 我们先来说添加一个名字到列表里 语法 : append 那如果我们想在指定位置插入一个名字呢? 语法:insert。前面的0代表你想插入的位置,后面的威廉,代表你想插入的姓名 append和insert的区别是一个只能在最后插入字符,一个是可以在任何位置插入字符 我们再说一个插入字符的方法 还有没有其他办法 ? 语法:extend 我们再来说说如果删除列表的内容 pop():删除列表中的最后一个,把列表中的最后一个字符拿出来,相当于删除 如果我们想删除里面的任意一个名字的时候,我们该如何操作? 语法:remove。根据内容来删除 还有一种方法和remove差不多。 语法:del。根据下标来删除 说完删除我们在来说说如何更改内容 如果我们进行查询的话,该怎么操作 语法:in 或 not in 7:字典 什么是字典?字典其实和变量和列表都是一样的,来存储内容,只不过语法不一样 字典是: infor = {键:值,键:值,键:值} 字典如何增删改查呢? 1、增加一个Key:Value #先定义一个字典 infor = {'name':'willam','age':18,'addr':'Henan'} infor {'name': 'willam', 'age': 18, 'addr': 'Henan'} #下面的命令事进行添加一个值 infor['QQ'] = 10086 infor {'name': 'willam', 'age': 18, 'addr': 'Henan', 'QQ': 10086} 2、修改字典的信息 infor {'name': 'willam', 'age': 18, 'addr': 'Henan', 'QQ': 10086} #字典里面已经有一个QQ信息了,我们再来输入一个试试 infor['QQ'] = 10010 infor {'name': 'willam', 'age': 18, 'addr': 'Henan', 'QQ': 10010} #如果字典里面已经存在你要添加的值,会变成修改字典内该值 3、删除字典信息 infor {'name': 'willam', 'age': 18, 'addr': 'Henan', 'QQ': 10010} #del 删除字典内信息,我们先来删除QQ看看效果 del infor['QQ'] infor {'name': 'willam', 'age': 18, 'addr': 'Henan'} #再次查看字典,QQ已经没了,我们想再次删除QQ试试。报错了,如果字典内没有你想删除的信息,就会报错 del infor['QQ'] Traceback (most recent call last): File "<pyshell#47>", line 1, in <module> del infor['QQ'] KeyError: 'QQ' 4、查询字典信息 infor {'name': 'willam', 'age': 18, 'addr': 'Henan'} #和列表差不多,我们根据字典内的key来进行查找信息 infor['name'] 'willam' infor['age'] 18 #但是如果我们输入的值没有的话,他就会报错,怎样查看这个值是否存在在字典内而不报错呢? infor['QQ'] Traceback (most recent call last): File "<pyshell#56>", line 1, in <module> infor['QQ'] KeyError: 'QQ' #这样写就不会报错了 infor.get('QQ') infor.get('name') 'willam' infor.get('age') 18 字典的增删改查: #增加 xxx['Key'] = Value #删除 del xxx['key'] #修改 xxx[已存在的key] = new_value #查询 xxx.get('key') 8、While、For循环遍历列表 #while 循环遍历 num = [11,22,33,44,55] i = 0 while i<5: print(num[i]) i += 1 #for 循环遍历 num = [11,22,33,44,55] for temp in num: print(temp) #如果num里面包含很多很多的数值的时候,我们可以这样操作 num = [11,22,33,44,55,66,77,88,99,10,111,222,333,444,555] i = 0 temp_num = len(num) while i<temp_num: print(num[i]) i += 1 9、for-else的应用 card_name = [{'name':'老王','age':18,'addr':'河南'},{'name':'老李','age':20,'addr':'河南'}] find_name = input("请输入你需要查找的姓名:") for temp in card_name: if temp['name'] == find_name: print("找到了...") break else: print("查无此人") 10、列表的append、extend区别 #extend a = [11,22,33] b = [44,55] a.extend(b) print(a) [11, 22, 33, 44, 55] #append a = [11,22,33] b = [44,55] a.append(b) print(a) [11, 22, 33, [44, 55]] #append是把整个列表都添加进去,而extend是把列表里的值一个一个的添加进去,所以要区分开来。一个事整体添加,一个是合并。 11、字典的常见操作、遍历 1 infor = {'name':'willam','age':18,'addr':'Henan'} 2 3 #我们使用xxx.keys()可以查看字典内包含了多少key 4 5 infor.keys() 6 dict_keys(['name', 'age', 'addr']) 7 8 #同样的方式,我们也可以进行value的查询 9 10 infor.values() 11 dict_values(['willam', 18, 'Henan']) 12 13 #我们也可以使用if进行查询有没有该信息,当然infor.get('')也是可以的 14 15 16 if 'qq' in infor.keys(): 17 print("有QQ信息") 18 19 20 if 'name' in infor.keys(): 21 print("有name信息") 22 23 24 有name信息 25 if 18 in infor.values(): 26 print("有") 27 28 29 有 30 31 #我们可以用以下命令来查看infor字典内所有的key 32 for temp in infor.keys(): 33 print(temp) 34 35 36 name 37 age 38 addr 39 #用一下命令来查看infor字典内所有的value 40 for temp in infor.values(): 41 print(temp) 42 43 44 willam 45 18 46 Henan 47 #items查看字典内所有的key和value,注意输出的结果是元祖 48 infor.items() 49 dict_items([('name', 'willam'), ('age', 18), ('addr', 'Henan')]) 50 51 for temp in infor.items(): 52 print(temp) 53 54 55 ('name', 'willam') 56 ('age', 18) 57 ('addr', 'Henan') 58 #这样写更美观点 59 for temp in infor.items(): 60 print('key=%s,value=%s'%(temp[0],temp[1])) 61 62 63 key=name,value=willam 64 key=age,value=18 65 key=addr,value=Henan 66 67 #下列的操作是:拆包,把元祖内的值拆开分给c,d 68 a = (11,22) 69 70 b = a 71 72 b 73 (11, 22) 74 75 c,d = a #先计算等号右边,a的值第一个分配给左边的c,第二个分配给左边的d,依次往后推,这种方式叫作 拆包 76 77 c 78 11 79 d 80 22 81 #我们再来修改下上面的items去里面的值 82 83 for A,B in infor.items(): 84 print("key=%s,value=%s"%(A,B)) 85 86 87 key=name,value=willam 88 key=age,value=18 89 key=addr,value=Henan View Code
1:if比较运算符、and、or >=:大于或者等于 <=:小于或者等于 ==:等于 !=:不等于 (<>:也是不等于,在Python2中可用、Python3中无法使用) 1 age = 19 2 3 #if age 大于等于 18:#我们用什么方法来表示大于或者等于 4 if age >= 18: #大于或者等于,不论大于还是小于,符号都在等号的左边 5 print("已成年,可以去网吧...") 6 7 #if age <= 18: 小于或者等于 8 #if age == 18: 等于 9 #if age != 18: 不等于 10 #if age <> 18: 也是不等于(在Python2中可以用,在Python3中不能用) 11 #注意: >=、<=、==、!= ,中间都不能有空格 View Code 2:逻辑运算符 逻辑运算符是什么呢? 站在;逻辑的角度上思考,你们两个是都去呢,还是你们两个只有一个人可以去。 逻辑运算符:或者(or)、并且(and)、not 我们先来说下“或者” 1 you = input("你去吗?") #询问你去办理业务吗 2 she = input("他去吗?") #询问他去办理业务吗 3 4 #if you == "去" 或者 she == "去": #规定只要有一个人去,这件事情就可以办成 5 if you == "去" or she == "去": #or就相当于或者的意思 6 print("可以办理业务。") View Code 再来说说“并且” 1 you = input("你去吗?") #询问你去办理业务吗 2 she = input("他去吗?") #询问他去办理业务吗 3 4 #if you == "去" 并且 she == "去": #规定你和他都要去,如果其中有一个人不去的话就无法办理业务 5 if you == "去" and she == "去": #and就相当于并且的意思,if里面的两个条件必须都成立的情况下才可以去办理业务 6 print("可以办理业务。") View Code 用if和逻辑运算符来打印一个 “你是不是白富美的小程序” 1 color = input("你白吗:") #你白吗 2 money = input("你的财产总和是:") #你有钱吗 3 beautiful = input("你美么:") #你漂亮吗 4 5 #if 白 并且 有钱 并且 美: 6 #if 白 and 有钱 and 美: 7 if color == "白" and money > 1000000 and beautiful == "美": 8 print("你是白富美。") View Code 有没有发现,这样即便你输入的是 白,1千万,美,还是没有显示“你是白富美”的值,那问题出在哪里呢? 1 color = input("你白吗:") #你白吗 2 money = int(input("你的财产总和是:")) #你有钱吗,因为输入数值会加上引号变成字符串,所以我们要用int整形来把输入的信息转换成整数,去掉引号 3 beautiful = input("你美么:") #你漂亮吗 4 5 #if 白 并且 有钱 并且 美: 6 #if 白 and 有钱 and 美: 7 if color == "白" and money > 1000000 and beautiful == "美": 8 print("你是白富美。") View Code 我们还是需要稍微修改下我们的代码,使我们的代码变得更完整 我们三项都输入满足条件的值的时候,会打印出“你是白富美”,如果我们没有达到的话,就不提示什么,我们怎么做才能让我们输入的值不满足条件的时候给予相应的提示呢? 1 color = input("你白吗:") #你白吗 2 money = int(input("你的财产总和是:")) #你有钱吗 3 beautiful = input("你美么:") #你漂亮吗 4 5 #if 白 并且 有钱 并且 美: 6 #if 白 and 有钱 and 美: 7 if color == "白" and money > 1000000 and beautiful == "美": 8 print("你是白富美.") 9 else: 10 print("你不是白富美.") 11 12 ''' if .... : 如果你....完成: 13 我就打印你是白富美 14 else: : 那如果你没有完成: 15 那我就打印你不是白富美 16 if 和 else 就类似于 : 如果...那么 17 如果你完成了我怎么做,如果你不完成,那么我这样做''' View Code 如果我们用“或者 or”呢? 可以自己试试。 说完了and和or,我们再来说说逻辑运算符not not是什么意思呢 “非”,如果X的值为True,则返回结果为False,如果X的值为False,则返回结果为True 1 #我们定义a变量,然后拿a来做比较,下方的代码,输出的结果为“正确” 2 a = 30 3 4 if a > 0 and a <= 50: 5 print("正确") 6 else: 7 print("错误") 8 9 #那如果我们使用not来进行操作,会显示什么呢? 10 11 a = 30 12 13 if not (a > 0 and a <= 50): 14 print("正确") 15 else: 16 print("错误") 17 18 #可以看到上述的代码,我们在条件前添加not,就可以达到非的效果,黑白颠倒。 View Code 3:if-elif的使用 elif是什么呢,简单说,我们用if和else做判断,判断对错都会返回一个结果,如果我有2-3个条件去执行,我要怎么做?来看下面的例子 1 '''if 条件1: #定义你是网易工作吗,如果想去输出下面信息,结束程序,如果不想去继续往下走 2 print("xxxxx") 3 elif 条件2: #定义你是淘宝工作吗,如果想去输出下面信息,结束程序,如果不想去继续往下走 4 print("xxxxx") 5 elif 条件3: #你想去京东工作吗,如果想去输出下面信息,结束程序,如果不想去继续往下走 6 print("xxxxx") 7 else: #如果以上三个都不是,输出else的信息 8 print("xxxxx") ''' 9 10 11 sex = input("你想去哪里工作:") 12 13 if sex == "网易": 14 print("你获得了网易的面试邀请...") 15 elif sex == "淘宝": 16 print("你获得了淘宝的面试邀请...") 17 elif sex == "京东": 18 print("你获得了京东的面试邀请...") 19 else: 20 print("恭喜,什么也没有") View Code 我们写一个用户输入1-7反应给用户星期几 1 num = int(input("请输入一个整数(1-7):")) #因为用户输入的是字符串,所以我们要整形 2 3 if num == 1: 4 print("星期一") 5 elif num == 2: 6 print("星期二") 7 elif num == 3: 8 print("星期三") 9 elif num == 4: 10 print("星期四") 11 elif num == 5: 12 print("星期五") 13 elif num == 6: 14 print("星期六") 15 elif num == 7: 16 print("星期日") 17 else: 18 print("错误,重新输入") View Code 4:while循环 程序的三大执行顺序: 1):顺序执行:从下往下执行; 2):选择执行:从上往下执行,在中间可能一直往下,可能从右边走然后往下,有选择; 3):循环执行:去操场跑步的时候要一直绕着跑道跑,重复的绕圈就是循环。 先写一个简单的循环: 输入1-10的数字,每次循环的条件执行都会把结果输出,继续往下走,输入的结果再+1返回给条件继续判断,直到条件无法完成时退出循环 5:if的嵌套 嵌套: 1):if嵌套:一个if里面还有一个if,当你在做一件事情是在别的事情完成或者不完成的前提下做的事情 1 ''' 2 我们所学习过的if语句大概是一下三种 3 4 ①: 5 if 条件成立: 6 print(xxxxx) 7 8 ②: 9 10 if 条件成立: 11 print(xxxxx) 12 else: 13 print(xxxxx) 14 15 ③: 16 17 if 条件1: 18 print(xxxxx) 19 elif 条件2: 20 print(xxxxx) 21 elif 条件3: 22 print(xxxxx) 23 ... 24 else: 25 print(xxxx) 26 27 if嵌套呢? 28 29 if 条件: 30 print(xxxx) 31 if xxx2: 32 print(xxxx) 33 34 这就是if嵌套 35 ''' View Code 那if嵌套怎么用呢? 1 ticket = 1 #定义车票 2 knifeLenght = 8 #定义回家带的一把刀,长度为cm 3 4 #先判断有没有票,能不能进站 5 if ticket == 1: #如果没有车票,无法进站 6 print("车票检查通过,可以进站进行安检..") #打印欢迎进站信息 7 if knifeLenght <= 10: #如果刀子的长度没有超过10厘米可以进站 8 print("通过安检,可以进入候车厅..") #打印进站信息 9 print("两分钟后进入列车,请各位排队依次进入..") #打印进站信息 10 else: #如果刀子长度超过10厘米讲无法进入列车 11 print("您无法通过安检,请检查自身行李") 12 else: #如果没有通过检票,请先购买 13 print("请先购买车票,在进行检票进站") 14 15 #可以自行修改没有车票或者刀子长度超过10cm看看效果 View Code 我们在写一个关于判断白富美和高富帅的小脚本 1 sex = input("请输入你的性别:") #让用户输入性别 2 3 if sex == "男": #如果是男的执行以下信息 4 high = int(input("请输入你的身高:")) #输入身高 5 money = int(input("请输入你的存款:")) #输入存款 6 cool = input("你觉得你帅吗:") #输入..... 7 8 if high >= 180 and money > 100000 and cool == "帅": #全部满足才是高富帅 9 print("你是高富帅") #全部满足输出高富帅 10 else: 11 print("你不是高富帅") #不满足输入不是 12 13 elif sex == "女": #如果用户输入的性别是女,执行以下信息 14 colour = input("你觉得你白么:") #输入... 15 money = int(input("请输入你的存款:")) #输入存款 16 cool = input("你觉得你美吗:") #输入... 17 if colour == "白" and money > 100000 and cool == "美": #全部满足才可以继续执行 18 print("你是白富美") #全部满足的输出白富美 19 else: 20 print("你不是白富美") #如果不是的话就不是 21 else: 22 print("输入错误") #如果输入的性别不是男的也不是女的,提示错误信息 View Code 6:while嵌套 while嵌套 :在while条件满足的事情里面又添加了一个while 1 while 条件: 2 条件满足的时候做的事情 3 条件满足的时候做的实情2 4 ..... 5 while 条件2: 6 条件2满足的时候做的事情 7 ....... View Code 我们现在来试验下 下面写出你要做的事情,重复10遍 1):站起来2):坐下3):站起来4):原地旋转5圈5):坐下 用while 怎么写? 1 while 条件: #循环次数为10次 2 1.站起来 #先做第一遍,站起来 3 2.坐下 #先做第一遍,坐在 4 3.站起来 #先做第一遍,站起来 5 while 执行5次: #每次循环5次1圈 6 4.原地旋转1个 7 5.坐下 #坐在 8 9 #站起来-坐在-站起来-转一个圈..转五个圈... 重复10次 View Code 比如我们要打印一个矩形: * ** *** **** ***** 我们应该如何利用while循环和while嵌套来进行操作呢? 1 我们先来打印一个简单的 2 3 ***** 4 ***** 5 ***** 6 ***** 7 ***** 8 ''' 9 10 i = 1 11 while i <= 5: 12 print("******") 13 i = i + 1 14 15 16 #加入我想print("*") 只输出一个* 我改如何操作,可以借鉴上面的while嵌套的站起来,坐下来写 17 18 i = 1 19 20 while i <= 5: 21 j = 1 22 while j <= 5: #打印5次* ,也就是说打印出来的效果是“*****” 23 print("*",end="") #end="" 是不会换行的意思,空格的意思,print输出*的话默认是换行的 24 j = j + 1 25 print("") #while j循环结束后用此命令来换行,print输出空内容默认是换行,等到while j结束之后执行, 26 i = i + 1 27 #循环打印5次已经打印的5个* View Code 我们先来说下 什么是符合运算符? 比如 : i = i + 1 相当于 i += 1 注意一点: 1 a = 5 #定义变量a 2 a *= 34-22+43-22 #要记住这个误区, 3 a 4 165 5 6 #a *= 34-22+43-22相当于a = 5 * (34-22+43+22),不是a = 5*34-22+43+22 如果遇到后面是一个式子的话切记要加小括号 7:用“*”如何打印三角形? 结果如下: 1 i = 1 2 while i <= 5: 3 j = 1 4 while j <= i: 5 print("*",end="") 6 j += 1 7 print("") 8 i += 1 我们来分析下代码 小想法: 1 i = 1 2 while i <= 5: 3 j = 1 4 num = int(input("请输入行里*的个数:")) 5 while j <= num: 6 print("*",end="") 7 j += 1 8 print("") 9 i += 1 我们来尝试写一个99乘法表: 1 i = 1 2 while i <= 9: #打印9行 3 j = 1 4 while j <= i: 5 print("X*Y=Z",end="") #表示所有的乘法,如 1*1=1 6 j += 1 7 print("") 8 i += 1 修改x*y=z 1 i = 1 2 while i <= 9: 3 j = 1 4 while j <= i: 5 print("%d*%d=%d "%(j,i,j*i),end="") 6 j += 1 7 print("") 8 i += 1 如果你运行了代码之后,如果你有强迫症,那这里就要介绍一个命令 “\t”。 \t的意思类似于空格,我们修改下以上的代码,来看看效果 1 i = 1 2 while i <= 9: 3 j = 1 4 while j <= i: 5 print("%d*%d=%d\t "%(j,i,j*i),end="") 6 j += 1 7 print("") 8 i += 1 来试验一个小游戏: 剪刀石头布的游戏,达到这样的效果?要怎么写? 1 #impore:导入模块的意思,导入random的模块 2 import random 3 4 #1. 提示并获取用户的输入 5 player = int(input("请输入:0石头,1剪刀,2布:")) 6 7 #2. 让电脑出一个 8 computer = random.randint(0,2) #模块后面如果你想调用什么需要在模块后加一个点.,randint(0,2)的意思是自动在0-2中选取一个数字 9 10 #3. 判断用户的输入,然后显示对应的结果 11 #玩家获胜的条件: 12 if (player == 0 and computer == 1) or (player == 1 and computer == 2) or (player == 2 and computer == 0): 13 print("赢了") 14 #玩家平局的条件: 15 elif player == computer: 16 print("平局") 17 else: 18 print("输了") View Code 8:for循环 简单了解下,for循环 1 name = "laowang" 2 3 #for xx in xx: #这是for循环的语法 4 for temp in name: #for xx(这里可以随便写,写一个新的变量名) in xx(这里写变量) 5 print(temp) #输出新变量,打印name变量中字符串的每个字符 8:while里面嵌套if、while之break 之前我们遇到if里面嵌套if,while里面嵌套while,但是我们没见过while里面嵌套if的,我们来做一个实验 打印100以内的所有偶数? 1 i = 1 2 3 while i <= 100: 4 5 if i%2==0: #如果i能够整除2且没有余数的话,条件通过打印i。 6 print(i) 7 8 i += 1 那break是什么意思呢? break:如果条件满足提前结束循环语句 1 i = 1 2 3 while i <= 5: 4 #如果我们只想打印3以为的数字怎么办? 5 if i == 3: 6 break #break 如果条件满足提前结束while循环语句,break就是结束循环的语句 7 print(i) 8 i += 1 我们如果像打印100以内的前20个偶数,怎么打印? 1 i = 1 2 num = 0 3 while i <= 100: 4 if i%2 == 0: 5 print(i) 6 num += 1 7 if num == 20: 8 break 9 i += 1 说完break,我们再说说 continue。 continue:结束这一次的循环,转而执行下一次的循环。 我们来实验下 1 i = 1 2 3 while i <= 10: 4 i += 1 5 6 if i == 3: 7 continue 8 print(i) 注意:break和continue在while循环的嵌套中,break和continue在哪个while下面,就对哪个while循环执行。
Python 3 1:print:输出信息 例子: ( 所有的标点符号都要是英文状态下输入,要不然会报错) print(“hello world”) 2:注意 : python 和 python3 3:ipython :在python前加i,此命令拥有和python类似的功能,但同时拥有linux下执行命令的功能 ipython 或者 ipython3 4:注释: 在python中 “#” 右边的字符为注释,可写可不写,写下是为了方便以后快速来浏览自己代码出现问题的位置 “#”号是一个单行的注释,注释提醒的内容不能换行,如果换行需要在新的一行的行首添加“#”号 #以下代码用来打印一个信息 print("hello world!") 如果需要注释的内容过多,那我们可以使用多行注释符 ‘’‘ ’‘’ 三个单引号来运行或者 三个双引号 '''三个单引号 来完成多行注释 也就是说,三个 单引号之内的内 容都不会在程序 中显示出来''' 5:python 2 中如果代码中有中文,需要在脚本顶部添加一行代码来解释中文字符,第二个是python推荐的用法,当然两个都可以使用 #coding=utf-8 或者 #-*- coding:utf-8 -*- 6:变量 变量定义:相当于一个容器,用来存储一个数据 score = 100 #定义了一个变量,这个变量的名字叫score,它里面存储了一个数值 100 high = 180 #单位是cm applePrice = 3.5 #苹果的价格 元/斤 weight = 7.5 #单位是斤 money = applePrice * weight #如果money=xxxx是第一次的话那就定义了一个变量 money = money - 10 #如果 money = xxx不是第一次出现,那么就不是定义变量,而是给这个已经存在的变量赋上一个新的值 print(money) 7:input print:之前第一个学习到的命令为 print("hello world") ,执行这个命令会打印出hello world,所以print是一个程序的输出 input:则是一个程序的输入 从键盘中获取一个数值,把刚刚获取的数值存储到等号左边的变量中 high = input("请输入您的身高:") #我们输入的值会存储到high中 我们来做一个变量输出的例子: age = 18 print(age) #注意括号中的age不能用双引号括起来,双引号括起来的字符相当于打印双引号中的内容而不是变量 或者 age = 18 print("age变量中的值是%d"%age) #%d类似于一个坑,这个坑里面要填%age 如果我现在还有一个值,不是数值,而是中文字符,那我们怎么来,用%d是不行的,%d是需要一个整形类型的值才能执行,要不然会报错,那就要使用%s 如果变量时带引号的字符串用%s,如果变量是没有引号的整形值的话用%d name = "晓磊" #定义一个字符串的变量,带引号的都是字符串 print("输出的名字是:%s"%name) #输出name的变量 我们现在来做一个打印名片的小实验 需求: 1:打印姓名、年龄啊; 2:打印QQ、微信; 3:打印职业、手机号。 我们先来用第一种方法进行操作: name = input("请输入您的姓名:") #存储用户输入的姓名 age = input("请输入您的年龄:") #存储用户输入的年龄 QQ = input("请输入您的QQ:") #存储用户输入的QQ wechat = input("请输入您的微信:") #存储用户输入的微信 job = input("请输入您的职业:") #存储用户输入的工作信息 phone = input("请输入您的手机号:") #存储用户输入的手机号 print("================") #为了美观添加一排等号 #打印字符串和变量用逗号来区分,要不然程序会报错 print("姓名:",name) #打印用户输入的姓名 print("年龄:",age) #打印用户输入的年龄 print("QQ:",QQ) #打印用户输入的QQ print("微信:",wechat) #打印用户输入的微信 print("工作:",job) #打印用户输入的工作 print("手机号:",phone) #打印用户输入的手机 print("================") View Code 我们用第二种方法进行操作 1 name = input("请输入您的姓名:") #存储用户输入的姓名 2 age = input("请输入您的年龄:") #存储用户输入的年龄 3 QQ = input("请输入您的QQ:") #存储用户输入的QQ 4 wechat = input("请输入您的微信:") #存储用户输入的微信 5 job = input("请输入您的职业:") #存储用户输入的工作信息 6 phone = input("请输入您的手机号:") #存储用户输入的手机号 7 8 print("================") #为了美观添加一排等号 9 #打印字符串和变量用逗号来区分,要不然程序会报错 10 print("姓名:%s"%name) #打印用户输入的姓名 11 print("年龄:%s"%age) #打印用户输入的年龄 12 print("QQ:%s"%QQ) #打印用户输入的QQ 13 print("微信:%s"%wechat) #打印用户输入的微信 14 print("工作:%s"%job) #打印用户输入的工作 15 print("手机号:%s"%phone) #打印用户输入的手机 16 print("================") View Code 注:在Python2和Python3中,输入的指令是不同的 1 Python2 2 3 name = raw_input("请输入姓名:") 4 5 Python3 6 7 name = input("请输入姓名:") 8 9 #要注意区分 View Code 8:判断语句 比如:乘客去乘坐高铁,进站时需要安检,如果安检合格你就可以进去,如果不合格就进不去。 去银行取钱,如果密码输入正确进行操作 ,如果输入错误则无法进行操作。 if : 条件判断语句 比如: age = 18 假如 age = 18: 条件成立之后显示的内容,如果不成立就不现实 #可以看到条件成立之前空了4个空格的位置,也就是一个table键,当你在条件后面添加冒号的时候单击回车,系统会自动缩进 那么假如就是 if ,也就是说if就是用来判断一个条件是否成立,成立了该怎么做不成立该怎么做 1 age = 19 #年龄赋值为19岁 2 3 #if 如果年龄大于18: 4 if age>18: #如果年龄大于18,执行以下操作 #年龄赋值为19岁 5 print("已成年,可以去网吧.....") #这样在python下能不能正常执行?不能正常执行该怎么办? 我们来改正下上面的代码 1 age = input("请输入年龄:") #input获取的所有数据都当作字符串类型,比如用户输入20,存储的信息是"20"而不是20 2 3 age_num = int(age) #-->这个结果是整形,那就是去除双引号之后的值 20,定义一个新的变量,新的变量存储的是age取消双引号的值 4 5 if age_num > 18: #这里就要填写整形后的age_num,要拿着整形的20和18进行比较 6 print("已成年,可以去网吧......") View Code 比如: int(x):将X转换成一个整数 floa(x):将X转换为一个浮点数 再来了解下变量的不同类型:(暂时说这两个,如果像查看变量的类型,用type) int(有符号整形) #也就是说整数类型的数值都是 int类型 float(浮点型) #有小数点的数值都属于float类型 1 a = 100 2 b = 3.1425 3 c = "willam" 4 5 type(a) 6 <class 'int'> 7 type(b) 8 <class 'float'> 9 type(c) 10 <class 'str'> View Code 9:我们之前学过if,假如条件成立时去做什么事情,那条件不成立的时候该怎么做? 那就需要 else了 1 if 条件: 2 条件成立的时候,做的事情 3 else: 4 条件不成立,做的事情 举个例子: 1 age = input("请输入您的年龄:") 2 3 age_num = int(age) 4 5 if age_num > 18: 6 print("已成年,可以去网吧...") #如果年龄大于18的话,你就可以去网吧 7 else: 8 print("未成年,回家写作业去吧...") #如果你的年龄小于18的话就不能去网吧,要去写作业 View Code 10:标识符 标识符由数字、字母、下划线组成,不能以数字开头 比如变量:正确的有: fnD021、FdNN1、test_list、_test等 错误的有:2Fnod、0Dii_si、Fdoas#等 关键字不要去进行赋值,什么是关键字? 关键字:python一些具有特殊功能的标识符,就是所谓的关键字,就是python已经使用过的 比如:and、as、break、elif、if等 可以使用 help("keywords")等命令来查看系统内置的关键字 11:运算符 常见的运算符有:+、-、*、/、//、%、**等 a = 5 #定义a变量等于5 b = 2 #定义b变量等于2 a + b #5+2=7 +加法,就是相加的意思 7 a - b #5-2=3 -减法,就是相减的意思 3 a * b #5*2=10 *乘法,相乘的意思 10 a / b #5/2=2.5 /除法,相除的意思 2.5 a // b #5//2=2 //地板除法,两数相除之后如果是浮点型,就是有小数点的类型,取消小数点后的数字,取整数 2 a % b #5%2=1 %取余数,5除以2等于2余数1,所以%的意思是取余数 1 a ** b #5**2=25 #幂运算,5**2相当于2个5相乘,5的次方的意思 25 "H" * 10 #字符串也可以用*来打印 'HHHHHHHHHH' "willam" * 10 'willamwillamwillamwillamwillamwillamwillamwillamwillamwillam' View Code 12:print一次性输出多个变量的值 比如:我们定义name、age、addr的变量,然后使用一条print输出三个变量的值 #第一个办法 name = "willam" age = 18 addr = "河南" print("姓名是:%s","年龄是:%d","地址是:%s"%(name,age,addr)) #里面有几个百分号,就要在后面写几个变量 #第二个办法 name = "willam" age = 18 addr = "河南" print(name,age,addr) View Code 解释: 除了有%s和%d的格式化符,还有其他的吗,如果有其他的需要按照下面的进行操作。
因为Python是跨平台的,它可以运行在Windows、Mac和各种Linux/Unix系统上。在Windows上写Python程序,放到Linux上也是能够运行的。 具体方法,Please 百度。
2022年10月