一、回顾
1、mysql和python
1. mysql5.7
1.1 不需要执行mysql_ssl_rsa_setup
1.2 Change_master_to. 不需要get public key
2. 可以使用pymysql非交互的管理mysql
2.1 conn=pymysql.connect(host,user,password,database,port)
2.2 cursor=conn.cursor()
2.3 cursor.execute("create user...")
2.4 cursor.execute("grant 权限 on 库.表 to 用户")
2.5 conn.commit()
2.6 cursor.fetchall()
2、mycat中间件
1. 独属于mysql主从的负载均衡策略
2.配置写主读从
3. 步骤
3.1 安装jdk
tar -xf jdk_8u192.tar.gz
cp jdk/ /usr/local/jdk
sed -i '$aexport JAVA_HOME=/usr/local/jdk' /etc/profile
sed -i '$aexport PATH=$PATH:$JAVA_HOME:/bin' /etc/profile
source /etc/profile
javac -version
3.2 mycat
tar -xf MyCat.tar.gz
cp -r mycat/ /usr/local/
#测试启动
/usr/local/mycat/bin/mycat console //用控制台打印
3.3 配置
(1) server.xml
<user name="blt" defaultAccount="true">
<property name="password">blt</property>
<property name="schemas">test</property>
<!--
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
-->
(2) schema.xml
<schema name="test" dataNode="dn1" checkSQLschema="false" sqlMaxLimit="100">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="test" />
<writeHost host="hostM1" url="192.168.8.150:3306" user="blt"
password="blt">
<readHost host="hostS2" url="192.168.8.151:3310" user="blt" password="blt" />
</writeHost>
3.4 启动和调试
(1)/usr/local/mycat/bin/mycat start
(2) netstat -lnput | grep 8066
(3) mysql -hmycat的ip或者域名 -P8066 -userver.xml中填入账号 -p在service.xml中填入的密码
(4) cat /usr/local/mysql/logs/wrapper.log
1. cause by....
二、运维自动化(ansible)
1、任务背景
公司的服务器越来越多,维护一些简单的事情都会变得很繁琐。用shell脚本来管理少量服务器效率还行,服务器多了之后,shell脚本无法实现高效率运维。这种情况下,我们需要引入自动化运维工具,对多台服务器实现高效运维。
2、任务拆解
1. 需要一台服务器做管理端,来连接管理所有的应用服务器
2. 考虑如果只针对一部分应用服务器进行运维操作如何实现(服务器分组)
3. 学会将平台烂熟于心的linux操作命令转化为自动化运维的方式(常见模块的学习)
4. 如果操作非常的冗长,学会使用playbook和role的方式来管理
3、学习目标
能够安装ansible服务器和客户端
能够定义ansible主机清单进行服务器分组
能够使用hostname模块修改主机名
能够使用file模块做基本的文件操作
能够使用copy模块把文件拷贝到远程机器
能够使用fetch模块把文件从远程拷贝到本地
能够使用user模块管理用户
能够使用group模块管理用户组
能够使用cron模块管理时间任务
能够使用yum_repository模块配置yum
能够使用yum模块安装软件包
能够使用service模块控制服务的启动,关闭,开机自启动
能够使用script模块在远程机器上执行本地脚本
能够使用command与shell模块远程执行命令
能够编写playbook实现httpd
三、认识自动化运维
1、问题:
假设我要去1000台服务上做一个操作(如nginx服务器修改配置文件里的某一个参数),下面两种方法缺点明显:
1. 按传统的方法,一台连着一台服务器的ssh上去手动操作。
缺点: 效率太低。
2. 写个shell脚本来做。
缺点:
1. 管理的机器平台不一致,脚本可能不具备通用性。
2. 传密码麻烦(在非免密登录的环境下,需要expect来传密码)
3. 效率较低,循环1000次也需要一个一个的完成,如果用&符放到后台执行,则会产生1000个进程。
自动化运维:将日常IT运维中大量的重复性工作,小到简单的日常检查、配置变更和软件安装,大到整个变更流程的组织调度,由过去的手工执行转为自动化操作,从而减少乃至消除运维中的延迟,实现“零延时”的IT运维。
2、自动化运维主要关注的方面
假如管理很多台服务器,主要关注以下几个方面:
1. 管理机与被管理机的连接(管理机如何将管理指令发送给被管理机)
2. 服务器信息收集(如果被管理的服务器有centos7.5外还有其它
linux发行版,如suse,ubuntu等。当你要做的事情在不同OS上有所
不同,你需要收集信息,并将其分开处理)3. 服务器分组(因为有些时候我要做的事情不是针对所有服务器,可
能只针对某一个分组)4. 管理内容的主要分类
4.1 文件目录管理(包括文件的创建,删除,修改,查看状态,远程拷贝等)
4.2 用户和组管理
4.3 cron时间任务管理
4.4 yum源配置与通过yum管理软件包
4.5 服务管理
4.6 远程执行脚本
4.7 远程执行命令
3、常见的开源自动化运维工具比较
1. puppet(拓展)
基于ruby语言,成熟稳定。适合于大型架构,相对于ansible和saltstack会复杂些。
2. saltstack(拓展)
基于python语言。相对简单,大并发能力比ansible要好,需要维护被管理端的服务。如果服务断开,连接就会出问题。
3. ansible
基于python语言。简单快捷,被管理端不需要启服务。直接走ssh协议,需要验证所以机器多的话速度会较慢。
四、ansible
1、ansible
ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
特点:
1. 部署简单
2. 默认使用ssh进行管理,基于python里的paramiko模块开发
3. 管理端和被管理端不需要启动服务
4. 配置简单,功能强大,扩展性强
5. 能过playbook(剧本)进行多个任务的编排
2、在m0安装ansible(搭建四台机器 m0 s0 s1 s2)
[root@m0 ~]# yum -y install epel-release
[root@m0 ~]# yum -y install ansible[root@m0 ~]# ansible --version
ansible 2.9.27
[root@m0 ~]# find /etc/ -name "*ansible*"
/etc/ansible
/etc/ansible/ansible.cfg
3、实现master对agent的免密登录,(s0 和s1)
[root@m0 ~]# ssh -keygen
[root@m0 ~]# ls ./.ssh/
id_rsa id_rsa.pub
[root@m0 ~]# cat ./.ssh/id_rsa.pub
[root@m0 ~]# ssh-copy-id -i 192.168.8.157
[root@m0 ~]# ssh-copy-id -i 192.168.8.158
4、在master上定义主机组,并测试连接
[root@m0 ~]# vim /etc/ansible/hosts //最后一行
[root@m0 ~]# ansible 192.168.8.157 -m ping
[root@m0 ~]# ansible group01 -m ping
[root@m0 ~]# ansible group02 -m ping
没有免密登陆的用户可以指定用户名和密码
可以利用别名分组
[root@m0 ~]# vim /etc/ansible/hosts
[root@m0 ~]# ansible group02 -m ping
可以直接ping别名
[root@m0 ~]# ansible other -m ping
主机清单的作用:服务器分组。
主机清单的常见功能:
1. 可以通过IP范围来分,主机名名字的范围来分
2. 如果ssh端口不是22的,可以传入新的端口。
3. 没有做免密登录,可以传密码。
vim /etc/ansible/hosts
web01 ansible_ssh_host192.168.8.xx
ansible_ssh_user=root ansible_ssh_pass=1 ansible_ssh_port=22
web02 ansible_ssh_host192.168.8.xx
ansible_ssh_user=root ansible_ssh_pass=1 ansible_ssh_port=22
[group1]
web01
web02
ansible 主机ip|域名|别名 -m ping|copy|...'参数'
五、ansible模块
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
ansible支持的模块非常的多,我们并不需要把每个模块都记住,而只需要熟悉一些常见的模块,其它的模块在需要用到时再查询即可。
1、查看所有支持模块
[root@m0 ~]# ansible-doc -l
2、查看所有ping模块
[root@m0 ~]# ansible-doc ping
3、远程修改主机名称
[root@m0 ~]# ansible group02 -m hostname -a 'name=ab'
[root@s0 ~]# hostname
ab
[root@s1 ~]# hostname
ab
[root@s2 ~]# hostname
ab
4、file模块(重点)
file模块用于对文件相关的操作(创建,删除,软硬钟接等)
# path 文件的地址
# state 方法
# directory 创建目录
# touch 创建文件# absent 删除文件
# link 创建软链接
# hard 创建硬链接# recurse 允许递归操作
# src 文件源
1. 创建一个目录
[root@m0 ~]# ansible group01 -m file -a 'path=/tmp/abc state=directory'
[root@s0 ~]# ls -l /tmp/ //s0 s1 s2 都有
2. 创建一个文件
[root@m0 ~]# ansible group02 -m file -a 'path=/tmp/abc/def state=touch'
[root@s0 ~]# ls /tmp/abc
def
3. 递归修改
[root@m0 ~]# ansible group02 -m file -a 'path=/tmp/abc recurse=yes owner=bin group=daemon mode=1777'
[root@s0 ~]# ll /tmp/
[root@s0 ~]# ll /tmp/abc/
4. 删除目录(连同目录里的所有文件)
[root@m0 ~]# ansible group02 -m file -a 'path=/tmp/abc state=absent'
[root@s0 ~]# ls /tmp/
5. 创建文件并指定group owner mode
[root@m0 ~]# ansible group02 -m file -a 'path=/tmp/aaaa state=touch owner=bin group=daemon mode=1777'
[root@s0 ~]# ls -l /tmp/
6. 删除
[root@m0 ~]# ansible group02 -m file -a 'path=/tmp/aaaa state=absent'
7. 创建软链接文件 #软链接指向硬链接
[root@m0 ~]# ansible group02 -m file -a 'src=/etc/fstab path=/tmp/xxx state=link'
[root@s0 ~]# ll /tmp/
8. 创建硬链接文件 #硬链接指向文件
[root@m0 ~]# ansible group02 -m file -a 'src=/etc/fstab path=/tmp/xxx2 state=hard'
6、stat模块(了解)
[root@m0 ~]# ansible group02 -m stat -a 'path=/etc/fstab'
7、copy模块
copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)
1.copy模块
[root@m0 ~]# ls
mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz
[root@m0 ~]# mv mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz my57.tar.gz
[root@m0 ~]# ls
my57.tar.gz[root@m0 ~]# ansible group02 -m copy -a 'src=./my57.tar.gz dest=~'
[root@s0 ~]# ls
my57.tar.gz
2. 使用content参数远程给文件里写入内容(会覆盖原内容)
[root@m0 ~]# ansible group02 -m copy -a 'content="wo wo wo" dest=~/test'
[root@s0 ~]# ls
test
[root@s0 ~]# cat test
wo wo wo
3. 使用force参数控制是否强制覆盖
如果目标文件已经存在,则不覆盖
[root@m0 ~]# ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333 force=no'
如果目标文件已经存在,则会强制覆盖
[root@m0 ~]# ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333 force=yes'
4. 使用backup参数控制是否备份文件
[root@m0 ~]# ansible group02 -m copy -a 'src=./test dest=~ backup=yes owner=bin group=daemon mode=1777'
[root@s0 ~]# ls -lh[root@m0 ~]# ansible group02 -m file -a 'path=/tmp/a.txt state=touch'
[root@m0 ~]# ansible group02 -m copy -a 'src=/etc/fstab dest=/tmp/a.txt backup=yes owner=bin group=daemon mode=1777'
[root@s0 ~]# ls /tmp[root@s0 ~]# cat /tmp/a.txt
5. copy模块拷贝时要注意拷贝目录后面是否带"/"符号
[root@m0 ~]# ansible group02 -m copy -a 'src=/etc/yum.repos.d dest=/etc/yum.repos.d/ backup=yes' //同步整个目录
[root@m0 ~]# ansible group02 -m copy -a 'src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/ backup=yes' //同步目录下的内容
8、 fetch模块
fetch模块与copy模块类似,但作⽤相反。⽤于把远程机器的⽂件拷贝到本地。
[root@m0 ~]# ansible group02 -m fetch -a 'src=/etc/sysconfig/network-scripts/ifcfg-ens33 dest=/tmp'
[root@m0 ~]# ls /tmp/
9、user模块
1. user模块用于管理用户账号和用户属性
[root@m0 ~]# ansible group02 -m user -a 'name=aaaa state=present'
[root@s0 yum.repos.d]# grep aaaa /etc/passwd
2. 创建用户mysql设置登录shell环境为/sbin/nologin
[root@m0 ~]# ansible group02 -m user -a 'name=mysql state=present system=yes shell="/sbin/nologin"'
[root@s0 ~]# grep mysql /etc/passwd
3. 指定group mode owner
[root@m0 ~]# ansible group02 -m file -a 'path=/usr/local/mysql/mysql-files state=directory owner=mysql group=mysql mode=750'
[root@s0 ~]# ll /usr/local/mysql/
4. 指定uid使用password传密码
[root@m0 ~]# echo 123456 | openssl passwd -1 -stdin
[root@m0 ~]# ansible group02 -m user -a 'name=abc state=present uid=1999 password=abc'
[root@s0 ~]# grep abc /etc/passwd
abc:x:1999:1999::/home/abc:/bin/bash
[root@s0 ~]# grep abc /etc/group
abc:x:1999:
5. 创建普通用户hadpoop,并产生空密码密钥对
[root@m0 ~]# ansible group02 -m user -a 'name=hadoop generate_ssh_key=yes'
6. 删除hadpoop用户,但默认家目录没有删除
[root@m0 ~]# ansible group02 -m user -a 'name=hadoop state=absent'
[root@m0 ~]# ansible group02 -m user -a 'name=aaaa state=absent'
[root@s0 ~]# ll /home/
7. 使用remove参数,删除用户的同时删除家目录
[root@m0 ~]# ansible group02 -m user -a 'name=mysql state=absent remove=yes'
[root@s0 ~]# ll /home/
10、group模块
group模块⽤于管理⽤户组和⽤户组属性。
11、yum 模块
yum模块⽤于使⽤yum命令来实现软件包的安装与卸载。
1. 使用yum安装一个软件
[root@m0 ~]# ansible group02 -m yum -a 'name=ntpdate state=present'
[root@m0 ~]# ansible group02 -m yum -a 'name=tree state=present'
[root@s0 ~]# ntpdate cn.ntp.org.cn
16 Aug 16:36:29 ntpdate[14892]: adjust time server 182.92.12.11 offset -0.000865 sec[root@s0 ~]# tree
12、cron模块
cron模块⽤于管理周期性时间任务
1. 创建一个cron任务
不指定user的话,默认就是root(因为我这里是用root操作的)。
如果minute,hour,day,month,week不指定的话,默认都为*
[root@m0 ~]# crontab -e
[root@m0 ~]# crontab -l
*/1 * * * * echo $( date ) >> ~/data.txt[root@m0 ~]# ansible group02 -m cron -a 'name="abc" user=root job="/usr/sbin/ntpdate cn.ntp.org.cn" hour=2'
[root@s0 ~]# crontab -l
#Ansible: abc
* 2 * * * /usr/sbin/ntpdate cn.ntp.org.cn
13、service模块
1. 关闭防火墙
[root@m0 ~]# ansible group02 -m service -a 'name=firewalld state=stopped enabled=false'
[root@s0 ~]# systemctl status firewalld.service
2. 关机
[root@s0 ~]# ansible group02 -m command -a 'shutdown -h 0'