Ansible: стать дважды

Ansible: стать дважды

Я хотел бы запустить ansible таким образом:

  • удаленный пользователь — «обычный» пользователь

  • ... который becomeимеет права root sudoдля запуска кучи задач

  • ... кто 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

Связанный контент