2024.8.16(ansible)

一、回顾

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' 


 

 

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值