# Управление кластером в промышленной среде с ограниченными привилегиями

В данном разделе приведена информация по установке кластера Picodata в
промышленной среде, в которой действуют ранее настроенные политики
безопасности. Информация дополняет инструкцию по использованию роли
[picodata-ansible].

[picodata-ansible]: deploy_ansible.md

## Общие сведения {: #basics }

В крупных организациях роли системного администратора (Администратора
ОС) и Администратора БД разделены с целью обеспечения информационной
безопасности. В этом случае роль позволяет выполнить первоначальную
настройку серверов с учетной записью Администратора ОС и последующую
инсталляцию кластера Администратором БД.

Независимо от варианта инсталляции кластера процессы инстансов на
серверах могут быть запущены под сервисной учетной записью (см.
параметры `user` и `group`).

## Требования для установки кластера {: #requirements }

Для удобства администрирования кластера корневые директории желательно
(но не обязательно) располагать в отдельном разделе (`/opt`, `/data`,
`/app`).

На серверах кластера должны быть выполнены действия:

- установлен пакет `picodata` необходимой версии (его
  можно установить на шаге [Первоначальная настройка серверов](#server_setup))
- должна присутствовать утилита `setfacl` (обычно находится в пакете
  `acl`)
- создана учетная записи для Администратора ОС (с полными
  sudo-полномочиями без запроса пароля), например `sysadm`
- создана учетная записи для Администратора БД, например `dbadm`
- создана учетная записи для пользователя, указанного в параметре
  `user`, например `picodata`. Администратор БД должен иметь возможность
  переключения на эту учетную запись без запроса пароля (`sudo -su
  picodata`)

Параметры создания учетной записи, указанной для `user`:

```
create_home=yes
shell=/sbin/nologin
```

Для примера, настройка правил sudo для возможности переключения на
учетную запись `picodata` из-под пользователя `dbadm`:

```shell
Cmnd_Alias SHELL = /bin/sh, /bin/bash"
dbadm ALL = (picodata) NOPASSWD: SHELL
```

В инвентарном файле:

- определите директории: `conf_dir`, `data_dir`, `run_dir`, `log_dir`,
  `share_dir`
- выставите переменные:
    ```
    user: picodata
    group: picodata
    rootless: true
    ```

## Настройки для Systemd {: #systemd }

Рекомендуем использовать именно этот вариант для установки кластера.

### Первоначальная настройка серверов {: #server_setup }

Выполняется под учетной записью Администратора ОС, например `sysadm`.

Первоначальная настройка серверов состоит из следующих шагов:

- при отсутствии на серверах пакета `picodata` подключите репозиторий
  Picodata и установите из него пакет `picodata` последней
  доступной версии; если отсутствует доступ в интернет, то в переменной
  `picodata_package_path` можно указать путь до пакета Picodata для
  установки на серверах, при этом пакет должен находиться на станции
  управления Ansible
- создайте директории для работы `picodata`
- создайте службу systemd для `supervisord` (при выборе системы
  управления процессами Supervisord)
- при выводе журналов в файлы, создайте logrotate-файл для их
  подрезки

Здесь и далее в примерах плейбук `picodata.yml` взят из [руководства по
роли Ansible](deploy_ansible.md#multi_tier_cluster).


```yaml
---
- name: Deploy picodata cluster
  hosts: all
  become: true

  tasks:

  - name: Import picodata-ansible role
    ansible.builtin.import_role:
      name: picodata-ansible
```

Выполните команду для подготовки серверов:

```shell
ansible-playbook -i <inventory> picodata.yml -t deploy_become -u sysadm -k
```

### Инсталляция кластера {: #install_cluster }

Выполняется под учетной записью Администратора БД, например `dbadm`.

Установите кластер командой:

```shell
ansible-playbook -i <inventory> picodata.yml -u dbadm --become-user=picodata -k
```

При этом задачи, требующие повышенных привилегий, будут пропущены.

!!! note "Рекомендация"
    Используйте доступ к серверам по ssh-ключу вместо пароля.

### Управление кластером без повышения привилегий {: #systemd_user_mgmt }

Администратор БД может работать с процессами инстансов при переключении
на пользователя, указанного в параметре `user`.

После переключения на пользователя `user` для работы `systemctl`
выставите переменную окружения `XDG_RUNTIME_DIR` командой:

```shell
export XDG_RUNTIME_DIR=/run/user/$(id -u)
```

Примеры команд для управления процессами инстансов на серверах кластера,
которые может выполнять Администратор БД (без sudo):

```shell
systemctl --user --all status test@*
systemctl --user restart test@default-1000
systemctl --user -s HUP kill test@router-1001
systemctl --user --all stop test@*
```

Где:

- `cluster_name` = `test`
- `default-1000`, `router-1001` — названия инстансов кластера

### Удаление кластера {: #remove_cluster }

Удаление кластера выполняется в обратном порядке: сначала под учетной
записью Администратора БД (например `dbadm`) остановите кластер и
удалите данные, затем, при необходимости, под Администратором ОС удалите
системные файлы и директории.

Для удаления кластера выполните команду:

```shell
ansible-playbook -i <inventory> picodata.yml -t remove -u dbadm --become-user=picodata -k
```

### Очистка серверов от системных файлов кластера {: #server_cleanup }

Выполняется под учетной записью Администратора ОС, например `sysadm`.

Для очистки серверов выполните команду:

```shell
ansible-playbook -i <inventory> picodata.yml -t remove_become -u sysadm -k
```

При этом будут удалены все корневые директории, которые были созданы для
кластера.


## Настройки для Supervisord {: #supervisord }

На серверах:

- установите пакет `supervisor`

В инвентарном файле:

- при необходимости определите директории: `supervisord_dir`
- выставите значение переменной `init_system` в `supervisord`

Первоначальная настройка серверов, инсталляция и удаление кластера
проводятся теми же командами, как и для `supervisord`.

### Работа с кластером через Supervisord {: #supervisord_cluster_mgmt }

Примеры команд для управления процессами инстансов на серверах кластера,
которые может выполнять Администратор БД:

```shell
supervisorctl -c /data/picodata/supervisord/test.conf status
supervisorctl -c /data/picodata/supervisord/test.conf restart default-1000
supervisorctl -c /data/picodata/supervisord/test.conf signal HUP router-1001
supervisorctl -c /data/picodata/supervisord/test.conf stop all
```

Где:

- `supervisor_dir` = `/data/picodata/supervisord`
- `cluster_name` = `test`
- `default-1000`, `router-1001` — названия инстансов

Для удобства администратора можно установить псевдоним (alias) в командной оболочке:

```shell
picosuper='supervisorctl -c /data/picodata/supervisord/test.conf'
```

и в дальнейшем использовать его при вызове команд:

```shell
picosuper status
picosuper restart default-1000
picosuper signal HUP router-1001
picosuper stop all
```
