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

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

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

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

git push faruser@farhost:somedir/server1

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

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

Ура,

Andreas

5 ответов

Решение

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

В дополнение к хорошему ответу от 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-репо на центральном сервере

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

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

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

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

git push faruser@farhost:somedir master:server1

Это подтолкнет локальную ветку 'master' к удаленной ветке 'server1'. Вы можете иметь различные варианты, такие как:

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

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

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

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

По крайней мере, на 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 все должно работать из коробки

Другие вопросы по тегам