Интеграция Ansible и Liquibase

У меня есть вариант использования, когда мне нужно запускать liquibase миграции, используя ansible, но я не знаю, как выполнить удаленное соединение. Одна мысль создает туннель ssh, но я не уверен.

Пример использования: (на удаленном сервере)

  • Создать N количество баз данных
  • Создать пользователя базы данных для каждой db
  • Запустите миграцию Liquibase для каждой базы данных

Удаленный сервер доступен только через ssh, и Liquibase не поддерживает туннель ssh (насколько я знаю), и для Liquibase нет модуля ansible.

Кажется, что перед запуском вышеуказанных задач хакерский способ:

  • Создать прямой / обратный туннель для mysql,
  • Создать N количество баз данных
  • Создать пользователя базы данных для каждой db
  • Запустите миграцию Liquibase для каждой базы данных
  • Убейте туннель.

Но я не уверен, что это лучший способ решить эту проблему.


person sakhunzai    schedule 07.07.2015    source источник
comment
Я ничего не знаю об ансибле. Но соединение с Liquibase (которое работает внутри java vm) с базой данных - это JDBC. Поэтому, если вы устанавливаете соединение jdbc через туннель ssh, вы сможете использовать Liquibase с имеющимся у вас доступом ssh.   -  person Jens    schedule 07.07.2015
comment
@Jens, это идея, оставленная на столе, спасибо. Я думал избежать неприятностей с туннелями   -  person sakhunzai    schedule 07.07.2015
comment
У меня была похожая проблема. Вы можете избежать использования туннеля, установив Liquibase на хосте и запустив команды Liquibase с модулем Ansible command или shell. Однако для меня это оказалось слишком сложно, и в итоге я создал операторы SQL с помощью Liquibase и развернул эти операторы с помощью модуля Ansible mysql_db.   -  person Henrik Pingel    schedule 03.11.2015
comment
@knowhy проверь мой ответ   -  person sakhunzai    schedule 04.11.2015
comment
Что вы имеете в виду под «возвращающимся» удаленным подключением?   -  person Derek Mahar    schedule 26.11.2015
comment
Я имею в виду, например, миграции на локальном компьютере, отправьте их на удаленный экземпляр Amazon (у которого нет java или liquibase). Итак, миграции Liquibase + java + находятся на локальном компьютере   -  person sakhunzai    schedule 26.11.2015


Ответы (2)


Установка Liquibase на сервере с java кажется лишними накладными расходами, поэтому туннель ssh кажется возможным решением. Я решил эту проблему следующим образом:

Варс:

mysql:
    ssh_user: "xyz@{{ inventory_hostname }}"
    forward_port: 3306
    listen_port: 3307
    ssh_key: "{{ ansible_ssh_private_key_file }} "
    definer: "'root'@'localhost'"
    backup_dir: "/var/somebackup/location"

Задания :

 - name: Kill any active ssh tunnel to current host
    local_action: command bash -c "ps ax | grep ssh |grep -v grep | grep  '{{ mysql.ssh_user }}' |head -n 1| xargs -n 1|head -n 1|xargs kill -KILL"
    sudo: no
    register: ssh_tunnel_end

  - name: Create ssh tunnel to mysql
    local_action:  command bash -c "ssh -o ExitOnForwardFailure=yes  -o ConnectTimeout=2 -i {{ mysql.ssh_key }} -f -N -L  {{ mysql.listen_port }}:127.0.0.1:{{ mysql.forward_port }} {{ mysql.ssh_user }}" 
    sudo: no      
    register: ssh_tunnel_start

  - name: Run liquibase migrations for each db
    shell: liquibase --contexts='{{item.1.contexts}}' --username='{{customer.db.root_user}}' --password='{{customer.db.root_password}}' --changeLogFile='update.xml' --url='jdbc:mysql://127.0.0.1:{{mysql.listen_port}}/{{ customer.prefix }}_{{ item.1.db_suffix }}'   
    args:
        chdir: "{{special_modules.migrations.dest}}/{{item.1.name}}"
    delegate_to: 127.0.0.1
    sudo: no
    with_subelements:
        - "{{ customer_modules }}"
        - migrations

  - name: Kill reverse ssh tunnel to mysql
    local_action: command bash -c "ps ax | grep ssh |grep -v grep | grep  '{{ mysql.ssh_user }}' |head -n 1|xargs -n 1|head -n 1|xargs kill -KILL"
    sudo: no
    register: ssh_tunnel_end
person sakhunzai    schedule 04.11.2015

Использование Ansible 2.0 для установки Liquibase на удаленном хосте не очень сложно:

---
- name: Create Liquibase directory
  file: name=/opt/liquibase state=directory mode=0755 owner=root group=root

- name: Install Liquibase
  unarchive:
    src: https://github.com/liquibase/liquibase/releases/download/liquibase-parent-{{ liquibase_version }}/liquibase-{{ liquibase_version }}-bin.tar.gz
    dest: /opt/liquibase
    copy: no
    owner: root
    group: root
    mode: 0755
    creates: /opt/liquibase/liquibase
person Derek Mahar    schedule 25.11.2015
comment
возможно вы неправильно поняли мой вопрос. Я нигде не устанавливаю Liquibase. Я выполняю миграцию на удаленный сервер с помощью локальных миграций и Liquibase, поэтому мне нужно избегать установки java + Liquibase на каждом сервере. Пожалуйста, проверьте мой ответ ниже - person sakhunzai; 26.11.2015
comment
Почему установка JVM и Liquibase требует дополнительных затрат? Обычно так используют Liquibase. - person Derek Mahar; 26.11.2015
comment
Я использую Liquibase в проекте php - person sakhunzai; 26.11.2015