目录
[1. mysql5.7](#1. mysql5.7)
[2. 可以使用pymysql非交互的管理mysql](#2. 可以使用pymysql非交互的管理mysql)
[1. 独属于mysql主从的负载均衡策略](#1. 独属于mysql主从的负载均衡策略)
[3. 步骤](#3. 步骤)
[3.1 安装jdk](#3.1 安装jdk)
[3.2 mycat](#3.2 mycat)
[3.3 配置](#3.3 配置)
[3.4 启动和调试](#3.4 启动和调试)
[1. puppet(拓展)](#1. puppet(拓展))
[2. saltstack(拓展)](#2. saltstack(拓展))
[3. ansible](#3. ansible)
[2、在m0安装ansible(搭建四台机器 m0 s0 s1 s2)](#2、在m0安装ansible(搭建四台机器 m0 s0 s1 s2))
[3、实现master对agent的免密登录,(s0 和s1)](#3、实现master对agent的免密登录,(s0 和s1))
(2)使用content参数远程给文件里写入内容(会覆盖原内容)
[7、 fetch模块](#7、 fetch模块)
一、回顾
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
cpp<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
cpp<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
- cause by....
二、运维自动化(ansible)
1、任务背景
公司的服务器越来越多,维护一些简单的事情都会变得很繁琐。用shell脚本来管理少量服务器效率还行,服务器多了之后,shell脚本无法实现高效率运维。这种情况下,我们需要引入自动化运维工具,对多台服务器实现高效运维。
2、任务拆解
需要一台服务器做管理端,来连接管理所有的应用服务器
考虑如果只针对一部分应用服务器进行运维操作如何实现(服务器分组)
学会将平台烂熟于心的linux操作命令转化为自动化运维的方式(常见模块的学习)
如果操作非常的冗长,学会使用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服务器修改配置文件里的某一个参数),下面两种方法缺点明显:
- 按传统的方法,一台连着一台服务器的ssh上去手动操作。
缺点: 效率太低。
- 写个shell脚本来做。
缺点:
管理的机器平台不一致,脚本可能不具备通用性。
传密码麻烦(在非免密登录的环境下,需要expect来传密码)
效率较低,循环1000次也需要一个一个的完成,如果用&符放到后台执行,则会产生1000个进程。
自动化运维:将日常IT运维中大量的重复性工作,小到简单的日常检查、配置变更和软件安装,大到整个变更流程的组织调度,由过去的手工执行转为自动化操作,从而减少乃至消除运维中的延迟,实现"零延时"的IT运维。
2、自动化运维主要关注的方面
假如管理很多台服务器,主要关注以下几个方面:
管理机与被管理机的连接(管理机如何将管理指令发送给被管理机)
服务器信息收集(如果被管理的服务器有centos7.5外还有其它
linux发行版,如suse,ubuntu等。当你要做的事情在不同OS上有所
不同,你需要收集信息,并将其分开处理)
- 服务器分组(因为有些时候我要做的事情不是针对所有服务器,可
能只针对某一个分组)
- 管理内容的主要分类
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、坏境
m0 192.168.1.67 管理机
s1 192.168.1.68 被管理
s2 192.168.1.69 被管理
s3 192.168.1.70 被管理
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 //写两个组,01组两个都是做免密的,02组两个免密,一个没做免密 ```cpp [group01] 192.168.1.68 192.168.1.69 [group02] 192.168.1.68 192.168.1.69 192.168.1.70 ``` \[root@m0 \~\]# ansible 192.168.1.68 -m ping //ping1.68主机 ```cpp 192.168.1.68 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } ``` \[root@m0 \~\]# ansible group01 -m ping //ping group01组(1.68,1.69) ```cpp 192.168.1.68 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.1.69 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } ``` \[root@m0 \~\]# ansible group02 -m ping //pinggroup02组,没有做免密的s3没有成功 ```cpp The authenticity of host '192.168.1.70 (192.168.1.70)' can't be established. ECDSA key fingerprint is SHA256:vcks5uGmemwyxNBSF54XWNYY0tCzHAh/OP4IJPQeSFI. ECDSA key fingerprint is MD5:83:fe:4f:99:f8:7a:a1:9c:fb:94:c4:e3:81:3c:e2:a8. Are you sure you want to continue connecting (yes/no)? yes 192.168.1.68 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.1.69 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.1.70 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: Warning: Permanently added '192.168.1.70' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true } ``` 没有免密登陆的用户可以指定用户名和密码可以利用别名来传递端口密码 \[root@m0 \~\]# vim /etc/ansible/hosts ```cpp [group01] 192.168.1.68 192.168.1.69 other ansible_ssh_host=192.168.1.70 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=q [group02] 192.168.1.68 192.168.1.69 other ``` \[root@m0 \~\]# ansible group02 -m ping //三台都ping成功了 ```cpp 192.168.1.69 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.1.68 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } other | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } ``` 可以直接ping别名 \[root@m0 \~\]# ansible other -m ping //单独ping other(1.70)也是可以成功的 ```cpp other | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } ```
练习:
不论你⽤哪种环境(免密或不免密,端⼝是否22), 请最终将两台被管理机器加⼊到group1组即可
root@m0 \~\]# vim /etc/ansible/hosts ```cpp web01 ansible_ssh_host=192.168.1.68 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=q web02 ansible_ssh_host=192.168.1.69 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=q [group01] web01 web02 ``` \[root@m0 \~\]# ansible group01 -m ping ```cpp web02 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } web01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } ```
五、ansible模块
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
ansible支持的模块非常的多,我们并不需要把每个模块都记住,而只需要熟悉一些常见的模块,其它的模块在需要用到时再查询即可。
1、查看所有支持模块
root@m0 \~\]# ansible-doc -l 官⽹模块⽂档地址: https://docs.ansible.com/ansible/latest/modules /list_of_all_modules.html
2、查看所有ping模块
root@m0 \~\]# ansible-doc ping
3、hostname模块(用于修改主机名)
root@m0 \~\]# ansible group02 -m hostname -a 'name=ab.tdr.tds' //三台主机的名字都被改成了ab.tdr.tds
4、file模块(重点)
------用于对文件相关的操作(创建,删除,软硬钟接等)
path 文件的地址
state 方法
directory 创建目录
touch 创建文件
absent 删除文件
link 创建软链接
hard 创建硬链接
recurse 允许递归操作
src 文件源
root@m0 \~\]# ansible group01 -m file -a 'path=/tmp/abc state=directory' //三台主机都被创建了abc目录 \[root@m0 \~\]# ansible group02 -m file -a 'path=/tmp/abc recurse=yes owner=bin group=daemon mode=1777' //给属性 \[root@m0 \~\]# ansible group02 -m file -a 'path=/tmp/abc state=absent' //删除这三台机子的/tmp/abc目录 \[root@m0 \~\]# ansible group02 -m file -a 'path=/tmp/aaa state=touch owner=bin group=daemon mode=1777' //创建文件并给属性 \[root@m0 \~\]# ansible group02 -m file -a 'src=/etc/fstab path=/tmp/xxx state=link' //创建一个软链接 \[root@m0 \~\]# ansible group02 -m file -a 'src=/etc/fstab path=/tmp/xxx2 state=hard' //创建一个硬链接
5、stat模块(了解)
root@m0 \~\]# ansible group02 -m stat -a 'path=/etc/fstab'
6、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=./mysql57.tar.gz dest=\~' //把文件mysql57.tar.gz传到另外三台主机的家(\~)目录下 \[root@s0 \~\]# ls my57.tar.gz
(2)使用content参数远程给文件里写入内容(会覆盖原内容)
root@m0 \~\]# ansible group02 -m copy -a 'content="wo ha ha ha" dest=\~/a.sh' 注意:ansible中-a后⾯的参数⾥也有引号时,记得要单引双引交叉使⽤,如果都为双引或单引会出现问题 \[root@s0 \~\]# ls test \[root@s0 \~\]# cat test wo ha ha ha
(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 'content="wo ha ha ha" dest=\~/a.sh backup=yes' //backup=yes表示如果拷⻉的⽂件内容与原内容不⼀样,则会备份⼀份,group1的机器上会将\~/a.sh备份⼀份(备份⽂件命名加上时间),再远程拷⻉新的⽂件为\~/a.sh \[root@ab \~\]# ls anaconda-ks.cfg a.sh a.sh.14315.2024-08-16@15:29:28\~ mysql57.tar.gz s.sh x.sh \[root@ab \~\]# cat a.sh wo ha ha ha\[root@ab \~\]# cat a.sh.14315.2024-08-16@15\\:29\\:28\~ wo ha ha ha\[root@ab \~\]#
(5)copy模块拷贝时要注意拷贝目录后面是否带"/"符号
root@m0 \~\]# ansible group02 -m copy -a 'src=/etc/yum.repos.d dest=/etc/yum.repos.d/ backup=yes' //同步整个目录------/etc/yum.repos.d后⾯不带/符号,则表示把/etc/yum.repos.d整个⽬录拷⻉到/tmp/⽬录下 \[root@m0 \~\]# ansible group02 -m copy -a 'src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/ backup=yes' //同步目录下的内容------/etc/yum.repos.d/后⾯带/符号,则表示把/etc/yum.repos.d/⽬录⾥的所有⽂件拷⻉到/tmp/⽬录下
7、 fetch模块
fetch模块与copy模块类似,但作⽤相反。⽤于把远程机器的⽂件拷贝到本地。
root@m0 \~\]# ansible group02 -m fetch -a 'src=/etc/sysconfig/network-scripts/ifcfg-ens33 dest=/tmp' \[root@m0 \~\]# tree /tmp //树状查看 /tmp ├── 192.168.1.68 │ └── etc │ └── sysconfig │ └── network-scripts │ └── ifcfg-ens33 ├── 192.168.1.69 │ └── etc │ └── sysconfig │ └── network-scripts │ └── ifcfg-ens33 ├── other │ └── etc │ └── sysconfig │ └── network-scripts │ └── ifcfg-ens33
8、user模块
user模块⽤于管理⽤户账号和⽤户属性。
root@m0 \~\]# ansible group02 -m user -a 'name=aaaa state=present' //创建aaa⽤户,默认为普通⽤户,创建家⽬录 \[root@m0 \~\]# ansible group02 -m user -a 'name=mysql state=present system=yes shell="/sbin/nologin"' //创建mysql系统⽤户,并且登录shell环境为/sbin/nologin \[root@m0 \~\]# ansible group02 -m file -a 'path=/usr/local/mysql state=directory' //创建目录 \[root@m0 \~\]# ansible group02 -m file -a 'path=/usr/locall/mysql/mysql-file state=touch owner=mysql group=mysql mode=1777 ' //创建文件,并指定它的属主属组权限 \[root@m0 \~\]# ansible group02 -m user -a 'name=abc state=present uid=1999 password=abc' //创建abc用户指定uid和密码 \[root@m0 \~\]# ansible group2 -m user -a 'name=hadoop generate_ssh_key=yes' //创建⼀个普通⽤户叫hadoop,并产⽣空密码密钥对 \[root@m0 \~\]# ansible group02 -m user -a 'name=aaaa state=absent' //删除aaaa⽤户,但家⽬录默认没有删除 \[root@m0 \~\]# ansible group02 -m user -a 'name=bbbb state=absent remove=yes' //删除bbb⽤户,使⽤remove=yes参数让其删除⽤户的同时也删除家⽬录
9、group模块
group模块⽤于管理⽤户组和⽤户组属性。
root@m0 \~\]# ansible group1 -m group -a 'name=groupa gid=3000 state=present' //创建组 \[root@m0 \~\]# ansible group1 -m group -a 'name=groupa state=absent //删除组(如果有⽤户的gid为此组,则删除不了)
10、cron模块
cron模块⽤于管理周期性时间任务
root@m0 \~\]# ansible group1 -m cron -a 'name="test cron1" user=root job="touch /tmp/111" minute=\*/2' //创建⼀个cron任务,不指定user的话,默认就是root,如果minute,hour,day,month,week不指定的话,默认都为\* \[root@m0 \~\]# ansible group1 -m cron -a 'name="test cron1" state=absent //删除cron任务
11、yum_repository模块
⽤于配置yum仓库
root@m0 \~\]# ansible group1 -m yum_repository -a "name=local description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no" //增加⼀个/etc/yum.repos.d/local.repo配置⽂件 \[root@m0 \~\]# ansible group1 -m yum_repository -a "name=local state=absent" //删除/etc/yum.repos.d/local.repo配置⽂件
12、yum模块(重点)
yum模块⽤于使⽤yum命令来实现软件包的安装与卸载。
root@m0 \~\]# ansible group1 -m yum -a 'name=vsftpd state=present' //使⽤yum安装⼀个软件(前提:group1的机器上的yum配置都已经好) \[root@m0 \~\]# ansible group1 -m yum -a 'name=httpd,httpd-devel state=latest' //使⽤yum安装httpd,httpd-devel软件,state=latest表示安装最新版本 \[root@m0 \~\]# ansible group1 -m yum -a 'name=httpd,httpd-devel state=absent' //使⽤yum卸载httpd,httpd-devel软件
13、service模块(重点)
service模块⽤于控制服务的启动,关闭,开机⾃启动等。
root@m0 \~\]# ansible group1 -m service -a 'name=vsftpd state=started enabled=on' //启动vsftpd服务,并设为开机⾃动启动 \[root@m0 \~\]# ansible group1 -m service -a 'name=vsftpd state=stopped enabled=false' //关闭vsftpd服务,并设为开机不⾃动启动
14、command与shell模块
两个模块都是⽤于执⾏linux命令的,这对于命令熟悉的⼯程师来说,⽤起来⾮常爽。
shell模块与command模块差不多(command模块不能执⾏⼀些类似$HOME,>,<,|等符号,但shell可以)
注意: shell模块并不是百分之百任何命令都可以,⽐如vim或ll别名就不可以。