CentOS 7安装网站环境,以及远程连接MariaDB

vps安装了CentOS 7系统,需要安装网站环境,包括php7+Apache+MariaDB,以及远程连接MariaDB。

一、准备部分

首先我们需要先打开默认的80端口,然后重启防火墙:

firewall-cmd –zone=public –add-port=80/tcp –permanent

systemctl restart firewalld.service

接下来,更新源中的软件:

yum update

到此,准备工作完成。

二、安装Apache

yum install httpd httpd-devel

一条命令就搞定了。

还有几条相关的命令需要注意,特别是开机自启动,一定要记得设置。

systemctl start httpd.service #启动apache

systemctl stop httpd.service #停止apache

systemctl restart httpd.service #重启apache

systemctl enable httpd.service #设置apache开机启动

启动Apache服务器,之前已经开启80端口,直接访问ip地址,成功显示如下:

未分类

三、安装数据库

Centos7中已经使用MariaDB替代MySQL,原因是MySQL已经被甲骨文收购,存在闭源的风险,所以作为开源的系统,为了避免不必要的麻烦,开始使用MariaDB。用户不必担心MariaDB没用过不会用的尴尬,MariaDB数据库基本上可以做到无缝兼容MySQL。下面开始安装MariaDB数据库:

yum install mariadb-server

MariaDB数据库默认root密码为空,安全起见,我们给root设置一个密码:

systemctl start mariadb.service

/usr/bin/mysql_secure_installation

接下来,将通过问答的形式进行安全设置。

首先,需要输入当前的root密码:

Enter current password for root (enter for none):

初次使用,默认密码为空,直接回车下一步。

Set root password? [Y/n]

顾名思义,设置root密码,y表示yes,n表示no,默认yes,所以可以直接回车,然后提示我们设置密码,和确认密码,输入两次即可。一定要记得自己设置的密码。

接下来,还有一些其他设置。

Remove anonymous users? [Y/n]

是否禁止匿名用户,默认选项是yes,建议默认设置,回车继续。

Disallow root login remotely? [Y/n]

是否禁止root用户远程登录。如果只在本机内访问MariaDB,建议默认设置,回车继续。如果还需要其他云主机,或者还需要使用数据库远程连接软件进行连接,则需要选择n。

Remove test database and access to it? [Y/n]

是否删除测试数据库和权限。建议默认设置,回车继续。

Reload privilege tables now? [Y/n]

是否重新加载权限表,建议默认设置,回车继续。

到此,数据库安装完成,最后一步,设置开机启动:

systemctl enable mariadb

可能会用到的一些命令:

systemctl start mariadb.service #启动MariaDB

systemctl stop mariadb.service #停止MariaDB

systemctl restart mariadb.service #重启MariaDB

systemctl enable mariadb.service #设置开机启动

四、安装PHP

虽然PHP7已经发布很久了,性能上进步很大,所以我们选择安装PHP7。

rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm   –force –nodeps

yum install php70w

还需要安装一些扩展:

yum install php70w-mysql php70w-gd php70w-imap php70w-ldap php70w-odbc php70w-pear php70w-xml php70w-xmlrpc php70w-mbstring php70w-devel

安装完成!接下来进行测试。

vi /var/www/html/test.php

打开test.php文件,如果没有会自动创建一个,按i字母进入编辑模式,输入下面的内容:

<?php

phpinfo();

?>

编辑完,按Esc键退出编辑模式,并输入:wq,敲击回车保存并退出。

然后打开浏览器,输入:你的ip/test.php,看看是否显示PHP的相关信息。

如果没有成功访问,可以试试重启Apache试试。

五、远程连接MariaDB数据库

我个人习惯用navicat管理数据库,所以需要远程连接数据库,前面数据库相关设置中有一项“是否禁止root用户远程登录”,如果像我一样有这个需要,那么就需要选择n。

仅仅是选择n还是不够的,因为我们还需要给数据库开放一个端口,一般我们默认的端口是3306,按照之前开放80端口,我们再开放一个3306端口给数据库,然后再重启防火墙:

firewall-cmd –zone=public –add-port=3306/tcp –permanent

systemctl restart firewalld.service

至此,所有安装设置都完成了。

CentOS 7搭建LAMP (非一键安装)

因为工作原因需要搭建一个zabbix服务器用来做监控,而zabbix是需要lamp或lnmp环境的。
现在网上一键搞定lamp/lnmp的教程很多,用起来也真的很方便,但是对于初学linux的人(比如说我)就有点儿云里雾里,不知道究竟做了什么?有点儿像windows下你安装一个软件只需要下一步下一步就可以了。
虽然便捷,但不适合新手去操作,一步一步的安装并成功才是真的有成就感,这也是学习的原动力。
废话不多说,网上各种各样的资料也很齐全,只把自己验证过的步骤写出来,能帮到大家最好,也可以给自己写下一备忘文档。

