2016-04-15 11 views
18

Ich habe eine Antwort 2.1.0 auf meinem Server, wo ich die Bereitstellung über Vagrant und auf dem PC zu tun. Die Rolle "bereitstellen" haben:Ansible 2.1.0 using then/tan_user kann Berechtigungen für temporäre Datei nicht setzen

- 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 ich einen Fehler:

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 es ansible 2.0.1.0, die ich auf meinem PC verwenden, ist alles normalerweise - Ordner/var/www/habe Ordner Haupt mit Besitzer und Gruppe www-data

Wenn ich nur benutze_anwender: www-data und wenn ich benutze_method: sudo mit ist_user: www-data - ich habe denselben Fehler

Was muss getan werden, um dies zu beheben?

Antwort

14

Das Problem ist, dass www-data nicht auf die gleichen Dateien zugreifen kann, die Ihr standardmäßiger Nicht-root ansible-Benutzer erstellt hat, den Sie verwenden, um eine Verbindung mit dem Computer herzustellen. Auch die Fehlermeldung zeigt eindeutig auf ansible's documentation, die beschreibt, welche Optionen Sie haben, um dieses Problem zu beheben, wenn Sie von ansible 2.0 oder niedriger aktualisieren.

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

  • Use pipelining. When pipelining is enabled, Ansible doesn’t save the module to a temporary file on the client. Instead it pipes the module to the remote python interpreter’s stdin. Pipelining does not work for non-python modules.
  • Install filesystem acl support on the managed host. If the temporary directory on the remote host is mounted with filesystem acls enabled and the setfacl tool is in the remote PATH then Ansible will use filesystem acls to share the module file with the second unprivileged instead of having to make the file readable by everyone.
  • Don’t perform an action on the remote machine by becoming an unprivileged user. Temporary files are protected by UNIX file permissions when you become root or do not use become. In Ansible 2.1 and above, UNIX file permissions are also secure if you make the connection to the managed machine as root and then use become to an unprivileged account.

Oder wenn Sie keine dieser Fehlerbehebung tun können, dann können Sie ansible zwingen, in einem wenig unsichere Art und Weise (die die zu sein schien zu laufen Standard in ansible 2 und unten), die auch Ihr Problem beheben sollte, würde aber die zugrundeliegende Sicherheitsrisiko nicht beheben:

If you can’t make any of the changes above to resolve the problem and you decide that the machine you’re running on is secure enough for the modules you want to run there to be world readable you can turn on allow_world_readable_tmpfiles in the ansible.cfg file. Setting allow_world_readable_tmpfiles will change this from an error into a warning and allow the task to run as it did prior to 2.1.

+3

Vielen Dank für die Wiedergabe. Für mich helfe zweite Antwort. Ich habe acl-tools installiert und das Problem gelöst. Im Playbook benutze ich 'wird: true gewordene_user: www-data' und alles geht gut – DeamonMV

+2

Die Installation des' acl' Moduls auf Debian Servern (Option 2) war bei weitem die einfachste Option für mich, und das funktioniert auch, wenn Sie "verlassen temporäre Dateien auf dem Server "zum Debuggen aktiviert. Ich habe es aufgegeben, Ansible-Pipelining funktionieren zu lassen (OS X 10.11-Client, Debian 7-Server, habe verschiedene Konfigurationsdateiänderungen versucht, aber nichts hat funktioniert). Ich fand auch, dass die Verwendung der "connect as root" -Option zu einem nicht damit zusammenhängenden Fehler führte, bei dem der Großteil des Playbooks stillgelegt wurde. – RichVel

+0

Wenn Sie diese schwer zu Google Symptome bekommen, wenn Sie die "connect as root" -Technik mit '--ask-werden-password' verwenden (Option 3), ist die Ursache das Problem - installieren Sie einfach das' acl'-Modul behebe sie: "Playbook fragt nach dem sudo-Passwort und benutzt es für sudo (du bekommst einen Passwortfehler, wenn es falsch eingegeben wurde), aber es wird ohne Fehler nach der implicitable-Task [setup] beendet (was anscheinend erfolgreich ist)". Scheint wie ein Ansible 2.1.0 Bug. – RichVel

35

auf debian/ubuntu Sie dies, indem zunächst die Installation des acl Paket auf dem Remote-Host auflösen kann, wie mit dieser ansible Aufgabe:

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

Das Gleiche gilt für Red Hat/CentOS - installieren Sie das acl Paket auf dem Remote-Host:

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

Benötigt dies Änderungen an der 'fstab' oder einen Neustart? – meshy

+0

In meinem Fall brauchte ich keinen Neustart. –