Jeg ved ikke, hvad jeg skal sammenligne provisioning med. Måske med en kat? Man kan godt klare sig uden, men det er lidt bedre med én. Især hvis den arbejder ))
Problemformulering:
- Jeg vil gerne konfigurere SIP-telefoner hurtigt, nemt og sikkert. Ved installation af telefonen og især ved omkonfiguration.
- Mange leverandører har deres egne konfigurationsformater, egne værktøjer til generering af konfigurationer, egne metoder til beskyttelse af konfigurationer. Og man har ikke rigtig lyst til at forstå hver enkelt.
- Mange løsninger til provisioning, a) er rettet mod én leverandør eller ét telefonsystem, b) er ret klodsede at implementere, en masse scripts, parametre, br-rr…
Angående punkt 3 vil jeg kommentere, at der findes fremragende provisioning-systemer , , , hvor der er skabeloner tilgængelige for telefoner fra forskellige leverandører. Der findes også kommercielle løsninger, hvor man kan konfigurere telefoner fra forskellige producenter i provisioning-modulet, f.eks. Yeastar PBX.
Der er også masser af opskrifter på Habr om, hvordan man konfigurerer apparater fra forskellige leverandører: , . Men som sagt har alle systemer en fatal mangel. Derfor vil vi lave vores egen løsning.
vores eget format
Som sagt i xkcd, hvis du ikke vil forstå 14 formater — Derfor bruger vi generelle indstillinger til enhver telefon og laver vores eget JSON-konfigurationsformat.
Sådan her:
{
"key": "sdgjdeu9443908",
"token": "590sfdsf8u984",
"model": "gxp1620",
"vendor": "grandstream",
"mac": "001565113af8",
"timezone_offset": "GMT+03",
"ntp_server": "pool.ntp.org",
"status": true,
"accounts": [
{
"name": "Mobilon",
"line": 1,
"sip_register": "sip.mobilonsip.ru",
"sip_name": "sip102",
"sip_user": "sip102",
"sip_password": "4321",
"sip_auth": "sip102"
}
]
}Så, i enhver telefon skal lokal tid og SIP-linjer konfigureres. Det er ret enkelt. Flere eksempler kan ses .
på vores provisioning-server
I producentens manualer er der normalt et punkt, der siger: tag en CSV, skriv login-adgangskode-MAC-adresse, generér små filer med vores skript og læg dem på en Apache-webserver, så fungerer det godt.
I det følgende punkt i manualen fortælles der typisk, at den genererede konfigurationsfil også kan krypteres.
Men det er alt sammen klassisk. Den moderne tilgang med smoothies og Twitter siger, at man skal lave en klar webserver, der ikke er så kraftig som Apache, men kun skal gøre én lille ting. At generere og levere konfigurationer via et link.
Her stopper vi op og husker, at næsten alle SIP-telefoner nu kan få konfigurationer via http/https, derfor overvejer vi ikke andre implementeringer (ftp, tftp, ftps). Hver telefon kender sin MAC-adresse. Derfor vil vi lave to links: en personlig — baseret på enheds-nøglen, og en generel, der fungerer med en kombination af en fælles token og MAC-adressen.
Jeg vil heller ikke fokusere på zero-config, altså opsætning af telefonen "fra bunden", dvs. du sætter den i netværket, og så klap, den fungerer. Nej, i mit scenarie sætter du den i netværket, laver en forudindstilling (konfigurerer den til at hente konfiguration fra provisioning-serveren), og derefter drikker du en piña colada og omkonfigurerer telefonen ordentligt via provisioning. At give Option 66 er DHCP-serverens ansvar.
For resten, jeg er helt træt af at sige "provisioning", så ordet er forkortet til "provision", bitte ikke spark mig.
Og endnu et: vores provisioning-server har ikke noget UI, dvs. brugerflade. Måske en dag, men jeg er ikke sikker, da jeg ikke har brug for det. Til gengæld er der en API til at gemme/slette indstillinger, få listen over understøttede leverandører, modeller, alt er beskrevet efter swagger-specifikationens kanoner.
Hvorfor API, og ikke UI? Fordi jeg allerede har mit eget telefonsystem, så jeg har en kilde til legitimationsoplysninger, hvor jeg kan tage disse oplysninger, sammensætte den nødvendige json og offentliggøre det på provisioning-serveren. Og provisioning-serveren vil derefter, i henhold til reglerne angivet i json-filen, give den rigtige enhed sin konfiguration eller ikke give den, hvis enheden ikke er den rigtige, eller ikke opfylder criteria angivet i denne json.