LAMP顾名思义就是Linux Apache Mysql PHP的缩写。
英文版原帖在此:https://www.howtoforge.com/apache_php_mysql_on_centos_7_lamp
有兴趣的朋友可以去看一下。

环境:CentOS 7

未分类

废话不多说,开干!

一、安装CentOS7, 少侠先把你的Linux装起来,LAMP的第一步。

(本次安装都在root权限下进行!!!)

二、安装Apache

1、yum的方式安装:

#yum -y install httpd

2、开启Apache服务:

#systemctl start httpd.service

3、设置Apache服务开机启动

#systemctl enable httpd.service

4、验证Apache服务是否安装成功。
在本机浏览器中输入地址IP地址,ip地址的查看方式

#ifconfig

如果你是用ssh的方式连接你的linux,而服务器在同一个局域网的情况下无法访问,那么请把CentOS的Firewall关闭或打开80和443端口。

#firewall-cmd --permanent --zone=public --add-service=http
#firewall-cmd --permanent --zone=public --add-service=https
#firewall-cmd --reload

此时Apache应该已经可以访问了,如果看到Apache默认页面 有Testing123….字样的话就是安装成功了。

未分类

三、安装PHP

1、安装

#yum -y install php

2、重启Apache服务

#systemctl restart httpd

然后写一个php文件在浏览器中运行一下

#vi /var/www/html/info.php

这是一个新建的php文件,按“i“ 插入以下内容

<?php phpinfo(); ?>

按ECS

:wq

保存退出
然后,在自己电脑浏览器中输入192.168.2.112/info.php
运行后会出现php的一些信息。

未分类

四、安装MySQL

MySQL在CentOS 7里是Mariadb。

1、安装

#yum -y install mariadb*

(这里我看到的教程是不加*的,所以导致我卡在这里卡了好久,有一些相关的东西没有安装上,我在后面的步骤中无法进行下去,后来排错半天加上星号之后问题解决。)

2、开启MySQL服务并设置开机启动

#systemctl start mariadb.service
#systemctl enable mariadb.service

未分类

3、设置root账户的密码

#mysql_secure_installation

这里会跳出一段英文,英文好的同学可以仔细的阅读以下,如果懒得读久在提示出来后按Enter就好了,设置密码时输入自己想设置的密码就可以,然后继续再让你选择y/n时,Enter就好。

未分类

当一切结束的时候,输入#mysql -uroot -p的方式验证一下。

未分类

未分类

五、将PHP和MySQL关联起来

#yum search php

未分类

选择你需要的安装:

#yum -y install php-mysql

未分类

六、安装常用的PHP模块。

包括GD库,Curl,mbstring等等…..

#yum -y install php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel

然后重启Apach服务

#systemctl restart httpd.service

然后,再次再浏览器中运行info.php。你会看到安装的模块的信息,这就表示你的LAMP就搭建好了。

未分类

至此,完毕。

Grafana 4.x 安装部署(CentOS 7)

一、前言

本篇适用范围

  • CentOS 7+
  • InfluxDB 4.x

环境信息

  • CentOS 7
  • InfluxDB 4.6.3

二、安装

  • 安装
sudo yum install https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.6.3-1.x86_64.rpm
  • 启动服务并设置为开机启动
#启动Grafana服务
sudo systemctl start grafana-server
sudo systemctl status grafana-server

#将Grafana服务设置为开机启动
sudo systemctl enable grafana-server
  • 防火墙配置
#开放端口
firewall-cmd --add-port=3000/tcp --permanent

#重载防火墙配置
firewall-cmd --reload
  • 访问测试
http://<ip>:3000

如果出现登录页面则正常。

未分类

默认管理账号;admin,密码:admin

三、备注

  • 延伸阅读

Grafana + InfluxDB数据源以及曲线图表仪表盘配置:https://ken.io/note/grafana-quickstart-influxdb-datasource-graph

  • 本文参考

http://docs.grafana.org/installation/rpm/

CentOS 7,使用yum安装Nginx

当使用以下命令安装Nginx时,发现无法安装成功

yum install -y nginx

需要做一点处理。

安装Nginx源

执行以下命令:

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装该rpm后,我们就能在/etc/yum.repos.d/ 目录中看到一个名为nginx.repo 的文件。

安装Nginx

安装完Nginx源后,就可以正式安装Nginx了。

yum install -y nginx

Nginx默认目录

输入命令:

whereis nginx

即可看到类似于如下的内容:

nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx

以下是Nginx的默认路径:

(1) Nginx配置路径:/etc/nginx/
(2) PID目录:/var/run/nginx.pid
(3) 错误日志:/var/log/nginx/error.log
(4) 访问日志:/var/log/nginx/access.log
(5) 默认站点目录:/usr/share/nginx/html

事实上,只需知道Nginx配置路径,其他路径均可在/etc/nginx/nginx.conf 以及/etc/nginx/conf.d/default.conf 中查询到。

常用命令

