Перейти к основному содержимому

Задание 2: Развертывание по умолчанию с помощью Pangolin Installer

В этом разделе мы изучим процесс проверки корректности виртуального окружения, выполним запуск установки по умолчанию и последующую проверку ее результатов. Завершающим этапом будет подключение к кластеру для подтверждения его работоспособности.

Проверка виртуального окружения​

Виртуальное окружение Python было установлено в задании второго уровня этой темы.

Проверим:

[student@srv1 ~]$ rpm -qa 'pangolin*venv*er'
pangolin-ansible-venv-controller-6.7.0-redos8.0.x86_64

Виртуальное окружение представляет собой каталог с программным обеспечением Python:

[student@srv1 ~]$ ls -ld /opt/pangolin*venv*er
drwxr-xr-x 6 root root 4096 апр 17 14:43 /opt/pangolin-ansible-venv-controller

В этом каталоге все необходимое ПО для работы ролей Ansible, выполняющих установку СУБД Pangolin.

В частности, в подкаталоге bin имеется скрипт activate, позволяющий активировать виртуальное окружение:

[student@srv1 ~]$ ls -l /opt/pangolin*venv*er/bin/a*te
-rw-r--r-- 1 root root 1764 апр 17 14:22 /opt/pangolin-ansible-venv-controller/bin/activate

Права на исполнение у этого скрипта отсутствуют, так как он предназначен для загрузки в текущую оболочку с помощью команд source или . (точка).

Сравним значение переменной окружения PATH до активации виртуального окружения:

[student@srv1 ~]$ echo $PATH
/home/student/.local/bin:/home/student/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
[student@srv1 ~]$ which python
/usr/bin/python

И после:

[student@srv1 ~]$ . /opt/pangolin-ansible-venv-controller/bin/activate
(pangolin-ansible-venv-controller) [student@srv1 ~]$ echo $PATH
/opt/pangolin-ansible-venv-controller/bin:/home/student/.local/bin:/home/student/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
(pangolin-ansible-venv-controller) [student@srv1 ~]$ which python
/opt/pangolin-ansible-venv-controller/bin/python

В виртуальном окружении установлены Python пакеты:

(pangolin-ansible-venv-controller) [student@srv1 ~]$ pip list
Package Version
------------ -------
ansible 4.10.0
ansible-core 2.11.7
cffi 2.0.0
cryptography 46.0.3
dnspython 2.7.0
Jinja2 3.1.6
jmespath 1.0.1
MarkupSafe 3.0.3
netaddr 0.8.0
packaging 25.0
pip 25.3
pycparser 2.23
pyparsing 3.2.1
PyYAML 6.0.3
resolvelib 0.5.4
setuptools 80.9.0
six 1.17.0
wheel 0.45.1

А в ОС Ansible посредством RPM не установлен:

[student@srv1 ~]$ rpm -qa | grep -i ^ansible

Запуск установки по умолчанию​

После выполнения задания второго уровня уже установлен и работает кластер из трех узлов. Ставится задача выполнить повторную установку по умолчанию. При этом Pangolin Installer должен автоматически удалить предыдущий развернутый кластер.

Воспользуемся уже существующим файлом конфигурации, в котором не производилось никаких изменений:

[student@srv1 ~]$ less config.yml
Вывод команды:

hosts:
master:
hostname: srv1
username: student
password: student
replica:
hostname: srv2
username: student
password: student
arbiter:
hostname: srv3
username: student
password: student
local_distr_path: /home/student/Distr/distributive
pangolin_license_path: /home/student/license.json
tune_pangolin_local_repo: true
[student@srv1 ~]$ /opt/pangolin-ansible-venv-controller/bin/pangolin-installer terminal -c config.yml -a install
Вывод команды:

