当前位置: 首页 > 科技观察

熟练使用Ansible实现MySQL备份,运维看

时间:2023-03-18 11:07:55 科技观察

本文以容器的形式部署开源自动化运维工具Ansible,基于内置MySQL管理模块编排playbook配置文件,最终实现MySQL数据库备份的目的。选择容器的部署形式而不是直接安装,可以避免对系统环境的污染,使运维工作更加高效灵活。MySQL数据库备份技术和相关解决方案已经非常成熟,本文不再赘述和展开。在实际场景中,数据库不可能独立于业务而存在;因此,对于备份等运维操作,应在运维平台统一调度下发起或实施。Ansible作为近几年流行的自动化运维工具,可以定位在运维平台的核心使用。Ansible介绍关于Ansible的介绍,通过公共渠道可以找到大量的资料。公众号之前也有文章介绍过,本文就不浪费篇幅了。简单来说,Ansible是一个基于Python语言开发的运维工具。由于它没有客户端依赖性,因此与其他产品相比,在管理成本方面具有显着优势;Ansible基于模块工作,通过系统自带、客户编写、第三方模块,可以满足各种管理任务。本文使用mysql_db数据库模块实现备份功能。环境准备笔者熟悉RedHat系统。本来想直接通过yum命令安装ansible的。系统造成“污染”,不建议直接用yum安装。根据Ansible官方文档,使用mysql_db模块需要安装MySQL客户端和一些其他工具,操作系统本身并不是必需的。基于以上考虑,作者最终通过构建自定义docker镜像的方式部署了Ansible。除了克服以上缺点外,镜像制作完成后,可以很方便的移植到任何安装了docker的环境,无需考虑环境因素。本文以debian11官方镜像为基础,软件源为中科大。Dockerfile定义如下:FROMdebian:latestRUNsed-i's/deb.debian.org/mirrors.ustc.edu.cn/g'/etc/apt/sources.list\&&apt-getupdate-y\&&apt-getupgrade-y\&&apt-getinstallansible-y\&&apt-getinstallsshpass-y\&&apt-getinstallpip-y\&&apt-getinstalllibmysql++-dev-y\&&apt-getinstalldefault-mysql-client-y\&&apt-getautocleanRUNpip3installmysqlclientRUNmkdir-p/etc/ansible/CMD["/bin/bash"]用docker编译,导出的镜像大约900MB,安装的ansible版本是2.10.8。使用该镜像部署的容器启动后,查看如下图输出。mysql_db模块该模块用于实现MySQL库级管理,提供四个函数:CREATE、DROP、DUMP、IMPORT。本文通过设置state为dump,调用mysqldump工具完成备份。mysql_db模块备份功能可能用到的主要输入参数说明如下:connect_timeoutinteger连接MySQL服务器时的连接超时时间。默认值:30dump_extra_argsstring在community.mysql的0.1.0中加入,为mysqldump提供额外的参数。仅当state=dump时使用,否则忽略。encodingstring使用的编码模式,示例包括utf8或latin1_swedish_ci,在创建数据库、dump或导入sql脚本时。默认:“”forcebooleanaddedin0.1.0ofcommunitymysqlContinuedumporimporteven如果我们得到一个SQL错误。仅当状态为转储或导入时使用。选择:否←(默认)yeshex_blobboolean在community.mysql的0.1.0中添加使用十六进制表示法转储二进制列。选择:否←(默认)yessignore_tableslist/elements=stringA在database_name.table_name.Default:[]login_hoststringHost运行数据库的转储中将被忽略的表名列表。在某些情况下,对于本地连接login_unix_socket=/path/to/mysqld/socket,通常是/var/run/mysqld/mysqld.sock,需要用login_host=localhost代替。默认:“localhost”login_passwordstring用于认证的密码。login_portinteger的端口MySQL服务器。如果使用login_port,则需要将login_host定义为非本地主机。默认值:3306login_userstringTheusernameusedtoauthenticatewith.master_dataintegeraddedin0.1.0ofcommunity.mysqlOptiontodumpamasterreplicationservertoproduceadumpfilethatcanbeusedtosetanother服务器作为主服务器的从属服务器。0不包括主数据。1生成从属服务器启动复制过程所需的“CHANGEMASTERTO”语句。2生成注释的“CHANGEMASTERTO”。可以在以下情况下使用state=dump.Choices:012Default:0namealiases:dblist/elements=string/requiredName要添加或删除的数据库。name=all可能仅在状态为dump或import.List时提供数据库提供了state=dump、state=present和state=absent。如果name=all它的工作方式类似于mysqldump的–all-databases选项(在2.0中添加)。quickbooleanOption用于转储大表。选择:noyes←(默认)restrict_config_filebooleanaddedin0.1.0ofcommunity.mysqlReadonlypassedconfig_file.Whenstateisdumporimport,defaultthemodulepasssconfig_fileparameterusing--defaults-extra-filecommand-lineargumenttomysql/mysqldump实用程序在引擎盖下读名为除了通常的选项文件之外的选项文件。如果这种行为是不可取的,请使用yes只读命名的选项文件。选择:否←(默认)yessingle_transactionboolean在单个事务中执行转储。选择:no←(默认)yesskip_lock_tablesboolean在0.1中添加。0ofcommunity.mysqlSkip锁定表以供读取。当state=dump时使用,否则忽略。Choices:no←(default)yesstatestring数据库状态。Choices:absentdumpimportpresent←(default)targetpathLocation,在远程主机上,要读取或写入的转储文件。支持未压缩的SQL文件(.sql)以及bzip2(.bz2)、gzip(.gz)和xz(Addedin2.0)压缩文件.playbookorchestrationplaybook是一个Ansible脚本,用于配置、部署和管理受控节点.为受控节点列出的一系列to-do-list脚本在执行过程中根据编排的定义执行一个或多个任务。实现目标主机完成指定任务,达到预期状态。作者写了一个简单的playbook,配置了一个任务调用mysql_db模块来实现备份目标。需要注意的是hosts建议设置为127.0.0.1,也就是ansible所在的容器。yml文件如下:----hosts:127.0.0.1tasks:-name:"mysqldumptest"mysql_db:login_host:192.168.43.51login_user:rootlogin_password:****state:dumpname:testtarget:/tmp/test_{{ansible_date_time.date}}。gz执行playbook的过程和结果如下图所示:PLAYBOOK:bak.yml************************************************************1在bak.ymlPLAY[127.0.0.1]中播放************************************************************任务[收集事实]***************************************************************任务路径:/bak.yml:2ok:[127.0.0.1]META:ranhandlersTASK[mysqldumptest]**************************************************************任务路径:/bak.yml:4redirecting(type:modules)ansible.builtin.mysql_dbtocommunity.mysql.mysql_db[WARNING]:值“********”(int类型)被转换为“'********'"(类型字符串).Ift他看起来不像你期望的那样,引用整个值以确保它不会改变。更改:[127.0.0.1]=>{“更改”:true,“db”:“test”,“db_list”:[“test”],“executed_commands”:[“/usr/bin/mysqldump--user=root--password=********--host=192.168.43.51--port=3306test--quick|/bin/gzip>/tmp/test_2022-05-06.gz"],"msg“:”“}META:运行处理程序META:运行处理程序PLAYRECAP************************************************************127.0.0.1:ok=2changed=1unreachable=0failed=0skipped=0rescued=0ignored=0总结与展望本文使用容器实现Ansible的轻量级安装部署,旨在更好的发挥Ansible在运维管理中的积极作用。Ansible是模块化的属性,可以帮助运维人员摆脱复杂的技术,更好地专注于运维场景。笔者只实现了一个MySQL备份的场景。在企业级运维管理中,需要做好更复杂的运维场景。部署AnsibleTower仍然需要管理。笔者将继续对AnsibleTower对应的开源产品AWX的应用进行研究。作者简介:曹杰,中国结算上海分公司高级经理,从事系统运维管理工作。