Sådan blev denne provisioning mikrotjeneste. Den hedder , kildekoden er tilgængelig på GitHub, der er også en , eksempel på brug af docker .
Nøglefunktioner:
i alle tilfælde begrænset adgang til konfigurationen i tid, som standard 10 minutter. Hvis du ønsker at gøre konfigurationen tilgængelig igen — genudgiv konfigurationen.
én format for alle leverandører, al tilpasning er fjernet i sonata, du sender en standardiseret json, og konfigurerer alt tilgængeligt udstyr.
alle genererede konfigurationer til enheder logges, alle problematiske områder kan vises i loggen og fejl kan ses.
Det er muligt at bruge et samlet link med en token, hvor hver telefon modtager sin egen konfiguration ved at angive MAC-adressen. Alternativt kan man have et personligt link gennem en nøgle.
API'et til styring (management) og udlevering af konfigurationer til telefoner (provisioning) er opdelt efter porte.
Test. For mig var det meget vigtigt at fastsætte formatet på den udleverede konfiguration og dække alle almindelige situationer for udlevering af konfiguration med tests. For at det kunne fungere korrekt.
Ulemper:
I øjeblikket bruges der ikke kryptering i forbindelse med sonata. Det vil sige, at du selvfølgelig kan begynde at bruge https ved at sætte f.eks. nginx foran sonata. Men de officielle metoder er endnu ikke taget i brug. Hvorfor? Projektet er stadig ungt, og der er kun provisioneret omkring en hundrede enheder. Jeg samler selvfølgelig stadig ideer og feedback. For at gøre det sikkert, så konfigurationer ikke kan sniffes i netværket, kan det være en god idé at arbejde med krypteringsnøgler, TLS osv., men det vil komme i fremtiden.
Manglende UI. Dette kan være en væsentlig ulempe for slutbrugeren, men for systemadministratoren er en kommandolinje-applikation måske vigtigere end en fuld applikation. At lave en kommandolinje-applikation var i planerne, men jeg er ikke sikker på, om den er nødvendig?
Hvad ender vi med?
En lille og simpel webserver til provisioning af flere telefonmodeller med API til styring.
Hvordan skal dette fungere?
- Vi installerer sonata.
- Vi former JSON-konfigurationen og publicerer den i sonata.
- Derefter modtager vi et link fra sonata til provisioning.
- Dette link angiver vi på telefonen.
- Enheden henter konfigurationen.
I den efterfølgende drift kun to trin:
- Vi former JSON-konfigurationen og publicerer den i sonata.
- Enheden henter konfigurationen.
Hvilke telefoner provisioneres?
Leverandørerne Grandstream, Fanvil, Yealink. Konfigurationerne inden for leverandøren er mere eller mindre ens, men kan variere afhængigt af firmware — muligvis skal der udføres yderligere tests.
Hvilke regler kan angives?
Efter tid. Du kan angive tidspunktet, indtil da konfigurationen vil være tilgængelig.
Efter MAC-adresse. Når konfigurationen udleveres via et personligt link, vil enhedens MAC-adresse også blive kontrolleret.
Efter IP. Efter IP-adressen, hvorfra forespørgslen er udført.
Hvordan interagerer man med sonata?
Gennem API'et ved at foretage HTTP-forespørgsler. API'et vil være tilgængeligt i din installation. Da API'et understøtter swagger-specifikation, kan du benytte til testforespørgsler til API'et.
Okay, super. Det lyder interessant, hvordan kan jeg prøve det?
Det er nemmest at implementere et Docker-image baseret på et repository . I repositoryet ligger der en installationsvejledning.
А если знаю node.js?
Hvis du har erfaring med JavaScript, vil du hurtigt finde ud af, hvordan alt her fungerer.
Vil der være udvikling af sonata?
Jeg har delvist nået mine mål. Fremtidig udvikling er et spørgsmål om mine opgaver inden for automatisering af telefonopsætning. Der er også mulighed for at udvide konfigurationerne til opsætning af telefonknapper, tilføje provisioneringsadressebøger, måske noget andet, skriv i kommentarerne.
Resumé og tak
Jeg ser frem til konstruktive forslag/indvendinger/kommentarer og spørgsmål, da der kan være noget, jeg ikke har beskrevet klart.
Jeg vil også gerne takke alle kolleger, der har hjulpet, rådgivet, testet, givet/beskyttet telefoner til test. Faktisk er der mange mennesker, som jeg har interageret med på arbejdet, i i chatrum og e-mails. Tak for idéer og tanker.
Kilde: habr.com