(1) 启动:

nginx

(2) 测试Nginx配置是否正确:

nginx -t

(3) 优雅重启:

nginx -s reload

(4) 查看nginx的进程号:

ps -ef |grep nginx

(5)nginx服务停止

nginx -s stop
kill -9 pid

当然,Nginx也可以编译源码安装,步骤相对要繁琐一些,总的来说,还是比较简单的,本文不作赘述

CentOS 6/7升级最新内核并开启Google BBR

Google BBR是一款TCP加速工具,但要求Linux内核必须大于4.9,之前分享过文章 https://www.xiaoz.me/archives/7945 ,这个方法虽然方便,但是发现在Raksmart上升级失败了,于是尝试手动升级内核。

未分类

CentOS 7升级最新内核

#导入ELRepo 公钥
wget https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm --import RPM-GPG-KEY-elrepo.org
#安装ELRepo
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#升级最新内核
yum --enablerepo=elrepo-kernel install kernel-ml -y

内核升级完成后老的内核和新的会同时存在,CentOS 7 使用grub2引导程序,需要将最新内核优先级调整最高。先输入命令cat /boot/grub2/grub.cfg|grep menuentry查找所有内核,并找出最新内核的全名,并记录下来,如下截图。

未分类

#设置最新内核(请输入上面查询到的最新内核)
grub2-set-default "CentOS Linux (4.14.14-1.el7.elrepo.x86_64) 7 (Core)"
#设置完毕后,输入下面的命令查看是否成功
grub2-editenv list
[root@test2018119 ~]# grub2-editenv list
saved_entry=CentOS Linux (4.14.14-1.el7.elrepo.x86_64) 7 (Core)
#ok,没问题重启服务器生效
reboot

CentOS 6升级最新内核

#导入ELRepo 公钥
wget https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm --import RPM-GPG-KEY-elrepo.org
#安装ELRepo
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
#升级最新内核
yum --enablerepo=elrepo-kernel install kernel-ml -y

升级完毕后修改/etc/grub.conf将default=0修改为default=1,然后reboot重启服务器。

查看内核是否升级成功

输入uname -r可查看当前内核,如果大于4.9说明已经成功了,如果操作后发现你系统网络不通了,估计是升级失败挂掉了,这种情况只能从VNC控制台进入,参照上面的方式修改为原来老的内核启动。

#内核大于4.9
[root@test2018119 ~]# uname -r
4.14.14-1.el7.elrepo.x86_64

开启BBR

直接复制下面的命令即可:

#修改配置
cat >>/etc/sysctl.conf << EOF
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF
#使配置生效
sysctl -p

输入下面的命令来检测,如果看到返回的结果包含bbr 说明成功了,如下截图。

[root@test2018119 ~]# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = bbr cubic reno
[root@test2018119 ~]# lsmod | grep bbr
tcp_bbr                20480  0 

总结

优先推荐使用秋水逸冰的一键脚本升级内核 https://www.xiaoz.me/archives/7945 ,如果失败了可以尝试上述方法手动升级。此方法适用于KVM/XEN虚拟化,OpenVZ虚拟化VPS请不要操作,一般不会成功,建议不要在生产环境操作,以免出现异常。

CentOS上zookeeper集群模式安装

本篇介绍在四个节点的集群中搭建zookeeper环境,zookeeper可配置三种模式运行:单机模式,伪集群模式,集群模式,本文使用集群模式搭建。

安装环境

  • 虚拟机:VMware Workstation 12 Player
  • Linux版本:CentOS release 6.4 (Final)
  • zookeeper版本:zookeeper-3.4.5-cdh5.7.6.tar.gz

  • 集群节点:

    • master:192.168.137.11 内存1G
    • slave1:192.168.137.12 内存512M
    • slave2:192.168.137.13 内存512M
    • slave3:192.168.137.14 内存512M
  • 前提:java已安装,已配置ssh免密登录,停掉防火墙等。

上传安装包

将下载的zookeeper-3.4.5-cdh5.7.6.tar.gz安装包上传到CentOS指定目录,例如/opt。
上传方法很多,这里在SecureCRT用rz命令。

解压缩安装包:

tar -zxf zookeeper-3.4.5-cdh5.7.6.tar.gz

重命名文件夹:

mv zookeeper-3.4.5-cdh5.7.6 zookeeper

修改配置文件

配置文件在安装目录conf文件夹下的zoo_sample.cfg,需要先复制一个并且改文件名:

[root@master conf]# pwd
/opt/zookeeper/conf
[root@master conf]# cp zoo_sample.cfg zoo.cfg
[root@master conf]# ll
total 16
-rw-rw-r--. 1 root root  535 Feb 22  2017 configuration.xsl
-rw-rw-r--. 1 root root 2693 Feb 22  2017 log4j.properties
-rw-r--r--. 1 root root  808 Jan 23 10:06 zoo.cfg
-rw-rw-r--. 1 root root  808 Feb 22  2017 zoo_sample.cfg

