假设您有一个sql-file database.sql,它创建数据库模式,其中的表和一些初始填充。通常,我可以使用ansible通过以下方式创建此数据库:
---
- name: copy database.sql to server
template: src=database.sql dest=/tmp/database.sql owner=root group=root
- name: sql the thing into MySQL
command: mysql "-u root -p{{ mysql_root_password }} < /tmp/database.sql"
- name: remove the sql file from the server
command: rm -f /tmp/database.sql
这正是它所说的。但是当database.sql很大(可能是2 TByte)时,你真的不想先复制复制操作。有没有办法将database.sql作为一个文件引用到ansible-master服务器上(我们从中推送它),这样你就可以做一个mysql -u root @ master -p ...&lt; “本地文件”,以便不再需要复制操作?
答案 0 :(得分:8)
无论您做什么,数据都必须从数据库服务器流向数据库服务器。请注意,在您的示例中,您应该使用copy
而不是template
:Jinja正在解析模板,解析大文件的成本非常高。
话虽这么说,您可能希望使用local_action
并远程提供您的mysql服务器:
- name: feed database.sql to server
local_action: shell mysql -u root -p{{ mysql_root_password }} -h {{ ansible_default_ipv4 }} < /tmp/database.sql
这将在本地运行命令,并且应该在以下情况下运行:
/tmp/database.sql
/tmp/database.sql
包含数据库创建语句为了使事情更清洁,您可以使用mysql_db
模块:
- name: feed database.sql to server
local_action: mysql_db login_user=root login_password={{ mysql_root_password }} login_host={{ ansible_default_ipv4 }} name={{ db_name }} state=import target=/tmp/database.sql