
Я хотел бы запустить ansible таким образом:
удаленный пользователь — «обычный» пользователь
... который
become
имеет права rootsudo
для запуска кучи задач... кто
become
является пользователем postgres черезsu - postgres
, от имени пользователя root, для создания базы данных PostgreSQL.
Это типичная процедура для мира PostgreSQL: специальный пользователь, доступный только su
через root
.
Указание параметров become-ish в игре работает только при подключении как root, поскольку параметры CLI переопределяют все, что определено в игре.
Есть ли более элегантные способы добиться этого, кроме добавления sudo
правил или запуска?
command: /usr/bin/su - postgres -c '/bin/createuser -D -R -S myuser
из ansible, приказав ему отключить предупреждения?
решение1
Зачем вам пришлось бы дважды менять эффективных пользователей?
Вы можете указать эффективный идентификатор пользователя, который необходим ansible для запуска в соответствии с задачей, поэтому, когда вам нужно запустить команду от имени пользователя postgres, задайте его напрямую.
tasks:
- name: Create Postgres User
shell: /bin/createuser -D -R -S myuser
become: yes
become_user: postgres
Часто, когда пользователь получает sudo
разрешения стать, root
он уже получает ALL
и становитсялюбойпользователь, включая postgres.
В качестве альтернативы создайте дополнительное разрешение sudo, чтобы ваш пользователь ansible мог выполнять (определенные) команды от имени пользователя postgres.
Примечание: Рассмотрите возможность использования Ansible Postgresмодули базы данныхдля управления вашими базами данных, ролями и разрешениями.
В ответ на ваш комментарий: Я подключаюсь к Ansible как обычный пользователь:
ansible example -a "/bin/whoami"
example | SUCCESS | rc=0 >>
hbruijn
У меня есть довольно типичный /etc/sudoers.d/hbruijn
фрагмент " ", который не накладывает никаких ограничений на то, что я (мой пользователь Ansible) могу делать:
# /etc/sudoers.d/hbruijn
hbruijn ALL = NOPASSWD: ALL
И тогда я смогуbecome
любой пользователь может выполнять команды под другим идентификатором пользователя и задачей без предварительного sudo
вызова su
:
ansible example -b --become-user=root -a "/bin/whoami"
example | SUCCESS | rc=0 >>
root
или:
ansible example -b --become-user=postgres -a "/bin/whoami"
example | SUCCESS | rc=0 >>
postgres
все это без прямого подключения Ansible в качестве суперпользователя.
решение2
По сути вам нужно запустить задачи для postgres
пользователя в корневом блоке. Пример ниже:
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
выход:
$ 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
Вот моя среда Linux-box в вашем случае:
- обычный пользователь — тестирующий пользователь
- обычный пользователь su для postgres требует пароль
- обычный пользователь sudo для root
- root su в postgres
$ ssh testingserver
[testinguser@testingserver ~]$ su - postgres
Password:
[testinguser@testingserver ~]$ sudo -i
[sudo] password for testinguser:
[root@testingserver ~]# su - postgres
[postgres@testingserver ~]$ whoami
postgres