Как развернуть код из локального репозитория git на удаленный сервер с помощью Ansible

#git #ansible

#git #ansible

Вопрос:

Я использую Ansible 2.5. Мне нужно выполнить развертывание кода из локального репозитория git (контроллера) на удаленный сервер.

Я пытался использовать Ansible-playbook с модулем git, который может развертывать код только из локального репозитория по другому локальному пути или удаленного репозитория по другому удаленному пути. Это зависит от конфигурации hosts.

 - git:
    repo: /home/pi/Desktop/kk/Vue-Example/
    dest: /home/pi/Desktop/bb
  

Здесь repo будет указан путь к локальному репозиторию git (контроллер-машина)
и dest будет удаленным расположением компьютера.

Комментарии:

1. и в чем проблема? какой результат вы получили, попробовав вышеописанное?

2. При добавлении hosts: localhost это работает, потому что localhost у меня есть существующий репозиторий git и пункт назначения. он может развернуть local-> локальный. Но при добавлении hosts: remote-host это не работает. в нем говорится, что на удаленном сервере нет репозитория git в этом месте. Мне нужно развернуть local-> remote. Какой будет конфигурация?

Ответ №1:

Это именно тот рабочий процесс, который я тоже хотел — извлекать файлы из локального репозитория git, на который, я знаю, я могу положиться. В моем случае я использую конкретный идентификатор фиксации (версию, которая была хорошо протестирована), а не название ветки. Если вы этого хотите, просто замените ‘master’ ниже на идентификатор фиксации.

 - tasks:
    - name: Make temp directory
      tempfile:
        state: directory
      register: temp_git_archive
      delegate_to: localhost
      become: no
      changed_when: False
    - name: Extract latest git commit on branch master
      shell: git archive master |tar --extract --directory={{ temp_git_archive.path }}
      args:
        chdir: /home/pi/Desktop/kk/Vue-Example/  # YOUR LOCAL GIT REPO
      delegate_to: localhost
      become: no
      changed_when: False
    - name: Copy to remote
      copy:
        src: "{{ temp_git_archive.path }}"
        dest: /home/pi/Desktop/bb  # YOUR DESTINATION DIRECTORY
    - name: Delete temp directory
      file:
        path: "{{ temp_git_archive.path }}"
        state: absent
      when: temp_git_archive.path is defined
      delegate_to: localhost
      become: no
      changed_when: False
  

Возможно, можно использовать модули Ansible ‘git’ и ‘unarchive’ вместо модуля ‘shell’, описанного выше, но я предпочитаю делать это за один шаг.

Ответ №2:

Вы неправильно интерпретировали использование модуля git в ansible. Он используется для клонирования удаленного репозитория по пути dest, т.е. либо на компьютере контроллера, либо на удаленных хостах. Вы указали локальный путь, который не существует для модуля git, поскольку git попытался бы отправить http / ssh запрос, а такого пути не существует.

Значение репозитория из ansible указано следующим образом

репозиторий: адрес git-репозитория по протоколу git, SSH или HTTP (S).

В случае, если вы хотите клонировать на компьютере-контроллере по причине ssh-ключей, вы можете использовать модуль git делегировать localhost, а затем использовать модуль copy для копирования с контроллера на удаленный компьютер

 ---
- name: play to checkout
  hosts: remote-hosts
  tasks:
    - name: git checkout
      repo: "{{ repo_url }}"
      dest: /tmp
      delegate_to: localhost
    - name: copy module
      synchronize:
        src: ...
        dest: ...
  

Комментарии:

1. repo: local_or_remote_git_repository у меня работает. но это только локально для local или remote-> удаленный в зависимости от hosts: конфигурации. В любом случае, не могли бы вы, пожалуйста, сказать мне, какое будет хорошим решением для развертывания файлов изменений git local -> remote only.

2. то, что я сказал, будет работать с локального на локальный, поскольку репозиторий существует, и git рассматривает его как локальный репозиторий, и он существует на локальном компьютере. Вы хотите оформить заказ на компьютере контроллера и скопировать на удаленный справа? Тогда вышеуказанное сработало бы

3. Хорошо, но это повторное развертывание полного приложения или только изменения git?

4. в этом случае вы можете использовать модуль синхронизации ansible. итак, вы хотите скопировать измененные файлы с компьютера с локальным контроллером на удаленный компьютер — копироваться будут только измененные объекты, но обратите внимание, что при каждом запуске репозитория на локальный необходимо выполнять проверку, как при извлечении с удаленного

Ответ №3:

Вот мое мнение:

 ---
- name: Create repo directory
  file:
    path: "{{project_src_destination}}"
    state: directory
- name: Init repo
  command: git init {{project_src_destination}}
  args:
    creates: "{{project_src_destination}}/.git"
- name: Test repo state
  command: git show {{project_branch}}
  args:
    chdir: "{{project_src_destination}}"
  register: result
  ignore_errors: true
  changed_when: result.rc != 0
- name: Upload the repo
  local_action:
    module: command git push ssh://{{inventory_hostname}}/{{project_src_destination}} {{project_branch}}
    chdir: "{{project_src_source}}"
  when: 'result.rc != 0'
- name: Checkout the newly created branch
  command: git checkout {{project_branch}}
  args:
    chdir: "{{project_src_destination}}"
  register: result
  changed_when: "'Switched' in result.stdout"
  

В отличие от предыдущего ответа, нет необходимости создавать промежуточный архив. Может быть выгодно, если нужно выполнять инкрементные обновления.

Совершенно другим подходом было бы просто использовать rsync:

 - name: Copy sources
  ansible.posix.synchronize:
    src: "{{project_src_host}}"
    dest: "{{project_src_destination}}"
    delete: true
    rsync_opts:
      - "--exclude=.git"
      - "--exclude=*.pb.go"
      - "--exclude=*.o"
      - "--exclude=*.d"
      - "--filter=:- .gitignore"
  

Здесь идея состоит в том, чтобы в основном полагаться на .gitignore , чтобы не копировать промежуточные результаты компиляции.