Globale Einstellungen auf lokalen Befehlsservern in der Infrastruktur mit Gitlab CI und Ansible ändern [Concept]

Published on December 06, 2018

Globale Einstellungen auf lokalen Befehlsservern in der Infrastruktur mit Gitlab CI und Ansible ändern [Concept]



    Dieser Artikel beschreibt die Fähigkeit / Idee / das Konzept, globale Einstellungen auf lokalen Befehlsservern in einer großen Infrastruktur mit Gitlab CI und Ansible zu ändern.


    Angenommen, Sie haben 20 Entwicklungsteams und 1 Administrator- / DevOps-Team. Wie ändere ich Administratorkennwörter auf allen Servern? Wie füge ich allen Servern ein Enterprise-Stammzertifikat hinzu? Usw.


    Welches Problem löst?


    Typische Situation:
    Es gibt globale Administratoren / DevOps.
    Es gibt globale Einstellungen (NTP, DNS, Proxy usw.).
    Es gibt lokale Entwicklungsteams: TeamA, TeamB, TeamC, TeamD usw.
    Es gibt Entwickler, die nur zu den Servern ihres Teams gehen können.
    Wie füge ich globale Administratoren und globale Einstellungen hinzu / aktualisiere sie?



    Die Aufgabe wird durch die Tatsache erschwert, dass globale Einstellungen getrennt von lokalen Einstellungen von Befehlen in privaten Repositorys gespeichert werden.


    Wenn Sie nur wenige Server im gesamten Unternehmen haben, können Sie Ansible in einem einfachen Modus ausführen. Aktualisieren Sie globale Administratoren und globale Einstellungen auf allen Servern gleichzeitig.


    Bei großen Installationen verwenden Unternehmen normalerweise Puppet, Chef.


    Konzept


    Um globale Einstellungen auf lokalen Befehlsservern in einer großen Infrastruktur zu ändern, empfehle ich den Mechanismus der Git-Submodule.


    Im Repository mit lokalen Einstellungen werden Git-Submodule mit globalen Einstellungen verwendet.


    Unten sehen Sie ein schematisches Diagramm zum Verbinden eines privaten Repositorys mit globalen Einstellungen mit lokalen Befehlsrepositorys.



    Sie können das Konzept der Aktualisierung globaler Einstellungen mithilfe des Git-Submoduls in der Infrastruktur mit Puppet, Chef, Salt verwenden. Der Artikel enthält jedoch ein Beispiel mit Ansible.


    Installieren Sie beispielsweise tomcat, mysql und nginx und wenden Sie globale Einstellungen in einem Team mit dem Namen team an.


    In gitlab gibt es eine gemeinsame Gruppe, die gemeinsame Einstellungen enthält.


    Die allgemeine Gruppe verfügt über ein Basis-Bootstrap-Projekt, das Administratoren, Sysctl-Einstellungen usw. enthält.


    In der Regel verfügt das Unternehmen über mehrere Entwicklungsabteilungen, die häufig als Teams bezeichnet werden.


    Erstellen Sie in gitlab eine Teamgruppe (Sie haben Ihren eigenen Teamnamen).


    In der Teamgruppe erstellen wir Projekte: Anwendung, Datenbank, Loadbalancer.


    Screenshot von Base-Bootstrap, Anwendung, Datenbank, Loadbalancer:



    Das Basis-Bootstrap-Repository ist als Git-Submodul im Anwendungs-Datenbank-Loadbalancer-Repository aktiviert.


    Bei jedem Commit in der Anwendung, im Datenbank-Repository, startet Loadbalancer die Aktualisierung des Base-Bootstrap-Submoduls.


    Danach werden Ansible-Playbook von Base-Bootstrap und Ansible-Playbook von Base-Bootstrap auf die Server für Anwendung, Datenbank und Loadbalancer angewendet.



    Das heißt, wenn Sie dem Basis-Bootstrap einen neuen Administrator hinzufügen oder die Systemeinstellungen im Basis-Bootstrap ändern, werden die neuen Einstellungen des Basis-Bootstraps mit der Anwendung, der Datenbank und dem Loadbalancer auf die Anwendung, die Datenbank und den Loadbalancer angewendet.


    Vorbereitung


    Es ist notwendig, die Artikel über Ansible für Anfänger zu lesen:


    # Ansible wo ich anfangen soll


    # Ansible-Handbuch


    Auf Ihrem Computer sollten gitlab und gitlab-runner mit installiertem Docker installiert sein.


    Der Docker-Executor wird hier als Beispiel verwendet - Sie können den Shell-Executor verwenden.


    So stellen Sie gitlab und gitlab-runner bereit:


    # Artikel über Gitlab-CI aus Southbridge


    # Kontinuierliche Integration und Bereitstellung von Docker in GitLab CI


    Sie müssen 3 Server haben (zum Beispiel auf Ubuntu): Anwendung, Datenbank, Loadbalancer.


    Anwendung, Datenbank, Loadbalancer sind gebräuchliche Namen.


    Alle Beispiele können erweitert, verbessert, mit anderer Software erstellt werden - der Artikel zeigt ein allgemeines Prinzip.


    Wie implementieren


    Das Repository und der gesamte Code für den Test können hier abgerufen werden: https://github.com/patsevanton/ansible-gitlab-habr


    Wenn Sie per Login / Passwort zum Server gehen, erstellen Sie in der richtigen Gruppe (in diesem Fall Team) die Variable userpassword (bei einer Änderung müssen Sie auch die Variable im Code ändern) und geben dort das Passwort an (das Passwort wird im Code verwendet).


    Vergessen Sie nicht, auf den Zielservern den Benutzer zu erstellen, den Sie mit sudo-Rechten benötigen (der Code verwendet den Benutzer user).


    Für diejenigen, die über SSH-Schlüssel zum Server gehen, müssen Sie in der Teamgruppe eine Variable SSH_PRIVATE_KEY erstellen und einen privaten Benutzerschlüssel hinzufügen, der mit dem Server verbunden wird.


    In diesem Beispiel wird eine einfache Verbindung zu Servern hergestellt, sodass Sicherheitsprobleme in diesem Artikel nicht berücksichtigt werden.


    Erstellen Sie in jedem Repository (Anwendung, Datenbank, Loadbalancer) ein Git-Submodul:


    git submodule add git@gitlab.example.com:common/base-bootstrap.git
    git submodule add git@gitlab.example.com:team/team-users.git

    Das Submodul wird für den Zugriff auf das gemeinsam genutzte private Repository benötigt.


    In unserem Fall ist dies ein Repository mit allgemeinen Einstellungen für den Basis-Bootstrap und ein Repository von Teambenutzern, die Teambenutzer sind.


    Wobei gitlab.example.com Ihr gitlab-Server ist.


    Dann ändern wir in .gitmodules den Pfad zum Repository in relative


    Beispiel:


    [submodule "team-users"]
      path = team-users
      url = ../team-users.git
    [submodule "base-bootstrap"]
      path = base-bootstrap
      url = ../../common/base-bootstrap.git

    In jedem Repository in Hosts ändern wir die IP für unsere, in ansible.cfg ändern wir den remote_user für unseren Benutzer.


    Wenn Sie in den letzten Stunden / Tagen des Repositorys keine Commits ausgeführt haben und neue allgemeine Änderungen am Server vornehmen müssen (z. B. müssen Sie einen neuen Administrator hinzufügen) - für solche Situationen gibt es einen Ansible-Pull.


    Konfigurieren Sie den Ansible-Pull, um das Common / Base-Bootstrap-Repository herunterzuladen.


    Fügen Sie dazu das Repository für Bereitstellungstoken hinzu.


    Wechseln Sie zum Repository common / base-bootstrap und dann zu settings / repository / Deploy Tokens.


    Erstellen Sie ein Token. Der resultierende Benutzername und das Passwort werden in die Datei base-bootstrap / vars / cron.yml geschrieben.


    Nachdem Sie überprüft haben, dass alles korrekt funktioniert, ist es meiner Meinung nach sinnvoll, die Startzeit des Ansible-Pulls von "alle 2 Minuten" auf die für Sie passende zu ändern.


    Wenn ansible-pull gelöscht wird, bedeutet dies, dass das CI dieses Dienstes gelöscht wird, was bei jeder Übergabe an dieses Dienstrepository beginnt (der Dienst wird beispielsweise als Anwendung bezeichnet).


    Überprüfen Sie


    Einen neuen Administrator erstellen.


    Versuchen Sie, einen neuen Administrator zu https://github.com/patsevanton/ansible-gitlab-habr/blob/master/commons/base-bootstrap/vars/users.yml hinzuzufügen


    Sysctl ändern


    Versuchen Sie, Sysctl-Einstellungen unter https://github.com/patsevanton/ansible-gitlab-habr/blob/master/commons/base-bootstrap/vars/sysctl.yml hinzuzufügen / zu ändern


    Einträge zu cron hinzufügen


    Versuchen Sie, Cron-Einträge zu https://github.com/patsevanton/ansible-gitlab-habr/blob/master/commons/base-bootstrap/vars/cron.yml hinzuzufügen


    Erweiterung oder Installation Ihrer Anwendungen


    Zuerst müssen Sie die Rolle finden, um Ihre Anwendungen zu installieren.


    Gehen Sie zu https://galaxy.ansible.com/ und suchen Sie die Rolle zum Installieren Ihrer Anwendung.


    Versuchen Sie, Ihre Anwendung mithilfe der Rolle von der Konsole auf Ihren Servern zu installieren. In der Regel ist in den Beschreibungen aller Rollen eine Anweisung enthalten.


    Versuchen Sie beispielsweise, Java neben Tomcat zu installieren. Installieren Sie zuerst die Rolle "geerlingguy.java"


    ansible-galaxy install geerlingguy.java

    Erstellen Sie die Standard-ansible.cfg wie Repositorys.


    Inventar erstellen:


    [java]
    java ansible_host=IP-сервера

    Erstelle ein Playbook java.yml


    - hosts: java
      become: yes
      vars_files:
        - vars/main.yml
      roles:
        - { role: geerlingguy.java }

    Führen Sie ansible-playbook java.yml aus


    Wenn alles erfolgreich gelaufen ist, fügen Sie das gewünschte Projekt (in diesem Fall die Anwendung) hinzu.


    Die Rolle von geerlingguy.java wird nach der Rolle von robertdebock.tomcat https://github.com/patsevanton/ansible-gitlab-habr/blob/master/team/application/tomcat-app.yml#L11 hinzugefügt


    Dasselbe gilt für alle anderen Anwendungen, die Sie auf dem Server installieren müssen.


    Playbook Testing und Sicherheit


    Zur Vereinfachung des Artikels ist das Problem des Speicherns von Kennwörtern und des Testens nicht betroffen.


    Es gibt Artikel zum Testen eines Playbooks:
    # Ansible: Testen von Playbooks (Teil 1)


    # Testen und kontinuierliche Integration für Ansible-Rollen mit Molecule und Jenkins


    Antworten auf Fragen


    1) Mentat: Und warum ist es immer noch nicht so, als wäre es in der Ansible Dock mit Umgebungen geschrieben? Ab der ersten Lesung scheint es ein Versuch zu sein, alles noch einmal neu zu erfinden. Es ist sehr praktisch, alle diese Typen zu verwenden. Ansible-playbook -i env / teamA personalAPlaybook.yml
    Antwort: Mit diesem Schema können Sie globale Einstellungen ändern. In der Frage wird eine Änderung der lokalen Einstellungen der Befehle beschrieben.


    PS: Möglicherweise ist die gleiche Funktionalität in Ansible Tower implementiert. Aber dazu kann ich nichts sagen - ich habe nicht mit Ansible Tower gearbeitet.