Utilizza git per più file di configuration del server

Abbiamo migrato un sacco di codice sorgente a git e siamo molto soddisfatti della nostra attuale soluzione. Vorremmo avere i nostri file di configuration server installati sullo stesso sistema, ma ci sono alcune cose che non funzionano nel modo in cui vorremmo e spero che qualcuno possa condividere la sua esperienza qui.

Questa domanda è simile a Utilizzo del controllo di revisione per i file di configuration del server? , ma abbiamo alcuni requisiti speciali che non funzionano con i suggerimenti su questa domanda.

  • Autenticazione SVN con LDAP e Active Directory
  • Come configurare Ubuntu Mail Server con Google Apps?
  • protocollo di connessione SSH di iptables
  • errore automake: Il brace sinistro inatteso in regex è deprecato
  • Perché "chmod -R 777 /" distruttivo?
  • È necessario un riavvio dopo aver modificato / salvato iptables linux?
  • L'impostazione corrente utilizza la sovversione per i file di configuration. Il corrispondente repository sembra qualcosa di simile

      / # root del repository
      + - www.domain.com/ # configuration per www
      |  \--eccetera/
      |  \ - apache2 /
      + - dev.domain.com/ # configuration per dev
      |  + - etc /
      |  \--optare/
      |  \ - app1 /         
      |  \ - conf / # configuration per app1 su dev
      \ - staging.domain.com/ # per la configuration
    

    Con sovversione questo functionrebbe bene, perché è ansible effettuare un check-out solo in una sotto-directory di un repository. Inoltre è ansible utilizzare svn: externals per indicare una struttura comune per diverse configurazioni di configuration diverse. Abbiamo dovuto affrontare solo i file .svn in tutte le directory in versione. Git invece non dispone di svn: gli esterni e gli scarsetti assicurano sempre che il path dalla directory alla directory effettiva sia lo stesso.

    Durante la discussione sulla migrazione a git, ho cercato di annotare i principali requisiti per la versione di configuration del server:

    • vogliamo solo un unico repository
    • dovrebbe essere ansible spingere facilmente le modifiche al telecommand centrale
    • i cambiamenti dovrebbero contenere l'autore reale

    C'è un modo piacevole avere tutte le configurazioni in un repository e avere solo un sotto-path come copia di lavoro? Attualmente sto valutando due approcci, ma ho voluto porre la prima domanda qui

    1. Se il repository git è in una posizione fissa, ad esempio in qualche parte in / var , possiamo collegarci al sottoprogramma dalla directory di lavoro "target". Il problema principale: non sapere di un modo per "colbind" da / etc a un'altra directory per importre solo i contenuti, ad exception di un singolo file di symlinking
    2. Ho trovato un'altra alternativa a questa domanda SO , suggerendo di avere più rami in un repository. Ciò aumenterebbe certamente la complessità, ma potrei vedere che stiamo provando così.

    L'utilizzo di git su una singola macchina per la gestione dei file di configuration funziona bene, ma credo che ci deve essere qualcuno che lo usa il modo in cui vorremmo utilizzare.

    Grazie
    Kariem

  • Modifica della port SSH: Devo modificare solo sshd_config o anche ssh_config?
  • La modifica di applicationHost.config causerà la riavvio di IIS7?
  • Perché 14 caratteri è la lunghezza massima per la direttiva server nginx?
  • Solo server in output SMTP
  • Come posso get un aggregato di tutte le statistiche di tutti i vassalli uWSGI usando uwsgitop?
  • Quanto tempo un cambiamento DNS prenderà
  • 3 Solutions collect form web for “Utilizza git per più file di configuration del server”

    Ho usato qualcosa di simile prima; è così che ha funzionato.

    Repo Setup

    1. Crea un repo di git, "etc_files".
    2. Creare un branch per each tipo di macchina, ad esempio "server / www", "server / dev", ecc.
      • git support battute in nomi di filiali. Questo mi aiuta a mantenere i rami dritti nella mia testa.
      • Se hai poche macchine sufficienti, puoi avere un branch per each singola macchina.
    3. Crea un branch per each pezzo di infrastruttura condivisa, ad esempio "modules / apache", "modules / cups", ecc.
      • Questi rami sono per la gestione di file identici tra tutte le macchine, come /etc/resolv.conf . Questi sarebbero i file che conservi in ​​repos "svn: externals".

    Costruire una nuova macchina

    1. Su una nuova macchina, clonare il repo git e controllare il branch per quel tipo di macchina.
      • Faccio questo un clone di sola lettura per impedire alle persone di commettere modifiche da macchine di produzione senza prove.
    2. Impostare un lavoro cron per git pull automaticamente git pull il repo each giorno.

    Cambiare i rami della macchina

    Cambiare il codice in un unico branch macchina è semplice; basta controllare il branch appropriato nel tuo ambiente di sviluppo, apportre le modifiche e riprenderle al repo centrale. Tutte le macchine in quel branch verranno automaticamente apportte le modifiche alla successiva esecuzione del lavoro cron.

    Modifica dei rami del module

    Cambiare il codice di un branch di un module è solo un po 'più complicato, in quanto comprende due fasi:

    1. git checkout il branch di module appropriato
    2. Effettuare le modifiche e inviarle al server centralizzato.
    3. git checkout each branch della macchina che utilizza tale branch del module e quindi unire il branch del module in esso. git capirà che tu abbia fuso quel branch di module prima e solo noterai le modifiche che sono avvenute da quel ultimo genitore comune.

    Questo metodo ha sia vantaggi che inconvenienti. Un vantaggio è che posso fare una modifica a un branch di un module e applicarlo alle filiali di macchina che lo richiedono, lasciando che la macchina si affiliati che non restino con la versione precedente prima che siano pronti. Lo svantaggio quindi è che bisogna ricordare di unire il branch di un module in each branch di macchina che potrebbe essere utilizzato. Utilizzo uno script che attraversa l'tree di commit e automaticamente questo unisce per me, ma può ancora essere un dolore.


    In alternativa, le versioni più recenti del git sostengono qualcosa chiamato " submodules ":

    I sottomoduli permettono che i depositi esteri siano incorporati all'interno di una sottodirectory dedicata dell'tree di origine, indicando sempre un particolare impegno.

    Ciò consentirebbe di build qualcosa di un po 'come gli alberi "svn: externals", che potresti poi aggiornare in modo molto simile a quello che fai adesso.

    Bit di un nub qui, ma sembra un hook di ricezione post potrebbe fare il lavoro

    Il master Repo è memorizzato in / var / master
    il hook lo clona a / var / localclone
    quindi copia i dettagli specifici dell'host
    Dovresti impostare il hook .git / post-receive localmente su ciascun server (con le appropriate impostazioni)

    Sembra anche che tu voglia qualcosa di più come burattino o chef di git per questo questo ti permetterà di eseguire git per gestire i config e i moduli in modo centrale e avere il burattino \ chef gestisci la distribuzione e la verifica per te

    ecco un lavoro veloce che ho pensato
    1. Avere un repository centrale in say /var/repo
    2. Metti i file globali a tutti i domini di quella directory.
    3. Crea rami per each sottodominio /var/repo/subdomain1 , /var/repo/subdomain2 ecc.
    4. Creare un hook postale where qualsiasi spinta al branch sia fusa con il master.

    Quindi, quando si modifica il config di /var/repo/subdomain2 è immediatamente fuso con il master in modo da poter tirare completamente il repo e avere tutti i file di configuration
    Quando si desidera prelevare configurazioni di sottodomini individuali, è sufficiente estrarre il branch appropriato.

    Come mettere i file di configuration in /var/repo/* è completamente diverso (cron tabs, posso pensare)

    ~ $

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.