#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
, чтобы не копировать промежуточные результаты компиляции.