Ansible: convertirse en dos veces

Ansible: convertirse en dos veces

Me gustaría ejecutar ansible de manera que:

  • El usuario remoto es un usuario "normal".

  • ... becomea través de quién es root sudopara ejecutar un montón de tareas

  • ... becomea través de quién es el usuario de Postgres su - postgres, desde la raíz, para crear una base de datos PostgreSQL.

Este es un procedimiento típico para el mundo PostgreSQL: un usuario especial al que solo se puede acceder sudesde root.

La especificación de parámetros de conversión en una obra solo funciona cuando se conecta como root, ya que las opciones de CLI anulan lo que esté definido en una obra.

¿Existen formas más elegantes de lograr esto aparte de agregar sudoreglas o ejecutar

command: /usr/bin/su - postgres -c '/bin/createuser -D -R -S myuser

desde ansible, diciéndole que cierre las advertencias?

Respuesta1

¿Por qué tendrías que cambiar los usuarios efectivos dos veces?

Puede especificar el ID de usuario efectivo que ansible necesita ejecutar según la tarea, de modo que cuando necesite ejecutar un comando como usuario de postgres, configúrelo directamente.

tasks:
  - name: Create Postgres User
    shell: /bin/createuser -D -R -S myuser
    become: yes
    become_user: postgres

Con frecuencia, cuando un usuario obtiene sudopermisos para convertirse, rootya los obtiene ALLy se convierte encualquierusuario, incluido postgres.

Alternativamente, cree un permiso sudo adicional para que su usuario ansible pueda ejecutar comandos (específicos) como usuario de postgres.

Nota: Considere la posibilidad de utilizar Ansible Postgresmódulos de base de datospara administrar sus bases de datos, roles y permisos.


En respuesta a tu comentario: Me conecto con Ansible como usuario habitual:

ansible example -a "/bin/whoami"
example | SUCCESS | rc=0 >>
hbruijn

Tengo un /etc/sudoers.d/hbruijnfragmento " " bastante típico que no impone ninguna restricción sobre lo que yo (mi usuario de Ansible) puedo hacer:

# /etc/sudoers.d/hbruijn
hbruijn  ALL = NOPASSWD: ALL

Y entonces puedobecomecualquier usuario ejecute comandos con una ID de usuario y una tarea diferente sin llamar sudoo suprimero:

ansible example -b --become-user=root  -a "/bin/whoami"
example | SUCCESS | rc=0 >>
root

o:

ansible example -b --become-user=postgres  -a "/bin/whoami"
example | SUCCESS | rc=0 >>
postgres

todo sin que Ansible se conecte directamente como superusuario.

Respuesta2

Básicamente necesitas ejecutar tareas para postgresel usuario en el bloque raíz. Ejemplo como se muestra a continuación:

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

producción:

$ 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 es mi entorno de Linux según su caso:

  • usuario normal está probando usuario
  • usuario normal su para postgres requiere contraseña
  • usuario normal sudo a root
  • raíz su a postgres
$ ssh testingserver
[testinguser@testingserver ~]$ su - postgres
Password:
[testinguser@testingserver ~]$ sudo -i
[sudo] password for testinguser:
[root@testingserver ~]# su - postgres
[postgres@testingserver ~]$ whoami
postgres

información relacionada