修改zoo.cfg配置文件:

tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/opt/zookeeper/tmp
# the port at which the clients will connect
clientPort=2181
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
dataLogDir=/opt/zookeeper/logs
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server.4=slave3:2888:3888

参数说明:

  • tickTime: zookeeper中使用的基本时间单位, 毫秒值.
  • dataDir: 数据目录. 可以是任意目录.
  • dataLogDir: log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和dataDir相同的设置.
  • clientPort: 监听client连接的端口号.
  • initLimit: zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower. initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s.
  • syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime, 即4000ms.
  • server.X=A:B:C 其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交换消息所使用的端口. C配置选举leader时所使用的端口.

由于我们修改了dataDir目录,在zookeeper目录中创建一个文件夹用于后面创建myid文件:

mkdir /opt/zookeeper/tmp

mkdir /opt/zookeeper/logs

复制安装包到其他节点

将zookeeper文件夹复制到其他三个服务器上:

scp -r /opt/zookeeper/ root@slave1:/opt
scp -r /opt/zookeeper/ root@slave2:/opt
scp -r /opt/zookeeper/ root@slave3:/opt

在master节点上用一下命令给每个节点上创建myid文件,文件中的id号与zoo.cfg配置文件中的对应:

[root@master zookeeper]# echo 1 > /opt/zookeeper/tmp/myid
[root@master zookeeper]# ssh slave1 "echo 2 > /opt/zookeeper/tmp/myid"
[root@master zookeeper]# ssh slave2 "echo 3 > /opt/zookeeper/tmp/myid"
[root@master zookeeper]# ssh slave3 "echo 4 > /opt/zookeeper/tmp/myid"

运行启动

由于没有配置环境变量,需要用全路径执行:

[root@master zookeeper]# /opt/zookeeper/bin/zkServer.sh start
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

其实配置文件中修改dataLogDir的本意是想让启动日志输出到配置的文件夹里,但是好像并没有,日志文件zookeeper.out还是在zookeeper的安装目录下生成。

查看zookeeper.out文件发现有错误:

2018-01-23 10:48:35,470 [myid:] - INFO  [main:QuorumPeerConfig@101] - Reading configuration from: /opt/zookeeper/bin/../conf/zoo.cfg
2018-01-23 10:48:35,484 [myid:] - WARN  [main:QuorumPeerConfig@290] - Non-optimial configuration, consider an odd number of servers.
2018-01-23 10:48:35,484 [myid:] - INFO  [main:QuorumPeerConfig@334] - Defaulting to majority quorums
2018-01-23 10:48:35,512 [myid:4] - INFO  [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3
2018-01-23 10:48:35,513 [myid:4] - INFO  [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0
2018-01-23 10:48:35,513 [myid:4] - INFO  [main:DatadirCleanupManager@101] - Purge task is not scheduled.
2018-01-23 10:48:35,536 [myid:4] - INFO  [main:QuorumPeerMain@132] - Starting quorum peer
2018-01-23 10:48:35,587 [myid:4] - INFO  [main:NIOServerCnxnFactory@94] - binding to port 0.0.0.0/0.0.0.0:2181
2018-01-23 10:48:35,611 [myid:4] - INFO  [main:QuorumPeer@913] - tickTime set to 2000
2018-01-23 10:48:35,612 [myid:4] - INFO  [main:QuorumPeer@933] - minSessionTimeout set to -1
2018-01-23 10:48:35,612 [myid:4] - INFO  [main:QuorumPeer@944] - maxSessionTimeout set to -1
2018-01-23 10:48:35,612 [myid:4] - INFO  [main:QuorumPeer@959] - initLimit set to 10
2018-01-23 10:48:35,639 [myid:4] - INFO  [main:QuorumPeer@429] - currentEpoch not found! Creating with a reasonable default of 0. This should only happen when you are upgrading your installation
2018-01-23 10:48:35,643 [myid:4] - INFO  [main:QuorumPeer@444] - acceptedEpoch not found! Creating with a reasonable default of 0. This should only happen when you are upgrading your installation
2018-01-23 10:48:35,652 [myid:4] - INFO  [Thread-1:QuorumCnxManager$Listener@486] - My election bind port: 0.0.0.0/0.0.0.0:3888
2018-01-23 10:48:35,674 [myid:4] - INFO  [QuorumPeer[myid=4]/0:0:0:0:0:0:0:0:2181:QuorumPeer@670] - LOOKING
2018-01-23 10:48:35,679 [myid:4] - INFO  [QuorumPeer[myid=4]/0:0:0:0:0:0:0:0:2181:FastLeaderElection@740] - New election. My id =  4, proposed zxid=0x0
2018-01-23 10:48:35,692 [myid:4] - INFO  [slave3/192.168.137.14:3888:QuorumCnxManager$Listener@493] - Received connection request /192.168.137.11:34491
2018-01-23 10:48:35,704 [myid:4] - INFO  [WorkerReceiver[myid=4]:FastLeaderElection@542] - Notification: 4 (n.leader), 0x0 (n.zxid), 0x1 (n.round), LOOKING (n.state), 4 (n.sid), 0x0 (n.peerEPoch), LOOKING (my state)
2018-01-23 10:48:35,706 [myid:4] - WARN  [WorkerSender[myid=4]:QuorumCnxManager@368] - Cannot open channel to 2 at election address slave1/192.168.137.12:3888
java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:354)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:327)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:393)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:365)
    at java.lang.Thread.run(Thread.java:748)

