Ansible 2.1.0 utilizando become / become_user no puede establecer permissions en el file temporal

Tengo un ansible 2.1.0 en mi server, donde hago la implementación a través de vagrant y en la PC también. El rol "implementar" tiene:

- name: upload code become: true become_user: www-data git: repo=git@bitbucket.org:****.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 

En este caso con ansible 2.1.0 me sale un error:

 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"} 

It an ansible 2.0.1.0 que uso en mi PC, es todo normalmente – folder / var / www / have folder principal con owner y group www-data

Si solo uso become_user: www-data y si uso become_method: sudo con became_user: www-data – obtuve el mismo error

¿Qué hay que hacer para resolver esto?

El problema es que www-data no puede acceder a los mismos files que creó su usuario ansible no root pnetworkingeterminado que usa para conectarse a la máquina. Además, el post de error señala claramente la documentation de ansible que describe qué opciones tiene para solucionar este problema al actualizar desde ansible 2.0 o inferior.

Sugieren tres forms de corregir correctamente el problema:

  • Use la canalización. Cuando pipelining está habilitado, Ansible no guarda el module en un file temporal en el cliente. En cambio, canaliza el module al stdin del intérprete de python remoto. La canalización no funciona para modules que no sean Python.
  • Instale el soporte de acl del sistema de files en el host administrado. Si el directory temporal en el host remoto está montado con acls del sistema de files habilitados y la herramienta setfacl está en el PATH remoto, Ansible usará acls del sistema de files para compartir el file del module con el segundo sin privilegios en lugar de tener que hacer que el file sea legible por todos.
  • No realice una acción en la máquina remota convirtiéndose en un usuario sin privilegios. Los files temporales están protegidos por permissions de files de UNIX cuando se convierte en root o no usa become. En Ansible 2.1 y superior, los permissions de files UNIX también son seguros si realiza la connection a la máquina administrada como raíz y luego usa convertirse en una count sin privilegios.

O si no puede hacer ninguna de estas correcciones, puede forzar a ansible a ejecutarse de una manera un poco más insegura (que parecía ser la pnetworkingeterminada en ansible 2 y siguientes), que también debería solucionar su problema, pero no solucionaría el problema subyacente. riesgo de security:

Si no puede realizar ninguno de los cambios anteriores para resolver el problema y decide que la máquina en la que se está ejecutando es lo suficientemente segura como para que los modules que desea ejecutar allí sean legibles en todo el mundo, puede activar allow_world_readable_tmpfiles en el allow_world_readable_tmpfiles ansible.cfg file ansible.cfg . Establecer allow_world_readable_tmpfiles cambiará esto de un error a una advertencia y permitirá que la tarea se ejecute como lo hacía antes de 2.1.

En debian / ubuntu puede resolver esto instalando primero el package acl en el host remoto, como con esta tarea ansible:

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

Lo mismo con networkinghat / centos: instala el package acl en el host remoto:

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

Para que tu script funcione Respuesta en resumen es que necesita iniciar session como usuario raíz (Usuario pnetworkingispuesto) como usuario_remoto que se conecta a través de ssh, ya que ansible 2.1