freehck.script_mysql_backup
freehck.script_mysql_backup
这个角色创建一个执行 MySQL 备份的脚本。
它会转储数据库,可能会使用 gzip 压缩并用 aes256 加密备份。
它可以发送消息到 Slack。
它可以把备份存储在 S3 上或/和使用 SCP 传输到其他主机。
角色变量
基本变量
mysql_backup_host
: MySQL 主机
mysql_backup_port
: MySQL 端口(默认 3306)
mysql_backup_user
: MySQL 用户
mysql_backup_pass
: MySQL 密码
mysql_backup_db
: 需要备份的 MySQL 数据库(如果不设置,则会将 --all-databases 选项传递给 mysqldump)
mysql_backup_backend_use_s3
: 如果想将备份存储在 S3 上,设置为 true
mysql_backup_backend_use_scp
: 如果想使用 SCP 将备份发送到其他主机,设置为 true
S3 后端变量
mysql_backup_s3cfg_template
: 你的 s3fs 配置模板(默认已提供,不用担心)
mysql_backup_s3
: S3 配置选项,格式如下
mysql_backup_s3:
username: "s3user"
access_key: "s3user-akey"
secret_key: "s3user-skey"
bucket: "bucket-name"
SCP 后端变量
mysql_backup_scp_host
: 用于复制备份的存储主机
mysql_backup_scp_user
: 在存储主机上登录的用户
mysql_backup_scp_dst
: 存储主机上存放备份的路径
mysql_backup_scp_identity_src
: 用于登录存储主机的身份文件(是的,应该是私钥)
命名
mysql_backup_archive_prefix
: 备份名称或时间戳之前的所有内容
mysql_backup_archive_stamp
: 时间戳模板,格式为 date
工具格式(默认值为 %F-%Hh%Mm%Ss
,生成的时间戳格式如 2019-09-23-12h22m07s
)
mysql_backup_script_name
: 如果想重命名基础脚本,可以随意更改
mysql_backup_custom_script_name
: 如果想为执行备份的工作脚本指定特定名称,默认是 mysql-backup-<database_name>.sh
,其中 all
,如果没有指定备份数据库。
mysql_backup_scp_identity_name
: 默认是 id_rsa
,但如果希望有多个使用不同密钥的 SCP 后端,则可以修改它
mysql_backup_encrypt_aes_key_name
: 默认是 aes256.key
,如果希望针对不同备份任务使用不同的加密密钥,需要用到这个
通知
mysql_backup_warn_size
: 单位 GiB,默认是 0。将你的备份与该大小进行比较。如果备份大小较小,则会对你发出警告。
mysql_backup_hostname
: 主机名(将在 Slack 消息中输出)
mysql_backup_slack_webhook
: 如上所述,这是一个 Slack webhook;设置它以接收 Slack 通知
如何获取 Slack webhook: https://get.slack.help/hc/en-us/articles/115005265063-Incoming-WebHooks-for-Slack
压缩和加密变量
mysql_backup_gzip
: 对备份文件进行 gzip 压缩
mysql_backup_encrypt_aes
: 对备份文件进行加密(如果启用 gzip,此操作将在 gzip 之后执行)
mysql_backup_encrypt_aes_key_src
: 用于加密备份的 aes256 密钥
Aes256 密钥是 32 字节的随机数。
你可以使用以下命令创建它: dd if=/dev/urandom of=aes256.key count=1 bs=32。
如果你更喜欢字符串密码(这不太安全),可以使用这个: pwgen -n1 -s 32 | tr -d '\n' >aes256.key
目录
mysql_backup_script_dir
: 存储基础脚本的目录
mysql_backup_custom_script_dir
: 存储特定于备份任务的脚本的目录
mysql_backup_conf_dir
: 存储备份脚本配置文件的目录
mysql_backup_encrypt_aes_key_dir
: 存储 aes256 加密密钥的目录
mysql_backup_tmpdir
: 存储临时结果的目录(你不需要单独创建一个,默认是 /tmp)
将数据传递给角色外部
mysql_backup_save_facts_about_custom_script
: 如果设置为 true,则角色会保存生成的工作脚本的完整路径,该脚本需要运行以执行备份,保存到变量 mysql_backup_last_generated_custom_script
。你可以使用此变量为该脚本添加特定的 cron 任务。
示例剧本
# 创建 MySQL 备份作业脚本
- role: freehck.script_mysql_backup
# MySQL 连接参数
mysql_backup_host: "{{ db_host }}"
mysql_backup_user: "{{ db_user }}"
mysql_backup_pass: "{{ db_pass }}"
mysql_backup_db: "{{ db_name }}"
# 后端存储参数
mysql_backup_backend_use_s3: no
mysql_backup_backend_use_scp: yes
mysql_backup_scp_host: "{{ hostvars['storage'].ansible_host }}"
mysql_backup_scp_identity_src: "{{ playbook_dir }}/files/id_rsa.bkp.db01"
mysql_backup_scp_user: 'file'
mysql_backup_scp_dst: '/var/www/file/public/mysql-db-prod-backup'
# gzip 和加密
mysql_backup_gzip: yes
mysql_backup_encrypt_aes: yes
mysql_backup_encrypt_aes_key_src: "{{ playbook_dir }}/files/aes256.bkp.key"
# 其他
mysql_backup_save_facts_about_custom_script: yes
mysql_backup_logfile: "/var/log/mysql-backup.log"
tags: [ backup, mysql ]
# 创建该作业脚本的 cron 任务是合理的
- role: freehck.crontask
crontask_file: "backups"
crontask_name: "备份数据库"
crontask_hour: "12"
crontask_minute: "0"
crontask_job: "{{ mysql_backup_last_generated_custom_script }}"
crontask_user: "root"
crontask_commented_out: false
tags: [ backup, mysql ]
重要信息
在你将 mysql-backup 脚本部署到主机之后,建议去执行备份任务的主机上,从 /opt/scripts
无参数运行作业脚本。如果没有错误通过并且在存储上看到备份文件,那么一切正常。如果没有,你会发现问题出在哪里。例如,配置用户时可能忘记将存储主机添加到 known_hosts
。或者你的 s3cfg
模板可能包含错误。不要忘记仔细检查所有内容:备份工作是非常重要的任务。
在确认备份创建并存储在正确位置后,仔细检查它。你必须确保能够使用它进行恢复。
许可证
MIT
作者信息
Dmitrii Kashin, freehck@freehck.ru