vlastní konfigurační soubor pro linux rubrika: Administrace: Software

5 kx.matejka
položil/-a 3.3.2015

Ahoj, potřeboval bych pro svojí aplikaci, která se skládá z kupy python/bash scriptů udělat konfigurační soubor, kde bude zapsané vše potřebné. Zdál se mi jako dobrý nápad použít json, ovšem už jsem narazil. Parser jq dělá bordel když jsou v hodnotách mezery. Je nějaká best practice pro ukládání konfiguračního souboru? Potřebuju ukládat různé hodnoty nijak spolu nesouvisející, něco bude jednoduchá hodnota, jindy to bude pole. Malý příklad co se tam může vyskytovat

{
    "server": {
        "protocol": "http",
        "adress": "10.7.64.206",
        "port": "7331"
    },
    "cron": [
        {
            "interval": "1 * * * *",
            "user": "root",
            "command": "/etc/wsc/test.sh"
        },
        {
            "interval": "*/15 * * * *",
            "user": "root",
            "command": "/srv/scripts/test.sh"
        }
    ]
}

Nebo by to bylo lepší rozdělit do různých souborů?

Komentáře

  • messa : "Parser jq dělá bordel když jsou v hodnotách mezery." - v tom případě je to špatný parser, ale tomu moc nevěřím. V čem je problém konkrétně? Třeba jen špatně pracuješ s jeho výstupem. Jinak tohle vypadá jako configuration management, zkus se podívat na Puppet, Salt apod. 3.3.2015
  • kx.matejka : ahoj samozřejmě bych rád dál používal json, protože ho čtu jako čítanku. problém neumím přesně určit, rozhodně jakmile se do hodnoty dostanou hvězdičky a mezery tak je zle, ale v některých případech jsem dostal nesmyslný výstup i když byly mezerou odděleny dvě čísla. např echo '{"property":"* * 8 8"}' | jq -r '.property' vrátí * * 8 8 to je v pořádku, jakmile chci výstup uložit do proměnné tak už to vypisuje nesmysly property=$(echo '{"property":"* * 8 8"}' | jq -r '.property') stejně tak echo $(echo '{"property":"* * 8 8"}' | jq -r '.property') rozdíl není ani v tom když je json čten ze souboru, ovšem přesměrování výstupu do souboru funguje echo $(echo '{"property":"* * 8 8"}' | jq -r '.property') > vystup.txt ale nebudu si dělat dočasné soubory místo proměnných kdo by se chtěl přesvědčit na vlastní oči https://github.com/stedolan/jq btw: vypadá to, že nesmysly rovnají se, za každou mezeru s hvězdičkou jeden výpis souborů v adresáři 4.3.2015
  • Taco : @kx.mx: Nemohl by být problém v tom, že ten bash hvězdičku vyhodnocuje? 4.3.2015
  • Kit : Často stačí jen vložit proměnnou do uvozovek a problém zmizí. 4.3.2015
odkaz Vyřešeno
3 tomas_3
odpověděl/-a 6.3.2015

Do aplikacie mozu konfiguracie vstupovat roznymi sposobmi, napr:

  • premenne prostredia
  • premenna VM prostredia (napr java System.getProperty())
  • konfiguracne subory
  • parametre prikazovej riadky

Vacsinou ked som robil konfiguracie, tak sa mi osvedcilo nacitavat konfiguracne volby v tomto poradi:

  1. parameter prikazovej riadky
  2. premenna prostredia
  3. hodnota z externeho konfiguracneho suboru (napr /etc/myapp/conf)
  4. default hodnota z konfiguracneho suboru vramci aplikacie

V tvojom pripade by som si urobil nejaky .sh skript, kde budu konfiguracne volby ako premenny prostredia, napr:

export server_protocol="http"
export server_address="..."

V bashovom skripte si ho potom mozes nasourcovat:

#!/bin/bash
source /etc/myapp/configuration
 
# nejaky bash kod co pristupuje k $server_address

A python skripty by som volal podobne nasourcovane bashovym skriptom:

#!/bin/bash
source /etc/myapp/configuration
 
cd workdir
python -m MY_MODULE

Potom v pythone pristupujes ku konfiguracii cez:

import os
os.getenv('server_address')

Druha moznost je nesourcovat konfiguraciu priamo v skripte ale priamo v prostredi napr. v .profile alebo .bash_rc

Pro zobrazení všech 3 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.