提示Connection refused的异常,其实一开始先不急着百度这个问题,其实要所有节点上都启动zookeeper后再看看运行状态,现在查看运行状态都是没运行的,也找不到相应的进程:

[root@master zookeeper]# /opt/zookeeper/bin/zkServer.sh start
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@master zookeeper]# /opt/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.

到其他节点服务器上都启动zookeeper,过一会儿后每个服务器查看状态:

[root@master zookeeper]# /opt/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@master zookeeper]# jps
5488 QuorumPeerMain
5539 Jps

如果有Mode和QuorumPeerMain,就说明已经启动成功了。

如果要关闭zookeeper,需要在每个节点上执行:

/opt/zookeeper/bin/zkServer.sh stop

另外如果使用如下命令启动,就会在启动时输出日志信息:

/opt/zookeeper/bin/zkServer.sh start-foreground

批量启动和关闭

一台一台服务器去执行命令有点麻烦,写一个脚本批量执行:

#!/bin/bash
#下面变量修改zookeeper安装目录
zooHome=/opt/zookeeper
if  [ $1 != ""  ]
    then
        confFile=$zooHome/conf/zoo.cfg
        slaves=$(cat "$confFile" | sed '/^server/!d;s/^.*=//;s/:.*$//g;/^$/d')
        for salve in $slaves ; do
            ssh $salve "$zooHome/bin/zkServer.sh $1"
        done
    else
        echo "parameter empty! parameter:start|stop"
fi

将上面脚本保存为zooManager文件,调用执行:

sh zooManager start

sh zooManager stop
[root@master opt]# sh zooManager start
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

由于所有服务器节点都是使用root用户,所以没有考虑权限问题,实际情况要考虑的。

参考:http://coolxing.iteye.com/blog/1871009

CentOS 7 卸载home 扩大root空间

背景:检查gitlab备份服务器时,发现最近几天的备份文件没有根据设置上传到这台服务器。

由于这台服务器较新,除了接收的备份文件外并没有部署其他文件,所以最先可以排除inode不够的可能,但是备份文件大概也就40G+,这个服务器明明分配了100G的空间。

于是我在gitlab所在的服务器上,手动运行一次备份文件命令后,出现了“No space left on device”。

未分类

空间不足?于是我在备份服务器上查看空间占用。

df -h

未分类

发现虽然给了这个CentOS100G的磁盘空间,但root只有50G的可用空间,剩下的空间大都分配给了/home。

查找资料后了解到,centos7默认的root大小为50G,也就是说如果硬件分配时超过50G,大部分剩余空间都会分配给home。

软件如果装在/usr/local目录下,并且data等数据文件也配置在root下,则必须在装机后调整root的大小,否则运行一段时间后很容易导致磁盘空间不足。

看来这样的确是磁盘空间不足引发了这次问题,反正这台虚拟机里我并不需要安装什么服务,如果可以将home去掉,再将空间都给root就解决问题了。于是我查找资料后根据实际情况整理了这篇解决方案。

一、卸载home

1.1 备份home分区文件

tar cvf /tmp/home.tar /home

1.2 修改fstab(这一步非常重要,千万不要漏了)

准备卸载/home文件系统,centos启动时会对/etc/fstab的内容逐一检测,由于fstab默认有/home,如果不修改fstab,重启之后会发现centos跪了。

未分类

未分类

所以卸载之前,要先注释掉/home,不让系统开机检测/home。

yum install -y vim
vim /etc/fstab

对于/home的内容增加注释符,wq保存。

#/dev/mapper/centos-home /home                   xfs     defaults        0 0

1.3 安装psmisc

yum install -y psmisc

//Psmisc软件包包含三个帮助管理/proc目录的程序,安装下列程序: fuser、 killall、pstree和pstree.x11(到pstree的链接)

//fuser 显示使用指定文件或者文件系统的进程的PID。

//killall 杀死某个名字的进程,它向运行指定命令的所有进程发出信号。

//pstree 树型显示当前运行的进程。

//pstree.x11 与pstree功能相同,只是在退出前需要确认。

1.4 卸载/home文件系统

umount /home

如果提示无法卸载,是因为有进程占用/home,可以用下面的命令来停止占用的进程。

fuser -km /home/

1.5 删除/home所在的lv

