Ansible: wie man ein Repository als anderer Benutzer klont

Lesezeit: 6 Minuten

Ich versuche, Bereitstellungsregeln mit Ansible zu schreiben. Einige der Schritte sind:

  1. Update- und Upgrade-Server
  2. Erstellen Sie einen Benutzer namens Harry
  3. Fügen Sie Harry öffentliche und private Schlüssel hinzu
  4. Klonen Sie ein Git-Repository von bitbucket.org

Ich möchte das Repository als klonen harry Benutzer in seinem Home-Verzeichnis (deshalb kopiere ich seine öffentlichen und privaten Schlüssel). Das Problem ist, dass es nicht möglich ist, einen Benutzer anzugeben, als der der Git-Klon ausgeführt werden muss. Ansible versucht also, das Repository als root zu klonen, und ist fehlgeschlagen, da er keine Rechte zum Zugriff auf das Repository hat.

Wie lösen Sie das?

Benutzeravatar von Willem van Ketwich
Willem van Ketwich

Gemäß der Dokumentation von Ansible auf Privilegienausweitunghat Ansible Einschränkungen, wenn es darum geht, ein nicht privilegierter Benutzer zu werden, da es eine Sicherheitslücke für Harry offenlegt.

Verwenden des Ansible git Modul können Sie angeben, dass Harrys privater Schlüssel vom privilegierten Ansible-Benutzer verwendet werden soll, indem Sie das verwenden key_file Parameter und Verwendung become_user ermöglicht, dass die geklonten Dateien Harry das Eigentum übertragen werden. Zum Beispiel:

- name: Clone bitbucket repo
  git:
    repo: [email protected]:your-repo.git
    dest: /var/www/
    version: master
    accept_hostkey: yes
    key_file: /home/harry/.ssh/id_rsa
  become: yes
  become_user: harry

  • Hinzufügen become: yes ist wichtig, denn wenn Sie root sind, dann wird das geklonte Verzeichnis auch root sein, selbst wenn Sie become_user: harry

    –Daniel F

    19. August 2018 um 23:40 Uhr

Sie können für jede Aufgabe in Ihrem Playbook einen Benutzer angeben:

- name: Clone bitbucket repo
  git: ...
  become: yes
  become_user: harry

Näheres siehe Ansible Privilegienausweitung.

Eine sicherere Alternative zum Platzieren Ihres privaten Schlüssels auf einem Remote-Server besteht darin, die ssh-Schlüsselweiterleitung in der sshd-Konfiguration auf dem Server und Ihrer ssh-Konfiguration lokal zu aktivieren. Der Schlüssel verlässt dann niemals Ihre lokale Box.

  • Ich habe eine ssh-Weiterleitung und es funktioniert mit root. Aber es scheint nicht mit Bewerbe_Benutzer zu funktionieren

    – naja

    10. Juni 2016 um 16:44 Uhr

  • SSH_AUTH_SOCK geht mit become_user verloren. Die Schlüsselweiterleitung kann nur funktionieren, wenn sie beibehalten wird. Vielleicht kannst du es mit were_flags hinzufügen.

    – Benjamin Atkin

    13. September 2016 um 23:35 Uhr

  • Wie @BenAtkin erwähnt hat, geht SSH_AUTH_SOCK verloren, aber selbst wenn Sie es in der Datei /etc/sudoers aufbewahren, müssen Sie es auch angeben harry Berechtigungen für den Zugriff auf die Socket-Datei. serverfault.com/questions/107187/…

    – krzychu

    12. Januar 2017 um 15:04 Uhr

Benutzeravatar von George Mogilevsky
George Mogilevsky

Ja, Sie können es mit ssh-Weiterleitung zum Laufen bringen

Solange der Benutzer, zu dem Sie im Git-Klon werden, Teil von sudoers ist, muss er sudo nicht verwenden, um git auszuführen

Zusätzlich zu allen für die Schlüsselweiterleitung erforderlichen Konfigurationen gibt es also einen Trick, der sogar in Ansible-Dokumentationen erwähnt wird. Der Prozess auf hoher Ebene ist wie folgt: Aktivieren Sie die Agentenweiterleitung auf der Steuerungsmaschine. Aktivieren Sie das Akzeptieren des Agentenschlüssels auf der Zielmaschine. Erstellen Sie einen Benutzer und fügen Sie ihn (oder sie:) der sudoers-Gruppe hinzu. Verwenden Sie das Git-Modul von Ansible, um das Repo zu klonen

Um zu vermeiden, dass Berechtigungen auf dem Host verweigert werden, klonen Sie es einfach in ~/something. Sie können es jederzeit kopieren oder symbolisch an eine beliebige Stelle verlinken

Hier ist der Link, wo der Playbook-Teil zum Hinzufügen von Benutzern zu Sudoern angezeigt wird, es ist im Grunde ein Kopieren und Einfügen: Ansible: Erstellen Sie einen Benutzer mit Sudo-Berechtigungen

klappt wunderbar

