
Eu gostaria de executar o ansible da seguinte forma:
usuário remoto é usuário 'normal'
... quem
become
faz rootsudo
para executar um monte de tarefas... quem
become
é o usuário postgres viasu - postgres
root, para criar um banco de dados PostgreSQL.
Este é um procedimento típico do mundo PostgreSQL: um usuário especial acessível somente via su
from root
.
A especificação de parâmetros de torne-se em uma peça funciona apenas ao conectar-se como root, pois as opções CLI substituem tudo o que está definido em uma peça.
Existem maneiras mais elegantes de conseguir isso além de adicionar sudo
regras ou executar
command: /usr/bin/su - postgres -c '/bin/createuser -D -R -S myuser
do ansible, dizendo para calar a boca dos avisos?
Responder1
Por que você teria que mudar de usuário efetivo duas vezes?
Você pode especificar o ID de usuário efetivo que o ansible precisa para executar de acordo com a tarefa; portanto, quando precisar executar um comando como usuário postgres, defina-o diretamente.
tasks:
- name: Create Postgres User
shell: /bin/createuser -D -R -S myuser
become: yes
become_user: postgres
Freqüentemente, quando um usuário obtém sudo
permissões para se tornar, root
ele já obtém ALL
e se tornaqualquerusuário, incluindo postgres.
Alternativa, crie uma permissão sudo adicional para que seu usuário ansible possa executar comandos (específicos) como o usuário postgres.
Observação: Considere usar o Ansible Postgresmódulos de banco de dadospara gerenciar seus bancos de dados, funções e permissões.
Em resposta ao seu comentário: Eu me conecto ao Ansible como usuário regular:
ansible example -a "/bin/whoami"
example | SUCCESS | rc=0 >>
hbruijn
Eu tenho um trecho " " bastante típico /etc/sudoers.d/hbruijn
que não impõe nenhuma restrição ao que eu (meu usuário Ansible) posso fazer:
# /etc/sudoers.d/hbruijn
hbruijn ALL = NOPASSWD: ALL
E então eu possobecome
qualquer usuário execute comandos sob um ID de usuário e tarefa diferente sem chamar sudo
ou su
primeiro:
ansible example -b --become-user=root -a "/bin/whoami"
example | SUCCESS | rc=0 >>
root
ou:
ansible example -b --become-user=postgres -a "/bin/whoami"
example | SUCCESS | rc=0 >>
postgres
tudo sem que o Ansible se conecte diretamente como superusuário.
Responder2
Basicamente você precisa executar tarefas para postgres
o usuário no bloco raiz. Exemplo como abaixo:
pb.yml
- hosts: testingserver
gather_facts: false
tasks:
- name: this is me without become
command: whoami
- name: this is my sudo `root` block
become: true
block:
- name: checking who I am
command: whoami
- name: this is me becoming `postgres`
become_user: postgres
command: whoami
saída:
$ ANSIBLE_CONFIG=ansible.cfg ansible-playbook -i inven pb.yml -K -v
BECOME password:
PLAY [testingserver] ***********************************************************************************************************************************************************************************************
TASK [this is me without become] ***********************************************************************************************************************************************************************************
changed: [testingserver] => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"}, "changed": true, "cmd": ["whoami"], "delta": "0:00:00.006233", "end": "2023-07-05 11:01:57.229844", "msg": "", "rc": 0, "start": "2023-07-05 11:01:57.223611", "stderr": "", "stderr_lines": [], "stdout": "testinguser", "stdout_lines": ["testinguser"]}
TASK [checking who I am] *******************************************************************************************************************************************************************************************
changed: [testingserver] => {"changed": true, "cmd": ["whoami"], "delta": "0:00:00.006191", "end": "2023-07-05 11:01:57.964360", "msg": "", "rc": 0, "start": "2023-07-05 11:01:57.958169", "stderr": "", "stderr_lines": [], "stdout": "root", "stdout_lines": ["root"]}
TASK [this is me becoming `postgres`] *************************************************************************************************************************************************************************
changed: [testingserver] => {"changed": true, "cmd": ["whoami"], "delta": "0:00:00.003580", "end": "2023-07-05 11:01:58.768622", "msg": "", "rc": 0, "start": "2023-07-05 11:01:58.765042", "stderr": "", "stderr_lines": [], "stdout": "postgres", "stdout_lines": ["postgres"]}
PLAY RECAP *********************************************************************************************************************************************************************************************************
testingserver : ok=3 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Este é o meu ambiente Linux conforme o seu caso:
- usuário normal está testando usuário
- usuário normal su para postgres requer senha
- usuário normal sudo para root
- root su para postgres
$ ssh testingserver
[testinguser@testingserver ~]$ su - postgres
Password:
[testinguser@testingserver ~]$ sudo -i
[sudo] password for testinguser:
[root@testingserver ~]# su - postgres
[postgres@testingserver ~]$ whoami
postgres