lvremove /dev/mapper/centos-home

接着会出现确认的内容,输入“y”,回车。

未分类

二、扩大root

2.1 扩展/root所在的lv

由于之前/home占用了47G的空间,故我考虑将这些空间都加到/root里。

lvextend -L +47G /dev/mapper/centos-root

未分类

可是发现可用的空间并不是47G,应该是系统四舍五入了,减小一点换成48100MB。

这里说明,不去精确设置可用空间的原因是:我自己对如何获取可用空间的方法并不了解,与其花时间去了解这一块,我宁可浪费一点空间(毕竟几十MB的机械硬盘不值多少钱,即使是企业级硬盘)。

lvextend -L +48100M /dev/mapper/centos-root

未分类

出现下面的内容,说明/root所在的lv已经成功拓展成了96.97GB。

2.2 扩展/root文件系统

xfs_growfs /dev/mapper/centos-root

未分类

图中的13107200、25420800根据文件大小换算了下,和50G、97G都不符合,这个问题先搁置下,以后查资料看看。

2.3 检查/root文件系统的空间

df -h

未分类

可以发现/root从原来的50G提升到了97G。

在CentOS上安装Python3的三种方法

未分类

Centos7默认自带了Python2.7版本,但是因为项目需要使用Python3.x你可以按照此文的三个方法进行安装.

注:本文示例安装版本为Python3.5,

一、Python源代码编译安装

安装必要工具 yum-utils ,它的功能是管理repository及扩展包的工具 (主要是针对repository)

$ sudo yum install yum-utils

使用yum-builddep为Python3构建环境,安装缺失的软件依赖,使用下面的命令会自动处理.

$ sudo yum-builddep python

完成后下载Python3的源码包(笔者以Python3.5为例),Python源码包目录: https://www.python.org/ftp/python/ ,截至发博当日Python3的最新版本为 3.7.0

$ curl -O https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz

最后一步,编译安装Python3,默认的安装目录是 /usr/local 如果你要改成其他目录可以在编译(make)前使用 configure 命令后面追加参数 “–prefix=/alternative/path” 来完成修改。

$ tar xf Python-3.5.0.tgz
$ cd Python-3.5.0
$ ./configure
$ make
$ sudo make install

至此你已经在你的CentOS系统中成功安装了python3、pip3、setuptools,查看python版本

$ python3 -V

如果你要使用Python3作为python的默认版本,你需要修改一下 bashrc 文件,增加一行alias参数

alias python='/usr/local/bin/python3.5'

由于CentOS 7建议不要动/etc/bashrc文件,而是把用户自定义的配置放入/etc/profile.d/目录中,具体方法为

vi /etc/profile.d/python.sh

输入alias参数 alias python=’/usr/local/bin/python3.5’,保存退出

如果非root用户创建的文件需要注意设置权限

chmod 755 /etc/profile.d/python.sh

重启会话使配置生效

source /etc/profile.d/python.sh

二、从EPEL仓库安装

最新的EPEL 7仓库提供了Python3(python 3.4)的安装源,如果你使用CentOS7或更新的版本的系统你也可以按照下面的步骤很轻松的从EPEL仓库安装。

安装最新版本的EPEL

$ sudo yum install epel-release

用yum安装python 3.4:

$ sudo yum install python34

注意:上面的安装方法并未安装pip和setuptools,如果你要安装这两个库可以使用下面的命令:

$ curl -O https://bootstrap.pypa.io/get-pip.py
$ sudo /usr/bin/python3.4 get-pip.py

三、从SCL(Software Collections)仓库安装

最后一种方法是通过Software Collections (SCL) repository来安装,需要注意的是SCL仓库仅支持CentOS 6.5以上版本,最新版的SCL提供了Python3.3版本,具体安装步骤:

$ sudo yum install python33

从SCL中使用python3,你需要一行命令来启用Python3:

$ scl enable python33 <command>

您还可以使用Python编译器来调用一个bash shell:

$ scl enable python33 bash

总结

笔者建议使用前两种方法,老司机使用方法一编译安装;新手使用方法二yum二进制安装,简单方便。

ansible工具之playbook

playbook简介

主要功能:将分组主机按照定义好的playbook执行。
play:定义好的角色task,task一般为ansible的模块。
playbook:将多个play组合在一起,就是playbook
playbook采用yaml语言编写,遵循yaml语法格式。

YAML介绍:

    YAML是一个可读性高的用来表达资料序列的格式。
    YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。
    Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者

YAML特性:

    - YAML的可读性好
    - YAML和脚本语言的交互性好
    - YAML使用实现语言的数据类型
    - YAML有一个一致的信息模型
    - YAML易于实现
    - YAML可以基于流来处理
    - YAML表达能力强,扩展性好