Stellen Sie außerdem sicher, dass Sie Ihren öffentlichen SSH-Schlüssel in den allgemeinen Einstellungen von BitBucket hinzufügen, nicht in den Pro-Projekten. Andernfalls funktioniert Ihr SSH-Schlüssel nur mit einem bestimmten Repo. Aber wenn Sie den ssh-Schlüssel in den allgemeinen Bitbucket-Einstellungen hinzufügen, funktioniert er auf allen Ihren Repos

Unten ist der Code, der es zum Laufen bringt, der Suduer-Benutzer ist “Deployer”.

# the tasks to CREATE A SUDOER GROUP


- name: Make sure we have a 'wheel' group
    group:
      name: wheel
      state: present
    become: yes

  - name: Allow 'wheel' group to have passwordless sudo
    lineinfile:
      dest: /etc/sudoers
      state: present
      regexp: '^%wheel'
      line: '%wheel ALL=(ALL) NOPASSWD: ALL'
      validate: 'visudo -cf %s'
    become: yes

  - name: Add sudoers users to wheel group
    user: name=deployer groups=wheel append=yes state=present createhome=yes
    become: yes


 # tasks to ADD REPO with Ansible's GIT MODULE
  - name: Add  Git Repo - BitBucket 
    git:
      repo: '[email protected]:<your_username>/<your_repo>.git'
      dest: ~/code  # note this destination, you will avoid permissions issues
      accept_hostkey: yes # btw, this is for the ssh key forwarding
      recursive: no
    become: deployer # this guy (or gal) is a sudoer by now

# Extra “Hack”, um Berechtigungen für Dateien UND Ordner auf einmal zu ändern, es hat mit dem großen X zu tun und was es betrifft und was nicht. Auch von einem anderen Stackoverflow abgeholt

- name: Set perms on new Code repo to deployer:deployer dirs-0755 and files-0644
    file:
      path: ~/code
      state: directory
      owner: deployer 
      group: deployer 
      mode: u=rwX,g=rX,o=rX
      recurse: yes
    become: yes

  • SSH_AUTH_SOCK Wir müssen dem Deployer Berechtigungen für den Zugriff auf die Socket-Datei erteilen serverfault.com/a/448972/253195

    – Mikl

    15. Mai 2020 um 17:50 Uhr

  • Entschuldigung, aber warum sollten Sie sudo für git verwenden?

    – cybernet2u

    1. März um 6:13

Benutzeravatar von George Mogilevsky
George Mogilevsky

Ja mit ssh-Weiterleitung funktioniert es. Wenn Ihr Playbook global „become: yes“ aktiviert hat, stellen Sie sicher, dass Sie dies für die Git-Aufgabe deaktivieren. Der Grund, warum es nicht funktioniert, wenn Sie „become: yes“ haben, liegt darin, dass die Ausweitung der Root-Privilegien die ssh-Weiterleitung zerstört. Ich glaube nicht, dass du ein Sudoer werden musst. Denn wenn Ihr Ansible-Steuerungscomputer bei Bitbucket mit dem SSH-Schlüssel authentifiziert wird (Sie fügen den SSH-Schlüssel zum Repo hinzu), dann wird diese Authentifizierung durch die SSH-Weiterleitung geleitet. Sie können es per ssh in Ihr Ziel testen und „ssh -T [email protected]“ eingeben. In der Ausgabe sehen Sie, dass das Ziel von Bitbucket als Benutzer der Ansible-Steuerungsmaschine akzeptiert wird. Also einfach die Aufgabe mit explizitem „become: no“ ausführen. Ich stimme dem Klonen in ~/something auf dem Ziel zu. Andernfalls kommt es zu Berechtigungsproblemen.
[Edit: one more thing to make it work – ⁃ Repo URL should be the ssh one not https one, without ssh:// (despite what is written in the Ansible Manual examples)]
In Bezug auf die Sicherheit ist, wie oben erwähnt, die ssh-Weiterleitung am besten.

Wir können einfach Benutzer machen Harry (www-data in meinem Beispiel) zugänglich per ssh mit den gleichen authorisierten_Schlüsseln wie die Wurzel. Es wird kein Sicherheitsproblem sein, wenn Sie eine Verbindung herstellen können Wurzel mehr kannst du dann sowieso machen wenn du dich da verbindest Harry.

remote_user: root
tasks:
  - name: Create /var/www/.ssh
    file:
      state: directory
      owner: www-data
      group: www-data
      path: /var/www/.ssh
      mode: 0700

  - name: Copy authorized_keys to www-data
    copy:
      remote_src: yes
      src: ~/.ssh/authorized_keys
      dest: /var/www/.ssh/
      mode: 0400
      owner: www-data

  - name: Ensure www-data has shell
    lineinfile:
      path: /etc/passwd
      regexp: '^www-data:'
      line: 'www-data:x:33:33:www-data:/var/www:/bin/bash'

  - name: chown -R www-data /var/www
    file:
      owner: www-data
      path: /var/www
      recurse: yes

  - name: Git checkout application
    git:
      repo: [email protected]:harry/project.git
      dest: "/var/www/project_root_dir"
      accept_hostkey: yes
    remote_user: www-data

1445760cookie-checkAnsible: wie man ein Repository als anderer Benutzer klont

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy