Ansible 2.1.0 mit Become/become_user kann keine Berechtigungen für temporäre Dateien festlegen

Lesezeit: 4 Minuten

Benutzer-Avatar
DämonMV

Ich habe ein Ansible 2.1.0 auf meinem Server, wo ich die Bereitstellung über mache Landstreicher und am PC auch. Die Rolle “Bereitstellen” haben:

- name: upload code
  become: true
  become_user: www-data
  git: [email protected]:****.git
     dest=/var/www/main
     key_file=/var/www/.ssh/id_rsa
     accept_hostkey=true
     update=yes
     force=yes
 register: fresh_code
 notify: restart php-fpm
 tags: fresh_code

In diesem Fall mit ansible 2.1.0 erhalte ich eine Fehlermeldung:

fatal: [default]: FAILED! => {"failed": true, "msg": "Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user. For information on working around this, see https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user"}

Es ist ansible 2.0.1.0, das ich auf meinem PC verwende, ist alles normal – Ordner /var/www/ hat Ordner main mit Besitzer und Gruppe www-data

Wenn ich nur were_user: www-data verwende und willed_method: sudo mit were_user: www-data verwende, habe ich denselben Fehler

Was ist zu tun, um dies zu beheben?

Unter Debian/Ubuntu können Sie dies beheben, indem Sie zuerst die acl Paket auf dem Remote-Host, wie bei dieser ansiblen Aufgabe:

- name: install setfacl support
  become: yes
  apt: pkg=acl

Dasselbe gilt für Redhat/Centos – installieren Sie die acl Paket auf dem Remote-Host:

- name: install setfacl support
  become: yes
  yum: name=acl

  • Erfordert dies Änderungen an der fstab oder ein Neustart?

    – maschig

    15. Juni 2016 um 9:07 Uhr

  • In meinem Fall war kein Neustart erforderlich.

    – Cédric Meury

    10. August 2016 um 20:07 Uhr

  • Auf RHEL6 ist acl standardmäßig nicht aktiviert. Nach der Installation der acl Paket können wir die Option “acl” hinzufügen /etc/fstabund/oder laufen zB sudo mount -o remount,acl / um es sofort zu aktivieren.

    – Sam Hartsfield

    30. März 2020 um 15:55 Uhr

Das Problem ist, dass www-data kann nicht auf dieselben Dateien zugreifen, die Ihr standardmäßiger ansibler Nicht-Root-Benutzer erstellt hat, den Sie zum Herstellen einer Verbindung mit dem Computer verwenden. Darauf deutet auch die Fehlermeldung eindeutig hin ansibles Dokumentation die beschreibt, welche Optionen Sie haben, um dieses Problem zu beheben, wenn Sie ein Upgrade von Ansible 2.0 oder niedriger durchführen.

Sie schlagen drei Möglichkeiten vor, um das Problem richtig zu beheben:

  • Verwenden Sie Pipelining. Wenn das Pipelining aktiviert ist, speichert Ansible das Modul nicht in einer temporären Datei auf dem Client. Stattdessen leitet es das Modul an die Standardeinstellung des Python-Interpreters weiter. Pipelining funktioniert nicht für Nicht-Python-Module.
  • Installieren Sie die Dateisystem-ACL-Unterstützung auf dem verwalteten Host. Wenn das temporäre Verzeichnis auf dem Remote-Host mit aktivierten Dateisystem-ACLs gemountet wird und sich das Setfacl-Tool im Remote-PATH befindet, verwendet Ansible Dateisystem-ACLs, um die Moduldatei mit dem zweiten unprivilegierten zu teilen, anstatt die Datei für alle lesbar machen zu müssen.
  • Führen Sie keine Aktion auf dem Remote-Computer aus, indem Sie ein nicht privilegierter Benutzer werden. Temporäre Dateien werden durch UNIX-Dateiberechtigungen geschützt, wenn Sie Root werden oder nicht verwenden. In Ansible 2.1 und höher sind UNIX-Dateiberechtigungen auch dann sicher, wenn Sie die Verbindung zur verwalteten Maschine als Root herstellen und dann ein unprivilegiertes Konto verwenden.

Oder wenn Sie keine dieser Korrekturen durchführen können, können Sie Ansible dazu zwingen, auf eine etwas unsicherere Weise zu laufen (was in Ansible 2 und darunter der Standard zu sein schien), was auch Ihr Problem beheben sollte, aber nicht das zugrunde liegende Problem beheben würde Sicherheitsrisiko:

Wenn Sie keine der oben genannten Änderungen vornehmen können, um das Problem zu lösen, und Sie entscheiden, dass der Computer, auf dem Sie arbeiten, sicher genug ist, damit die Module, die Sie dort ausführen möchten, weltweit lesbar sind, können Sie ihn einschalten allow_world_readable_tmpfiles in dem ansible.cfg Datei. Einstellung allow_world_readable_tmpfiles wandelt dies von einem Fehler in eine Warnung um und lässt die Aufgabe so laufen, wie sie es vor 2.1 getan hat.

  • Vielen Dank für die Wiederholung. Für mich Hilfe zweite Antwort. Ich habe acl-tools installiert und das löst das Problem. In Playbook verwende ich become: true become_user: www-data und alles läuft gut

    – DämonMV

    19. April 2016 um 7:42 Uhr


  • Installation der acl Modul auf Debian-Servern (Option 2) war bei weitem die einfachste Option für mich, und dies funktioniert auch, wenn Sie “Temporäre Dateien auf dem Server belassen” zum Debuggen aktiviert haben. Ich habe es aufgegeben, Ansible Pipelining zum Laufen zu bringen (OS X 10.11-Client, Debian 7-Server, habe verschiedene Änderungen an der Konfigurationsdatei ausprobiert, aber nichts hat funktioniert). Ich fand auch heraus, dass die Verwendung der Option „Als Root verbinden“ zu einem unabhängigen Fehler führte, bei dem der größte Teil des Playbooks stillschweigend übersprungen wurde.

    – RichVel

    4. September 2016 um 6:47 Uhr


  • Wenn Sie diese schwer zu googlenden Symptome erhalten, wenn Sie die Technik “als Root verbinden” mit verwenden --ask-become-password (Option 3), die Hauptursache ist dieses Problem – installieren Sie einfach die acl Modul, um sie zu beheben: “Playbook fragt nach dem sudo-Passwort und verwendet es für sudo (Sie erhalten einen Passwortfehler, wenn Sie sich vertippt haben), wird aber danach ohne Fehler beendet [setup] implizite Aufgabe (die erfolgreich zu sein scheint)”. Scheint ein Fehler in Ansible 2.1.0 zu sein.

    – RichVel

    4. September 2016 um 6:58 Uhr


1228170cookie-checkAnsible 2.1.0 mit Become/become_user kann keine Berechtigungen für temporäre Dateien festlegen

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

Privacy policy