
Me gustaría ejecutar ansible de manera que:
El usuario remoto es un usuario "normal".
...
become
a través de quién es rootsudo
para ejecutar un montón de tareas...
become
a través de quién es el usuario de Postgressu - 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 su
desde 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 sudo
reglas 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 sudo
permisos para convertirse, root
ya los obtiene ALL
y 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/hbruijn
fragmento " " 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 puedobecome
cualquier usuario ejecute comandos con una ID de usuario y una tarea diferente sin llamar sudo
o su
primero:
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 postgres
el 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