Запуск предварительных проверок.
Предварительные проверки пройдены.
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| clean |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Node | Action | CPU | MEM | Disk available | OS | Version OS | Packages Removed | Packages Installed | Configuration |
|----------------|---------|-----|------|--------------------------|--------|------------|------------------------------------------|--------------------|---------------|
| node: master | install | 1 | 4 GB | / 14G | RED OS | 8.0 | pangolin-ansible-venv-controller (6.7.0) | | cluster |
| ip/dns: (srv1) | | | | | | | pangolin-installer (1.0.3) | | |
| | | | | | | | pangolin-timescaledb-6.7-apache (2.25.0) | | |
| | | | | | | | pangolin-ansible-venv-controlled (6.7.0) | | |
| | | | | | | | pangolin-auth-password (6.7.0) | | |
| | | | | | | | pangolin-certs-rotate (6.7.0) | | |
| | | | | | | | pangolin-security-utilities (6.7.0) | | |
| | | | | | | | pangolin-dbms-6.7 (6.7.0) | | |
| | | | | | | | pangolin-dbms-6.7-client (6.7.0) | | |
| | | | | | | | pangolin-manager-venv (2.1.13) | | |
| | | | | | | | pangolin-manager (2.1.13) | | |
| | | | | | | | pangolin-backup-tools-venv (6.7.0) | | |
| | | | | | | | pangolin-backup-tools (6.7.0) | | |
| | | | | | | | pangolin-pooler (1.5.6) | | |
| | | | | | | | pangolin-diagnostic-tool (6.7.0) | | |
| | | | | | | | pangolin-auth-reencrypt (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-pltcl (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-plperl (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-jsonb-plperl (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-hstore-plperl (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-bool-plperl (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-plpython3 (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-ltree-plpython3 (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-jsonb-plpython3 (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-hstore-plpython3 (6.7.0) | | |
| | | | | | | | pangolin-tuner (1.1.1) | | |
| | | | | | | | | | |
| node: replica | install | 1 | 4 GB | / 18G | RED OS | 8.0 | pangolin-timescaledb-6.7-apache (2.25.0) | | cluster |
| ip/dns: (srv2) | | | | | | | pangolin-ansible-venv-controlled (6.7.0) | | |
| | | | | | | | pangolin-auth-password (6.7.0) | | |
| | | | | | | | pangolin-certs-rotate (6.7.0) | | |
| | | | | | | | pangolin-security-utilities (6.7.0) | | |
| | | | | | | | pangolin-dbms-6.7 (6.7.0) | | |
| | | | | | | | pangolin-dbms-6.7-client (6.7.0) | | |
| | | | | | | | pangolin-manager-venv (2.1.13) | | |
| | | | | | | | pangolin-manager (2.1.13) | | |
| | | | | | | | pangolin-backup-tools-venv (6.7.0) | | |
| | | | | | | | pangolin-backup-tools (6.7.0) | | |
| | | | | | | | pangolin-pooler (1.5.6) | | |
| | | | | | | | pangolin-diagnostic-tool (6.7.0) | | |
| | | | | | | | pangolin-auth-reencrypt (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-pltcl (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-plperl (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-jsonb-plperl (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-hstore-plperl (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-bool-plperl (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-plpython3 (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-ltree-plpython3 (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-jsonb-plpython3 (6.7.0) | | |
| | | | | | | | pangolin-dbms-6-hstore-plpython3 (6.7.0) | | |
| | | | | | | | pangolin-tuner (1.1.1) | | |
| | | | | | | | | | |
| node: arbiter | install | 1 | 4 GB | / 19G | RED OS | 8.0 | | | cluster |
| ip/dns: (srv3) | | | | | | | | | |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

Процедура очистит стенд от компонентов Pangolin. Продолжить? (Y/N): Y
Выполняемая задача: clean
🟢 Роль MAIN PLAY - Завершена! [Время выполнения: 0:02:14] Задач выполнено: 43 | | |#####################################|
Очистка стенда(ов) прошла успешно!
Запуск предварительных проверок.
Предварительные проверки пройдены.
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| install |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Node | Action | CPU | MEM | Disk available | OS | Version OS | Packages Removed | Packages Installed | Configuration |
|----------------|---------|-----|------|--------------------------|--------|------------|------------------------------------------|--------------------|---------------|
| node: master | install | 1 | 4 GB | / 15G | RED OS | 8.0.2 | pangolin-ansible-venv-controller (6.7.0) | | cluster |
| ip/dns: (srv1) | | | | | | | pangolin-installer (1.0.3) | | |
| | | | | | | | pangolin-timescaledb-6.7-apache (2.25.0) | | |
| | | | | | | | | | |
| node: replica | install | 1 | 4 GB | / 20G | RED OS | 8.0.2 | pangolin-timescaledb-6.7-apache (2.25.0) | | cluster |
| ip/dns: (srv2) | | | | | | | | | |
| node: arbiter | install | 1 | 4 GB | / 20G | RED OS | 8.0.2 | | | cluster |
| ip/dns: (srv3) | | | | | | | | | |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Выполняемая задача: install
🟢 Роль MAIN PLAY - Завершена! [Время выполнения: 0:00:10] Задач выполнено: 20 | | |#####################################|
🟢 Роль PANGOLIN_CHECKS - Завершена! [Время выполнения: 0:07:16] Задач выполнено: 662 | | |#####################################|
🟢 Роль PANGOLIN_LICENSE - Завершена! [Время выполнения: 0:00:04] Задач выполнено: 7 | | |#####################################|
🟢 Роль PANGOLIN_AUTH_PASSWORD - Завершена! [Время выполнения: 0:00:05] Задач выполнено: 8 | | |#####################################|
🟢 Роль ETCD - Завершена! [Время выполнения: 0:00:31] Задач выполнено: 34 | | |#####################################|
🟢 Роль PANGOLIN_CERTS_ROTATE - Завершена! [Время выполнения: 0:00:23] Задач выполнено: 26 | | |#####################################|
🟢 Роль PANGOLIN_SECURITY_UTILITIES - Завершена! [Время выполнения: 0:00:08] Задач выполнено: 18 | | |#####################################|
🟢 Роль PANGOLIN_DBMS - Завершена! [Время выполнения: 0:00:57] Задач выполнено: 96 | | |#####################################|
🟢 Роль PANGOLIN_MANAGER - Завершена! [Время выполнения: 0:01:06] Задач выполнено: 31 | | |#####################################|
🟢 Роль PANGOLIN_BACKUP_TOOLS - Завершена! [Время выполнения: 0:00:14] Задач выполнено: 37 | | |#####################################|
🟢 Роль PANGOLIN_POOLER - Завершена! [Время выполнения: 0:00:17] Задач выполнено: 16 | | |#####################################|
🟢 Роль PANGOLIN_POOLER_MT - Завершена! [Время выполнения: 0:00:00] Задач выполнено: 5 | | |#####################################|
🟢 Роль PANGOLIN_DIAGNOSTIC_TOOL - Завершена! [Время выполнения: 0:00:06] Задач выполнено: 12 | | |#####################################|
🟢 Роль PANGOLIN_AUTH_REENCRYPT - Завершена! [Время выполнения: 0:00:18] Задач выполнено: 20 | | |#####################################|
🟢 Роль PANGOLIN_UNTRUSTED_EXTENSIONS - Завершена! [Время выполнения: 0:01:02] Задач выполнено: 151 | | |#####################################|
🟢 Роль CONFIGURE - Завершена! [Время выполнения: 0:01:51] Задач выполнено: 167 | | |#####################################|
Установка Pangolin прошла успешно!
Запуск предварительных проверок.
Предварительные проверки пройдены.
|---------------------------------------------------------------------------|
| after install |
|---------------------------------------------------------------------------|
| Node | Action | Packages Installed |
|----------------|---------------|------------------------------------------|
| node: master | after install | pangolin-ansible-venv-controller (6.7.0) |
| ip/dns: (srv1) | | pangolin-installer (1.0.3) |
| | | pangolin-timescaledb-6.7-apache (2.25.0) |
| | | pangolin-ansible-venv-controlled (6.7.0) |
| | | pangolin-auth-password (6.7.0) |
| | | pangolin-certs-rotate (6.7.0) |
| | | pangolin-security-utilities (6.7.0) |
| | | pangolin-dbms-6.7 (6.7.0) |
| | | pangolin-dbms-6.7-client (6.7.0) |
| | | pangolin-manager-venv (2.1.13) |
| | | pangolin-manager (2.1.13) |
| | | pangolin-backup-tools-venv (6.7.0) |
| | | pangolin-backup-tools (6.7.0) |
| | | pangolin-pooler (1.5.6) |
| | | pangolin-diagnostic-tool (6.7.0) |
| | | pangolin-auth-reencrypt (6.7.0) |
| | | pangolin-dbms-6-pltcl (6.7.0) |
| | | pangolin-dbms-6-plperl (6.7.0) |
| | | pangolin-dbms-6-jsonb-plperl (6.7.0) |
| | | pangolin-dbms-6-hstore-plperl (6.7.0) |
| | | pangolin-dbms-6-bool-plperl (6.7.0) |
| | | pangolin-dbms-6-plpython3 (6.7.0) |
| | | pangolin-dbms-6-ltree-plpython3 (6.7.0) |
| | | pangolin-dbms-6-jsonb-plpython3 (6.7.0) |
| | | pangolin-dbms-6-hstore-plpython3 (6.7.0) |
| | | pangolin-tuner (1.1.1) |
| | | |
| node: replica | after install | pangolin-timescaledb-6.7-apache (2.25.0) |
| ip/dns: (srv2) | | pangolin-ansible-venv-controlled (6.7.0) |
| | | pangolin-auth-password (6.7.0) |
| | | pangolin-certs-rotate (6.7.0) |
| | | pangolin-security-utilities (6.7.0) |
| | | pangolin-dbms-6.7 (6.7.0) |
| | | pangolin-dbms-6.7-client (6.7.0) |
| | | pangolin-manager-venv (2.1.13) |
| | | pangolin-manager (2.1.13) |
| | | pangolin-backup-tools-venv (6.7.0) |
| | | pangolin-backup-tools (6.7.0) |
| | | pangolin-pooler (1.5.6) |
| | | pangolin-diagnostic-tool (6.7.0) |
| | | pangolin-auth-reencrypt (6.7.0) |
| | | pangolin-dbms-6-pltcl (6.7.0) |
| | | pangolin-dbms-6-plperl (6.7.0) |
| | | pangolin-dbms-6-jsonb-plperl (6.7.0) |
| | | pangolin-dbms-6-hstore-plperl (6.7.0) |
| | | pangolin-dbms-6-bool-plperl (6.7.0) |
| | | pangolin-dbms-6-plpython3 (6.7.0) |
| | | pangolin-dbms-6-ltree-plpython3 (6.7.0) |
| | | pangolin-dbms-6-jsonb-plpython3 (6.7.0) |
| | | pangolin-dbms-6-hstore-plpython3 (6.7.0) |
| | | pangolin-tuner (1.1.1) |
| | | |
| node: arbiter | after install | |
| ip/dns: (srv3) | | |
|---------------------------------------------------------------------------|

Проверка результатов установки​

После успешной установки должен работать кластер физической репликации с тремя узлами:

  • мастер
  • реплика
  • арбитр

Собственно кластер физической репликации входят лишь мастер и реплика. Но с точки зрения etcd - системы управления распределенной конфигурацией, арбитр – тоже часть кластера, на которой нет СУБД.

Проверим процессы в кластере:

  • На мастере:

    [student@srv1 ~]$ ps f -C postgres
    PID TTY STAT TIME COMMAND
    40745 ? S 0:07 /usr/pangolin-6.7/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0
    40748 ? Ss 0:00 \_ postgres: clustername: logger
    40749 ? Ss 0:00 \_ postgres: clustername: checkpointer
    40750 ? Ss 0:01 \_ postgres: clustername: background writer
    40752 ? Ss 0:00 \_ postgres: clustername: idle sessions terminator
    40753 ? Ss 0:00 \_ postgres: clustername: walwriter
    40754 ? Ss 0:00 \_ postgres: clustername: autovacuum launcher
    40755 ? Ss 0:00 \_ postgres: clustername: integrity check launcher
    40756 ? Ss 0:00 \_ postgres: clustername: license checker
    40757 ? Ss 0:17 \_ postgres: clustername: authproc
    40758 ? Ss 0:00 \_ postgres: clustername: password policy cache
    40759 ? Ss 0:01 \_ postgres: clustername: pg_cron launcher
    40760 ? Ss 0:00 \_ postgres: clustername: logical replication launcher
    40765 ? Ss 0:09 \_ postgres: clustername: patroni postgres 127.0.0.1(51048) idle
    40769 ? Ss 0:08 \_ postgres: clustername: walsender patroni <IP-Address2>(33130) streaming 0/6000000
  • На реплике:

    [student@srv1 ~]$ ssh srv2 ps f -C postgres
    PID TTY STAT TIME COMMAND
    25402 ? S 0:00 /usr/pangolin-6.7/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=clustername --wal_level=replica --hot_standby=on --max_connections=110 --max_wal_senders=10 --max_prepared_transactions=3 --max_locks_per_transaction=64 --track_commit_timestamp=False --max_replication_slots=10 --max_worker_processes=32 --wal_log_hints=True --authentication_max_workers=16 --enable_page_compression=off
    25405 ? Ss 0:00 \_ postgres: clustername: logger
    25406 ? Ss 0:00 \_ postgres: clustername: checkpointer
    25407 ? Ss 0:01 \_ postgres: clustername: background writer
    25408 ? Ss 0:00 \_ postgres: clustername: startup recovering 000000020000000000000005
    25409 ? Ss 0:00 \_ postgres: clustername: idle sessions terminator
    25410 ? Ss 0:16 \_ postgres: clustername: authproc
    25411 ? Ss 0:00 \_ postgres: clustername: password policy cache
    25412 ? Ss 0:34 \_ postgres: clustername: walreceiver streaming 0/6000000
    25415 ? Ss 0:00 \_ postgres: clustername: integrity check launcher
    25416 ? Ss 0:00 \_ postgres: clustername: license checker
    25419 ? Ss 0:06 \_ postgres: clustername: patroni postgres 127.0.0.1(52666) idle

Есть более удобные механизмы проверки работоспособности кластера:

[student@srv1 ~]$ sudo su - postgres
===============================================================
You are connected to Pangolin Cluster (clustername)
- Hostname : srv1
- IP Address : <IP-Address1>
---------------------------------------------------------------
- node ( master ) : <IP-Address1>
- node ( replica ) : <IP-Address2>
- arbiter : <IP-Address3>
- Manager version : 2.1.13
- Pangolin version : 6.7.0
===============================================================
[postgres@srv1 ~]$ alias
Вывод команды:

alias egrep='egrep --color=auto'
alias elog='cat /pgerrorlogs/srv1/etcd/etcd.log'
alias errors='ls -t /pgerrorlogs/srv1/postgresql-2026-04-19*.log | head -1 | xargs tail -F | grep -E '\''WARNING|ERROR|FATAL|ПРЕДУПРЕЖДЕНИЕ|ОШИБКА|ВАЖНО'\'''
alias fail='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml failover $CLNAME'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias hba='vi $PGDATA/pg_hba.conf'
alias health='curl -k -m 3 http://srv1:2379/health;echo " http://srv1:2379";curl -k -m 3 http://srv2:2379/health;echo " http://srv2:2379";curl -k -m 3 http://srv3:2379/health;echo " http://srv3:2379"'
alias hist='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml history $CLNAME'
alias l.='ls -d .* --color=auto'
alias list='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list $CLNAME'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mc='. /usr/libexec/mc/mc-wrapper.sh'
alias members='etcdctl --endpoints=srv1:2379,srv2:2379,srv3:2379 member list -w table'
alias pgconfig='curl -k -s -m 3 http://srv1:8008/config | jq'
alias pglog='ls -t /pgerrorlogs/srv1/postgresql-$NOW*.log | head -1 | xargs tail -n 300'
alias pgver='psql -c '\''select version();'\'' | sed "s| on | ($(psql --single-line --no-align -c '\''select product_version();'\'' | sed '\''2q;d'\'' )) on |"'
alias ptlog='ls -t /pgerrorlogs/srv1/pangolin-manager/pangolin-manager*.log | head -1 | xargs tail -n 300'
alias ptver='pangolin-manager-ctl version'
alias reload='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload $CLNAME'
alias restart='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart $CLNAME'
alias status='sudo systemctl status pangolin-manager --no-pager --full'
alias switch='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml switchover $CLNAME'
alias xzegrep='xzegrep --color=auto'
alias xzfgrep='xzfgrep --color=auto'
alias xzgrep='xzgrep --color=auto'
alias zegrep='zegrep --color=auto'
alias zfgrep='zfgrep --color=auto'
alias zgrep='zgrep --color=auto'

Список членов кластера с точки зрения etcd:

[postgres@srv1 ~]$ members
|--------------------------------------------------------------------------------------|
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
|--------------------------------------------------------------------------------------|
| e6662c02ef00263 | started | srv3 | http://srv3:2380 | http://srv3:2379 | false |
| 8645e1dba92d1be2 | started | srv2 | http://srv2:2380 | http://srv2:2379 | false |
| e739b3d2d28502b5 | started | srv1 | http://srv1:2380 | http://srv1:2379 | false |
|--------------------------------------------------------------------------------------|

Исправность узлов с точки зрения etcd:

[postgres@srv1 ~]$ health
{"health":"true","reason":""} http://srv1:2379
{"health":"true","reason":""} http://srv2:2379
{"health":"true","reason":""} http://srv3:2379

Список узлов кластера с точки зрения Pangolin Manager:

[postgres@srv1 ~]$ list
+ Cluster: clustername (7630156715853689531) --------------------------------------|
| Member | Host | Role | State | TL | Lag in MB | Pending restart |
|----------------------------------------------------------------------------------|
| srv1 | srv1:5433 | Leader | running | 2 | | * |
| srv2 | srv2:5433 | Sync Standby | streaming | 2 | 0 | |
|----------------------------------------------------------------------------------|

Подключение к кластеру​

В файле Distr/distributive/installer/group_vars/custom_config_initial.yml имеется секция с предустановленными паролями по умолчанию.

Получим пароль суперпользователя СУБД, автоматически использованный при установке по умолчанию:

[student@srv1 ~]$ awk '/postgres_db_pass:/{print $2}' Distr/distributive/installer/group_vars/custom_config_initial.yml
'<password>'

Проверим:

[student@srv1 ~]$ psql -c 'SELECT product_version()' "host=srv1 port=5433 user=postgres password='<password>'"
product_version
-------------------------------------------
Platform V Pangolin DB 6.7.0
(1 row)

Подведем итоги​

Вопрос 1

Вопрос 1: Какие встроенные команды оболочки Bash можно использовать для активации виртуального окружения Python?

Вопрос 2

Вопрос 2: Какая команда (alias) показывает список узлов кластера etcd?