Como faço para escrever uma tarefa Ansible para executar um script PHP como um terceiro usuário ; não o usuário root e não o usuário de conexão, mas o usuário “servidor da web”?
O programa de administração NextCloud occ
, de acordo com a documentação, deve ser executado como usuário do servidor web :
sudo -u www-data php occ
Para se tornar um usuário diferente para executar um comando, o Ansible fornece o become
recurso. A documentação do Ansible recomenda severamente não tentar executar comandos como um usuário diferente e não root :
Tudo está bem se o arquivo do módulo for executado sem usar
become
, quando obecome_user
for root, ou quando a conexão com a máquina remota for feita como root. Nesses casos, o Ansible cria o arquivo do módulo com permissões que permitem apenas a leitura pelo usuário e root, ou apenas permitem a leitura pelo usuário sem privilégios para o qual está sendo alternado.No entanto, quando o usuário de conexão e o
become_user
não têm privilégios, o arquivo do módulo é gravado como o usuário que o Ansible se conecta (oremote_user
), mas o arquivo precisa ser legível pelo usuário que o Ansible está configurado para se tornar.
Usando become_user
para esse usuário
O usuário de conexão tem sudo
permissão para executar comandos como terceiro usuário:
$ sudo -u www-data whoami
www-data
Quando eu uso become_user
na tarefa, para executar o comando como esse usuário:
- name: "NextCloud: Instance configuration"
become_user: "{{ web_process_user }}"
command:
cmd: >-
php "{{ apache_nextcloud_dir }}/occ" maintenance:install
--no-interaction
…
ATUALIZAÇÃO : hum, funciona. Não sei o que mudou, mas ao tentar reproduzir o problema, parou.
Usando com uma invocação shell
explícita como esse usuáriosudo
Quando configuro a tarefa do Ansible com um shell
comando:
shell: >-
su '{{ web_process_user }}' --shell '/bin/bash' -c ' \
php "{{ apache_nextcloud_dir }}/occ" …
Ansible reclama:
[AVISO]: Considere usar 'become', 'become_method' e 'become_user' em vez de executar su
Eu adoraria fazer isso. O Ansible become
seria uma maneira muito mais graciosa do que esse shell: su
hack.
Mas ao usar become
, ocorrem os problemas descritos na documentação do Ansible: o módulo de tarefa enviado pela conexão para executar esse comando não consegue obter o privilégio de criar seus arquivos temporários.
A documentação do Ansible aconselha:
- “use pipelining”: Isso perde as vantagens do sistema de módulo de tarefa padrão.
- “evitar se tornar um usuário sem privilégios”: Não é uma opção, porque o usuário do servidor web sem privilégios é necessário para executar este comando corretamente.
Como devo fazer uma tarefa do Ansible que seja executada php "{{ apache_nextcloud_dir }}/occ"
como o terceiro usuário sem privilégios {{ web_process_user }}
?
UPDATE : a become
funcionalidade parece funcionar corretamente agora.
Existem duas maneiras que eu conheço para lidar com esse problema. A primeira você já conhece, mas parece ter se assustado com a documentação. No entanto, a documentação informa exatamente o que você precisa fazer para que funcione, portanto, você deve examiná-la com cuidado se isso não for bem-sucedido na primeira vez.
Então você precisa fazer duas coisas:
Defina
become_user
para o usuário sem privilégios (aqui,www-data
). Isso fará com que o ansible sudo para esse usuário em vez de root.Configure
sudoers
para permitir que seuremote_user
to . Por exemplo, se o seu é :sudo
www-data
remote_user
ansible
Observe que isso provavelmente é opcional, porque é típico já ter configurado o sudo para permitir que o usuário ansible sudo para qualquer usuário, algo como:
ou colocando-o em um grupo que já pode fazer isso.
A segunda maneira é fazer com que o Ansible se conecte diretamente ao sistema remoto como o usuário desejado (aqui,
www-data
) e não sudo. Você faz isso da seguinte forma:Adicione a chave pública ssh do Ansible ao arquivo
.ssh/authorized_keys
.Definir
remote_user=www-data
ebecome=no
para a tarefa, bloco, playbook, função, etc., que precisa ser executado como este usuário.