【发布时间】:2015-02-19 01:08:46
【问题描述】:
我需要使用 Ansible 备份我服务器上的所有个现有 MySQL 数据库。
我知道mysql_db 模块。它需要我要一个一个操作的数据库的名称,所以我必须在使用该模块之前获取现有数据库的列表。
有没有办法一次备份所有 MySQL 数据库或使用 Ansible 获取现有数据库的列表?
【问题讨论】:
我需要使用 Ansible 备份我服务器上的所有个现有 MySQL 数据库。
我知道mysql_db 模块。它需要我要一个一个操作的数据库的名称,所以我必须在使用该模块之前获取现有数据库的列表。
有没有办法一次备份所有 MySQL 数据库或使用 Ansible 获取现有数据库的列表?
【问题讨论】:
patch to adds name=all that allows a user to dump or import all data 最近被合并到 devel 中,它在 1.9.1 中尚不可用,但它已在文档的 this part 中显示。
# Dumps all databases to hostname.sql
- mysql_db: state=dump name=all target=/tmp/{{ inventory_hostname }}.sql
希望这将很快在稳定版本中提供。
(运行sudo pip install ansible --upgrade进行升级。)
【讨论】:
另一种方式,每个数据库在单独的文件中。
---
# This playbook backups all mysql databases into separate files.
- name: backup mysql
vars:
- exclude_db:
- "Database"
- "information_schema"
- "performance_schema"
- "mysql"
tasks:
- name: get db names
shell: 'mysql -u root -p{{ vault_root_passwd }} -e "show databases;" '
register: dblist
- name: backup databases
mysql_db:
state: dump
name: "{{ item }}"
target: "/tmp/{{ item }}.sql"
login_user: root
login_password: "{{ vault_root_passwd }}"
with_items: "{{ dblist.stdout_lines | difference(exclude_db) }}"
【讨论】:
mysql_db 模块在底层使用了mysqldump 可执行文件,它又提供了一个--all-databases 开关,只是Ansible 模块没有提供通过该模块使用它的选项。
我建议现在通过 command 模块使用 mysqldump 可执行文件,同时在 Ansible 的 GitHub 上提交功能请求以添加对它的支持。
这样的事情应该让你现在开始:
- name: Dump all MySQL databases to a single file
command: mysqldump --opt -uroot --all-databases --result-file=/tmp/all-dbs.sql
根据需要将选项调整为mysqldump:http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html
2016 年 11 月 26 日更新:
2015 年 5 月 12 日,mysql_db 模块中添加了一个添加 name=all 的补丁,因此推荐的转储所有数据库的方法是:
# Dumps all databases to hostname.sql
- mysql_db: state=dump name=all target=/tmp/{{ inventory_hostname }}.sql
【讨论】: