Ansible: torne-se duas vezes

Ansible: torne-se duas vezes

Eu gostaria de executar o ansible da seguinte forma:

  • usuário remoto é usuário 'normal'

  • ... quem becomefaz root sudopara executar um monte de tarefas

  • ... quem becomeé o usuário postgres via su - postgresroot, para criar um banco de dados PostgreSQL.

Este é um procedimento típico do mundo PostgreSQL: um usuário especial acessível somente via sufrom 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 sudoregras 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 sudopermissões para se tornar, rootele já obtém ALLe 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/hbruijnque 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 possobecomequalquer usuário execute comandos sob um ID de usuário e tarefa diferente sem chamar sudoou suprimeiro:

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 postgreso 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

informação relacionada