2014-02-20 3 views
3

Предположим, у вас есть sql-файл 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 в качестве файла на сервере-несущем сервере (откуда мы его выталкиваем), так что вы можете сделать «локальный файл» mysql -u root @ master -p ... < таким образом, чтобы копировать действие больше не нужно?

ответ

7

Независимо от того, что вы делаете, данные должны поступать из того места, где он находится на сервере базы данных. Обратите внимание, что в вашем примере вы должны использовать 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 

Это выполнить команду локально и должен работать, если:

  • ваш DB свалка находится в /tmp/database.sql на localmachine
  • /tmp/database.sql содержит заявления о создании базы данных
  • вы может удаленно подключиться к серверу MySQL (подсказка: проверка прав + bind_address)

Чтобы сделать вещи немного чище, вы можете использовать модуль 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 
+0

Спасибо за ваш ответ. Для centos/debian mysql_db отлично работает. Кажется, что в пакетах есть несоответствие, когда я устанавливаю доступный на RHEL 6 через epel. Начнем с того, что версия jinja на epel не является той, которая используется здесь (мне нужно было вручную загрузить rpm jinja2 python). Та же проблема с mysql_db. Тогда модуль python_mysqldb, необходимый для этого, не тот, что на epel. –

+0

Я думаю, что это в базовых репозиториях (yum install MySQL-python). Для Jinja2 это странно, поскольку в файле спецификации RPM есть «Требуется: python-jinja2» (https://github.com/ansible/ansible/blob/devel/packaging/rpm/ansible.spec). Тем не менее, я не использую CentOS, поэтому я действительно мало знаю об этом, извините :( – leucos

Смежные вопросы