Verwenden Sie rcm, um die Konfiguration in einem beliebigen Ordner bereitzustellen.

Published on January 11, 2019

Verwenden Sie rcm, um die Konfiguration in einem beliebigen Ordner bereitzustellen.

    Und wieder hallo. Eine Woche (in diesem Artikel geht es um eine sehr lange Zeit im Rückstand mariniert)Vor einiger Zeit habe ich erklärt, wie rcm für das normale Konfigurationsmanagement verwendet wird . Wir haben ein Marionettenmodul in unserem Unternehmen, das die persönlichen Einstellungen des Benutzers auf alle Hosts verteilt, auf die er Zugriff hat. Dementsprechend möchte ich Folgendes:


    • Haben Sie Ihre eigenen Einstellungen für alles, was ich benutze (vim, zsh, git, etc ..)
    • Aktualisieren Sie sie, während Sie das Dotfiles-Repository aktualisieren
    • All dies - ohne unnötige Gesten

    Werkzeuge


    Alles, was benötigt wird, wird bereits von mir verwendet, nämlich:


    • rcm
    • git
    • teer

    Das Format zum Hochladen von Dateien auf Hosts


    Hier gibt es nichts Schwieriges: Wir setzen Teerbälle ein, indem wir deren Inhalt auf Hosts auspacken. Es werden nur Dateien und Verzeichnisse aus einer bestimmten Liste verwaltet, die bei jeder Krone vollständig ausgefranst sind. Wenn sich der Tarball geändert hat, wird dementsprechend alles in $HOMEder Liste neu geschrieben. Wenn nicht, bleibt der Inhalt von $ HOME unverändert. Ein separates Skript ist für das (erneute) Packen der Quelldatei von persönlichen Dateien verantwortlich, es sieht eher trivial aus:


    #!/bin/bash -e
    # Repack each personal directory into a tarball, use gtar on mac/*BSD and tar on linux
    TAR=$(command -v gtar tar | head -1)
    cd "$(dirname "$0")"
    for file in *; do
      if [ -d "${file}" ]; then
        printf '\033[0;32mArchiving of \033[1;33m%s\033[0m\n' "$file"
        # to avoid differences in an archive because of different mtime
        # hard coded 2003-01-01 CET
        XZ_OPT=-e9 $TAR --mtime="@1041375600" -cJf "${file}.tar.xz" "${file}"
      fi
    done

    So erstellen Sie einen neuen Tar-Ball durch Festschreiben


    Stellen Sie Punktdateien bereit, die nicht in $ HOME enthalten sind


    Da ich bereits ein Tool habe, mit dem ich Konfigurationen auf verschiedenen Hosts bereitstelle, werde ich es natürlich verwenden. Sie müssen nur etwas reparieren und rcmkopieren, wo ich muss. Rcm installiert jedoch immer Punktdateien in $ HOME. Es gibt keine Befehlszeilenargumente, um dieses Verhalten zu ändern.


    Nach einigen Experimenten und dem Auswählen des Quellcodes wurde mir klar, dass Sie $ HOME direkt ändern können. Dann ändert sich das Verhalten der Dienstprogramme aller Befehle rcm wie folgt: Jedes der Dienstprogramme lsrc, mkrc, rcdn, rsupliest ${HOME}/.rcrcund verwendet ${HOME}/.dotfilesdie Standardeinstellungen. Dementsprechend reicht es aus, den ${HOME}/.rcrcmit allen notwendigen Parametern zu erstellen .


    Am einfachsten ist es, einen "leeren" Home-Ordner zu erstellen und ihn bei jedem Commit von Grund auf neu zu füllen. Ein Beispiel, wie es aussieht, ist im Repository zu sehen . Dieser Ordner wird auf allen Hosts ohne das persönliche Tag ignoriert bzw. beeinträchtigt die Grundkonfiguration nicht. Eine einzige .rcrc- Datei enthält alle Parameter für die Dateikopierlogik. Ich werde nur einige Bemerkungen machen:


    • Ohne $SYMLINK_DIRS rcuphoffnungslos lange zu arbeiten, erstellen Sie eine vollständige Liste der Dateien, die kopiert werden müssen. Mit dieser Option in Verbindung mit dem $COPY_ALWAYSDienstprogramm wird einfach der gesamte Ordner cp -rohne großen Aufwand kopiert
    • Offensichtlich werden auf Remote-Servern viele Dinge nicht benötigt, alles ist in aufgeführt $EXCLUDES(mit Ausnahme von VIM-Plugins müssen sie im Hook gelöscht werden, da sie verwendet werden $SYMLINK_DIRS).
    • Da es ${HOME}/.dotfilesaus offensichtlichen Gründen nicht mehr funktioniert, müssen Sie es auch überschreiben$DOTFILES_DIRS

    Das ist alles. Jetzt können Sie den Ordner tag-personal an eine beliebige Stelle kopieren, eine Weile überschreiben ${HOME}und ausführenrcup


    WORK_DIR="${HOME}/.dotfiles/tag-personal"
    _OLD_HOME=$HOME
    HOME="${HOME}/some/long/custom/path"
    cp -r "${WORK_DIR}" "${HOME}"
    rcup -v
    HOME=$_OLD_HOME

    Großartig! Aber du willst etwas anderes ...


    Automatisieren Sie die Bereitstellung von Konfigurationsdateien in $ HOME custom


    Um dies zu tun, ist "etwas" einfach, Git an dieser Stelle wird Ihren Haken helfen. Es gibt eine ausführbare Datei mit .git/hooks/post-commitfolgendem Inhalt:


    #!/bin/sh
    set -e
    WORK_DIR="tag-personal"
    HOME="${HOME}/some/long/custom/path/final_directory/USERNAME"
    # Some unnecessary and very heavy plugins
    EXCLUDED_VIM_PLUGINS='YouCompleteMe vimtex'
    rm -rf "${HOME}"
    cp -r "${WORK_DIR}" "${HOME}"
    rcdn -v
    rcup -v
    for plugin in ${EXCLUDED_VIM_PLUGINS}; do
      rm -rf "${HOME}/.vim/plugged/${plugin}"
    done
    # cleanup for .git dirs, compiled py and pictures
    find "${HOME}" \( \
        \( -type d -iname '.git' \) -o \
        \( -type f \
          \( -iname '*.pyc' -o -iname '*.gif' -o -iname '*.png' \) \
        \) \
      \) -exec rm -rf {} +
    # final repack for files
    "${HOME}/../repack.sh"

    Nach jedem Festschreiben an das Repository mit den Punktedateien wird dieses Skript gestartet.


    Alles, was danach noch übrig bleibt, ist ein Commit + Push im Repository mit persönlichen Daten durchzuführen und zu warten, bis der Automatisierungszauber meine Configs zu den funktionierenden Hosts bringt.


    Warum so etwas komplizieren?


    Tatsache ist, dass das Unternehmen zwar keine Tools zum Bereitstellen der persönlichen Konfiguration für Hosts hatte, jedoch kein solches Bodykit erforderlich war. Aber sobald sich die Gelegenheit ergibt, wächst der Appetit sofort. Einige meiner Kollegen , die mit der Tatsache zufrieden waren , dass die brachte Gastgeber auf den drei , die ich gefunden habe, zum Beispiel .vimrc .bashrc .gitconfig. Lange Zeit habe ich jedoch verschiedene Werkzeuge liebevoll geschärft, korrigiert und poliert. Nur ein Ordner ~/.vimwiegt nach der Installation aller Plugins 427 MB (ja, 218 davon sind YCM, und ich ziehe ihn nicht auf die Server, und nach dem Reinigen und Verpacken verlieren alle bis zu 3 MB an Gewicht).


    Wahrscheinlich scheint es jemandem, dass dies irgendwie zu viel ist und mit seinen Händen getan werden könnte. Vielleicht wird nicht jeder zustimmen.


    Ich hoffe, dass jemand anders ein fast physisches Bedürfnis hat, sich an Arbeitsplätzen, fast zu Hause, wohl zu fühlen, und dieses Tool ermöglicht es ihm. Nutzen Sie für die Gesundheit und seien Sie bei uns Automatisierung!