Назад | Перейти на главную страницу

Как хранить репозитории etckeeper на центральном сервере через git

Я хотел бы иметь один центральный репозиторий git для всех репозиториев etckeeper .git моих серверов. Вот предлагалось использовать файл в /etc/etckeeper/commit.d, который в основном выглядит так, предполагая, что репозиторий git был настроен в somedir на каком-то хосте:

#!/bin/sh
cd /etc
git push faruser@farhost:somedir

Проблема в том, что было бы неплохо иметь все серверы в одном репо на центральном сервере. Я попытался

git push faruser@farhost:somedir/server1

но это не удалось.

Как видите, я никогда раньше не работал с git ... Мы очень ценим любые идеи о том, как это можно сделать :)

Привет,

Андреас

В дополнение к хорошему ответу от pjz, вот как это можно сделать, шаг за шагом:

Создайте файл /etc/etckeeper/commit.d/60-push (не забудьте выполнить команду chmod + x it) на клиентах.

    #!/bin/sh
    git push central_server:/var/git/client_name.git master

central_server определяется в конфигурации ssh, см. ниже. /var/git/client_name.git - это каталог на центральном сервере, содержащий репозиторий git.

~ / .Ssh / config от root (!) Должен содержать что-то вроде этого:

    host central_server
    Hostname 192.168.0.1
    User etckeeper #a user on the central server 
    IdentityFile ~/.ssh/custom_key # key is in authorized_keys in
                 #etcpeeper@central_server:~/.ssh/authorized_keys

Затем вам нужно запустить репозиторий git на central_server

    mkdir /var/git/client_name.git
    su etckeeper
    cd /var/git/client_name.git
    git --bare init

Протестируйте его с помощью небольшого изменения в / etc, а затем выполните фиксацию etckeeper "test push'ing".

Я понимаю, что вам нужно центральное место со всей вашей конфигурационной информацией, но вы, вероятно, хотите, чтобы они по-прежнему были отдельными репозиториями, просто в центре. Для этого узнайте, как отправлять сообщения в удаленные места в git (используя git push). Затем вам необходимо настроить доступ к этому местоположению со всех ваших серверов, после чего вы можете нажать со всех из них. В этот момент предложение, на которое вы указали, должно работать.

Вы должны настроить удаленный хост таким образом, чтобы локальному пользователю (я использую root, поскольку вы используете etckeeper) было разрешено отправлять данные в удаленный репозиторий. Как это сделать, зависит от того, как вы хотите, чтобы ваши git-репозитории на удаленном сайте были опубликованы / доступны. Например, при использовании git через ssh вы, скорее всего, настроите пару sshkey без парольной фразы и, следовательно, разрешите локальному корню входить в систему на удаленной стороне без вмешательства (keyoard -, ...). И да, при отправке на удаленный сайт репозиторий должен существовать, поэтому должно быть как минимум пустое репо. Итак, сначала сообщите нам точную ситуацию, с которой вы работаете, и точную ошибку, которую вы получаете.

Я думаю, что первоначальный вопрос заключается в том, как нажимать на разные ветки в одном репо. Один из способов заархивировать это - использовать синтаксис:

git push faruser@farhost:somedir master:server1

Это переместит локальную ветвь master в удаленную ветку server1. У вас могут быть варианты, например:

git push faruser@farhost:somedir master:auto/$(hostname)

Несколько замечаний:

  1. поскольку все ветки не имеют общего предка, вам, возможно, понадобится --force для первого коммита

  2. по той же причине в удаленном репо вы увидите n линейно независимых историй. В частности, вам будет нелегко увидеть общую часть вашей ветки. Идея для проекта: возьмите несколько веток git, создайте новые для совместного использования общего обновления и убедитесь, что состояние в начальных коммитах также присутствует в переписанных коммитах (т.е. переписать историю, добавив коммит / слияние / ... но обязательно посмотрите состояние начальных коммитов)

По крайней мере, в debian есть опция в etckeeper.conf.

...
# To push each commit to a remote, put the name of the remote here.    
# (eg, "origin" for git).
PUSH_REMOTE="origin"
...

После ручного добавления пульта в репозиторий git он должен работать из коробки