Подтвердить что ты не робот

Ansible 2.1.0 с помощью функции get/get_user не может устанавливать разрешения для временного файла

У меня есть ansible 2.1.0 на моем сервере, где я развертываю через vagrant и на ПК. Роль "развернуть":

- 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

В этом случае с невозможным 2.1.0 я получаю сообщение об ошибке:

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

Это он один 2.0.1.0, который я использую на моем ПК, все нормально - папка/var/www/имеет основную папку с владельцем и групповыми www-данными

Если я использую только old_user: www-data, и если я использую start_method: sudo with стал_user: www-data - я получил ту же ошибку

Что нужно сделать, чтобы решить эту проблему?

4b9b3361

Ответ 1

Проблема заключается в том, что www-data не может получить доступ к тем же файлам, которые был создан для вашего пользователя, не использующего root, который вы использовали для подключения к машине. Кроме того, сообщение об ошибке четко указывает на документацию, содержащуюся в документации, в которой описываются, какие параметры вы должны устранить при обновлении от версии 2.0 или ниже.

Они предлагают три способа правильно исправить проблему:

  • Используйте конвейерную обработку. Когда конвейеризация включена, Ansible не сохраняет модуль во временном файле на клиенте. Вместо этого он подключает модуль к удаленным интерпретаторам python stdin. Конвейерная обработка не работает для модулей, отличных от python.
  • Установить поддержку acl для файловой системы на управляемом хосте. Если временный каталог на удаленном хосте монтируется с включенной файловой системой acls, а инструмент setfacl находится в удаленном PATH, то Ansible будет использовать файлы acls для обмена файлом модуля со вторым непривилегированным, вместо того, чтобы сделать файл доступным для чтения всем.
  • Не выполняйте действия на удаленном компьютере, становясь непривилегированным пользователем. Временные файлы защищены правами доступа к файлам UNIX, когда вы становитесь root или не используете start. В Ansible 2.1 и выше разрешения на файлы UNIX также безопасны, если вы подключаетесь к управляемой машине с правами root, а затем используете ее в непривилегированную учетную запись.

Или, если вы не можете выполнить какие-либо из этих исправлений, то вы можете принудительно заставить его работать немного более небезопасным способом (который, по-видимому, был по умолчанию недоступен 2 и ниже), что также должно устранить вашу проблему, но не будет устранить основной риск для безопасности:

Если вы не можете внести какие-либо изменения, описанные выше, чтобы решить эту проблему, и вы решили, что работающий на компьютере компьютер достаточно безопасен для модулей, которые вы хотите запустить там, чтобы быть читаемым в мире, вы можете включить allow_world_readable_tmpfiles в ansible.cfg файл. Установка allow_world_readable_tmpfiles изменит это значение с ошибки на предупреждение и позволит выполнить задачу, как это было до 2.1.

Ответ 2

В debian/ubuntu вы можете решить эту проблему, предварительно установив пакет acl на удаленный хост, например, с помощью этой непонятной задачи:

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

То же самое с redhat/centos - установите пакет acl на удаленном хосте:

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