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データベース(設定されていない場合、mysqldumpに--all-databasesオプションが渡されます)
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バックアップスクリプトをホストにデプロイした後、バックアップタスクを実行するホストに行って、パラメータなしで /opt/scripts
のジョブスクリプトを実行するのが理にかなっています。エラーなく通過し、ストレージにバックアップファイルが見える場合は、すべて問題ありません。そうでなければ、問題が何かを見つけることができます。例えば、ユーザーを設定する際にストレージホストを known_hosts
に追加するのを忘れたかもしれません。あるいは、s3cfg
テンプレートに間違いが含まれている可能性があります。バックアップ作業は非常に重要なタスクなので、すべてを二度確認するのを忘れないでください。
バックアップが正しく作成され、正しい場所に保存されていることを確認したら、注意深く確認してください。それを使って復元できることを確信する必要があります。
ライセンス
MIT
著者情報
Dmitrii Kashin, freehck@freehck.ru