YAML语法:

    - 在单一档案中,可用连续三个连字号(---)区分多个档案。另外,还有选择性的连续三个点号( ... )用来表示档案结尾
    - 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
    - 使用#号注释代码
    - 缩进必须是统一的,不能空格和tab混用
    - 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
    - YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感
    - k/v的值可同行写也可换行写。同行使用:分隔
    - v可是个字符串,也可是另一个列表
    - 一个完整的代码块功能需最少元素需包括 name: task
    - 一个name只能包括一个task
    - YAML文件扩展名通常为yml或yaml
    - Dictionary:字典,通常由多个key与value构成,也可以将key:value 放置于{}中进行表示,用,分隔多个 key:value

playbook基础组件

Hosts:用于指定要执行指定任务的主机,须事先定义在主机清单中。

示例:

- hosts: websrvs:dbsrvs

remote_user:执行身份

(1)可用于Host和task中。
(2)通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务。
(3)可以在sudo时使用sudo_user指定sudo时切换的用户

示例:

- hosts: websrvs
  remote_user: root
  tasks:
   - name: test connection
     ping:
     remote_user: fz.hou
     sudo: yes     默认sudo为root
     sudo_user:fl  sudo为fl

task:任务列表

格式:
(1) action: module arguments
(2) module: arguments 建议使用
注意:shell和command模块后面跟命令,而非key=value
示例:

tasks:
 - name: disable selinux
   command: /sbin/setenforce 0

notify与handlers:
某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers,继而执行handlers之后的命令。

tags:标签
任务可以通过”tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用
注意:如果多个任务标签相同,标签被调用时,任务都会被执行。

示例:安装httpd,修改httpd配置文件,并重启服务。

- hosts: webservers
  remote_user: root

  tasks:
    - name: install httpd
      yum: name=httpd
    - name: modify config
      copy: src=~/httpd.conf dest=/etc/httpd/conf/httpd.conf
      tags: modify
      notify: restart httpd
    - name: start httpd
      service: name=httpd state=started enabled=yes

  handlers:
    - name: restart httpd
      service: name=httpd state=restarted

示例结果:

未分类

注意:如果命令或脚本的退出码不为零,可以使用如下方式替代:

tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand || /bin/true

或者使用ignore_errors来忽略错误信息:

tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand
    ignore_errors: True

运行playbook

运行playbook的方式

ansible-playbook <filename.yml> ... [options]

常见选项
–check 只检测可能会发生的改变,但不真正执行操作
–list-hosts 列出运行任务的主机
–limit 主机列表 只针对主机列表中的主机执行
-v 显示过程 -vv -vvv 更详细

playbook变量

变量名:仅能由字母、数字和下划线组成,且只能以字母开头
变量来源:

1、ansible setup facts 远程主机的所有变量都可直接调用

示例:

ansible myhosts -m setup -a 'filter=ansible_nodename'

filter是用来匹配后面的字符串,可以使用正则表达式。
也可以使用grep过滤,-C选项查看上下文三行。

示例结果:

未分类

2、在/etc/ansible/hosts中定义

普通变量:主机组中主机单独定义,优先级高于公共变量
公共(组)变量:针对主机组中所有主机定义统一变量
普通变量示例:在/etc/ansible/hosts文件中定义

[myhosts]
172.18.18.22 http_port=85 hname=nginx
172.18.18.23 http_port=86 hname=httpd

编写playbook:

cat /root/ansible/vars4.yml

  ---
  - hosts: myhosts
    remote_user: root

    tasks:
     - name: set hostname
       hostname: name={{ hname }}-{{ http_port }}

示例结果:

未分类

公共(组)变量示例:在/etc/ansible/hosts文件中定义

[myhosts:vars]
myh=HFZ

编写playbook:

cat /root/ansible/vars5.yml

  ---
  - hosts: myhosts
    remote_user: root

    tasks:
     - name: set hostname
       hostname: name={{ myh }}-{{ hname }}-{{ http_port }}

示例结果:

未分类

3、通过命令行指定变量,优先级最高

ansible-playbook –e varname=value

示例:

cat /root/ansible/vars.yml

  ---
  - hosts: myhosts
    remote_user: root

    tasks:
     - name: install package
       yum: name={{ pkname }}

示例结果:

未分类

4、在playbook中定义

示例:

cat cat vars2.yml

  ---
  - hosts: myhosts
    remote_user: root
    vars:
     - username: user1
     - groupname: group1

    tasks:
     - name: create group
       group: name={{ groupname }} state=present
     - name: create user
       user: name={{ username }} group{{ groupname }} home=/home/{{ username }}dir

示例结果:

未分类

5、可以在文件中定义变量,并在playbook中调用文件。

示例:在vars.yml文件中定义变量

hi: hello
wd: world

编写playbook:

- hosts: myhosts
  remote_user: root
  vars_files:
   - vars.yml

  tasks:
   - name: create file
     file: name=/root/{{ hi }}-{{ wd }}.log state=touch

示例结果:

未分类

6、在role中定义

playbook中的templates模板

templates特点:

