Latar Belakang
Pada artikel sebelumnya saya menulis tentang cara mengkonfigurasi aplikasi Anda menggunakan Sitri , namun, saya melewatkan momen dengan pengembangan lokal, karena Anda akan setuju bahwa tidak nyaman untuk menggunakan vault secara lokal, dan menyimpan konfigurasi lokal di brankas umum, terutama jika itu adalah proyek beberapa orang bekerja - sangat merepotkan.
Sitri — , , json .
, , local_mode , ENV = "local" :) , provider_config.py BaseConfig Config . , , , .
import hvac
from sitri.providers.contrib.system import SystemConfigProvider
from sitri.providers.contrib.vault import VaultKVConfigProvider
from sitri.settings.contrib.vault import VaultKVSettings
configurator = SystemConfigProvider(prefix="superapp")
ENV = configurator.get("env")
is_local_mode = ENV == "local"
local_mode_file_path = configurator.get("local_mode_file_path")
def vault_client_factory() -> hvac.Client:
client = hvac.Client(url=configurator.get("vault_api"))
client.auth_approle(
role_id=configurator.get("role_id"),
secret_id=configurator.get("secret_id"),
)
return client
provider = VaultKVConfigProvider(
vault_connector=vault_client_factory,
mount_point=f"{configurator.get('app_name')}/{ENV}",
)
class BaseConfig(VaultKVSettings.VaultKVSettingsConfig):
provider = provider
local_mode = is_local_mode
local_provider_args = {"json_path": local_mode_file_path}
local_provider_args JsonConfigProvider, , — - . , , local_provider.
, . , Kafka :
from typing import Any, Dict
from pydantic import Field
from sitri.settings.contrib.vault import VaultKVSettings
from superapp.config.provider_config import BaseConfig, configurator
class KafkaSettings(VaultKVSettings):
mechanism: str = Field(..., vault_secret_key="auth_mechanism")
brokers: str = Field(...)
auth_data: Dict[str, Any] = Field(...)
class Config(BaseConfig):
default_secret_path = "kafka"
default_mount_point = f"{configurator.get('app_name')}/common"
local_mode_path_prefix = "kafka"
. local_mode_path_prefix , json . , json :
{
"db":
{
"host": "testhost",
"password": "testpassword",
"port": 1234,
"user": "testuser"
},
"faust":
{
"agents":
{
"X":
{
"concurrency": 2,
"partitions": 5
}
},
"app_name": "superapp-workers",
"default_concurrency": 5,
"default_partitions_count": 10
},
"kafka":
{
"auth_data":
{
"password": "testpassword",
"username": "testuser"
},
"brokers": "kafka://test",
"mechanism": "SASL_PLAINTEXT"
}
}
… , . , . , main.py __main__.py, docker-compose.
, — Dockerfile:
FROM python:3.8.3-buster ENV PYTHONUNBUFFERED=1 \ POETRY_VIRTUALENVS_CREATE=false \ POETRY_VIRTUALENVS_IN_PROJECT=false \ POETRY_NO_INTERACTION=1 RUN pip install poetry RUN mkdir /superapp/ WORKDIR /superapp/ COPY ./pyproject.toml ./poetry.lock /superapp/ RUN poetry install --no-ansi WORKDIR /
, , .
, env- local-mode :
SUPERAPP_ENV=local SUPERAPP_LOCAL_MODE_FILE_PATH=/config.json SUPERAPP_APP_NAME=superapp
, , Vault , , Vault.
, — docker-compose.yml :
# docker-compose config for local development version: '3' services: superapp: command: python3 -m superapp restart: always build: context: ./ dockerfile: Dockerfile volumes: - ./superapp:/superapp - ./config.json:/config.json env_file: - .env.local
Seperti yang Anda lihat, semuanya juga sederhana di sini. Kami meletakkan file json kami di root, seperti yang ditunjukkan di atas dalam variabel lingkungan untuk container.
Sekarang, luncurkan:
docker-compose up
Creating article_sitri_vault_pydantic_superapp_1 ... done
Attaching to article_sitri_vault_pydantic_superapp_1
superapp_1 | db=DBSettings(user='testuser', password='testpassword', host='testhost', port=1234) faust=FaustSettings(app_name='superapp-workers', default_partitions_count=10, default_concurrency=5, agents={'X': AgentConfig(partitions=5, concurrency=2)}) kafka=KafkaSettings(mechanism='SASL_PLAINTEXT', brokers='kafka://test', auth_data={'password': 'testpassword', 'username': 'testuser'})
superapp_1 | {'db': {'user': 'testuser', 'password': 'testpassword', 'host': 'testhost', 'port': 1234}, 'faust': {'app_name': 'superapp-workers', 'default_partitions_count': 10, 'default_concurrency': 5, 'agents': {'X': {'partitions': 5, 'concurrency': 2}}}, 'kafka': {'mechanism': 'SASL_PLAINTEXT', 'brokers': 'kafka://test', 'auth_data': {'password': 'testpassword', 'username': 'testuser'}}}
Seperti yang Anda lihat, semuanya dimulai dengan sukses dan informasi dari file json kami berhasil melewati semua pemeriksaan dan menjadi pengaturan untuk versi lokal aplikasi, yuhhu!
Saya meletakkan kode untuk artikel ini di cabang terpisah, sehingga Anda dapat masuk, memiringkan, dan menguji semuanya sendiri :)
cabang