基于Jinja2语言的文本文件,嵌套有脚本。

templates功能:

根据模块文件动态生成对应的配置文件

templates格式:

templates文件必须存放于templates目录下,且命名为 .j2 结尾。

yaml/yml 文件需和templates目录平级,目录结构如下:

./
 ├── temnginx.yml
 └── templates
   └── nginx.conf.j2

Jinja2语言:

使用字面量:

    字符串:使用单引号或双引号
    数字:整数,浮点数
    列表:[item1, item2, ...]
    元组:(item1, item2, ...)
    字典:{key1:value1, key2:value2, ...}
    布尔型:true/false
算术运算:+, -, *, /, //, %, **
比较操作:==, !=, >, >=, <, <=
逻辑运算:and, or, not
流表达式:for、if、when

示例:在centos6与centos7主机上安装httpd服务,并修改相应配置文件。

1、创建文件夹

mkdir ~/ansible/templats -pv

2、拷贝centos6与centos7主机上的httpd配置文件到主机。并修改文件名

ansible myhosts -m fetch -a 'src=/etc/httpd/conf/httpd.conf dest=~/ansible/'

3、复制文件到templats文件夹下并修改文件名,修改文件内容

mv ~/ansible/172.18.18.22/httpd.conf ~/ansible/templats/httpd-7.conf.j2
mv ~/ansible/172.18.18.22/httpd.conf ~/ansible/templats/httpd-6.conf.j2

4、编写playbook,注意httpd.yml与templats文件夹同级

cat httpd.yml 
    - hosts: myhosts
      remote_user: root

      tasks:
        - name: install httpd
          yum: name=httpd

        - name: templates-7
          template: src=httpd-7.conf.j2 dest=/etc/httpd/conf/httpd.conf
          when: ansible_distribution_major_version == "7"
          notify: restart httpd
          tags: conf

        - name: templates-6
          template: src=httpd-6.conf.j2 dest=/etc/httpd/conf/httpd.conf
          when: ansible_distribution_major_version == "6"
          notify: restart httpd
          tags: conf

        - name: start httpd
          service: name=httpd state=started

      handlers:
         - name: restart httpd
           service: name=httpd state=restarted

示例演示:

未分类

playbook迭代

迭代:当有需要重复性执行的任务时,可以使用迭代机制
对迭代项的引用,固定变量名为”item”
要在task中使用with_items给定要迭代的元素列表
列表格式:
字符串
字典

示例:创建固定组,并把新建用户加入到固定组中。

cat items.yml:
    - hosts: myhosts
      remote_user: root

      tasks: 
        - name: create groups
          group: name={{item}}
          with_items:
            - itemgroup1
            - itemgroup2
            - itemgroup3
        - name: create users
          user: name={{item.username}} group={{item.groupname}}
          with_items:
            - {username: 'testuser1',groupname: 'itemgroup1'}
            - {username: 'testuser2',groupname: 'itemgroup2'}
            - {username: 'testuser3',groupname: 'itemgroup3'}

示例结果:

未分类

playbook中template for if

示例:利用for-if和templates编写playbook

cat for-if.yml 
    - hosts: myhosts
      remote_user: root
      vars:
        hosts:
          - {listen_prot: 8080,web: nginx1,name: web1.fz.com}
          - {listen_prot: 8081,web: nginx2,name: web2.fz.com}
          - {listen_prot: 8082,web: nginx3}

      tasks:
        - name: for-if
          template: src=for-if.j2 dest=/root/for-if

cat templates/for-if.j2
    {% for host in hosts %}
    server{
            listen: {{host.listen_prot}};
    {%if host.name is defined%}
            name: {{host.name}};
    {%endif%}
            web: {{host.web}};
    }
    {%endfor%}

示例结果:

未分类

playbook加密

    - ansible-vault:管理加密解密yml文件
    - ansible-vault encrypt hello.yml 加密
    - ansible-vault decrypt hello.yml 解密
    - ansible-vault view hello.yml 查看
    - ansible-vault edit hello.yml 编辑加密文件
    - ansible-vault rekey hello.yml 修改口令
    - ansible-vault create new.yml 创建新文件

Centos 7 快速安装FTP服务

ftp的服务名称是vsftpd

查看有无安装

ps -ef | grep vsftpd

未分类

出现上图返回的信息表示没有安装ftp

安装vsftpd

yum install vsftpd -y # -y表示确认同意安装

未分类

关闭匿名登录

vi /etc/vsftpd/vsftpd.conf

找到anonymous_enable设置为NO,然后按Esc,输入:wq保存退出

未分类

开启服务

systemctl start vsftpd

查看服务是否开启

ps -ef | grep vsftpd # 查看服务是否开启

未分类

设置开机自启

systemctl is-enabled vsftpd # 查看是否为开机自启
systemctl enable vsftpd # 设置开机自启
systemctl is-enabled vsftpd # 成功后你会看到返回enabled

未分类