Cisco SIP Telefone für Asterisk mit Ansible verwalten
Ich verwende seit kurzem wieder ausschließlich Asterisk als Telefonanlage und dazu Cisco 7960 SIP Telefone.
Generell ist diese Konfiguration in diesem Privathaushalt mit Homeoffice recht einfach. Jeder darf mit jedem telefonieren und ich lege zentral fest welches Telefon bei welcher externen Nummer klingel soll. Also keine Benutzer mit Kennwörtern sondern nur Geräte mit Nummern. Das macht es mir möglich einen Großteil der Konfiguration in Ansible zu verwalten.
Die Konfiguration ist im Prinzip nicht schwer, geschieht aber an verschiedenen Stellen und ist deshalb etwas fusselig.
Telefongeräte
Für jedes Telefongerät muss eine Konfiguration erstellt werden die sich das Telefon beim Booten von einem TFTP Server zieht. Dort stehen also schon mal Namen und Kennwörter. Diese Konfigurationsdatei muss in dem Namen die MAC Adresse des Telefons haben.
Asterisk
Auch hier wird für jedes Telefon ein “Account” angelegt und es muss festgelegt werden unter welcher Nummer es extern erreichbar ist, welche Nummer es beim telefonieren verwenden soll und das man es intern erreichen kann.
Neuanlage eines Telefons
Man trägt also für jedes Telefon zuerst die Nummer in der SIP Configuration ein, legt einen Eintrag für die Extension an und dann noch mal diese SIP Konfiguration auf dem FTP Server.
Und überall stehen im wesentlichen nur ein paar Informationen wiederholt drin.
Automatisierung mit Ansible
(Der folgende Text setzt schon Ansible Wissen voraus.)
Das Playbook besteht aus folgenden Dateien
roles/asterisk/
├── handler
│ └── main.yml
├── tasks
│ └── main.yml
└── templates
├── interne-erreichbarkeit-sip-conf.j2
├── sip-config-xml.j2
└── sip-conf.j2
In der Konfiguration des Asterisk Servers sind folgende Variablen für jedes Telefon enthalten
- sipname: "311"
name: "311"
callerid_name: "Familie Bauer"
callerid_num: "+49222xxxx"
logo_url: "http://server.domain.lcl/eigenes-cisco-logo.bmp"
mac: "0016Cxx228E"
Asterisk Extensions
Es wird für jedes Telefon eine Datei angelegt in der steht unter welcher Nummer ein Telefon erreichbar ist
- name: create config directory in asteriskdir
file:
path: "/etc/asterisk/my/"
state: directory
mode: 0750
- name: Create a rule for internal-calls.conf
template:
src=interne-erreichbarkeit-sip-conf.j2
dest=/etc/asterisk/my/internal-calls-{{ item.name }}.conf
owner=asterisk
group=asterisk
mode=0750
with_items: "{{ sipphones }}"
Das Template sie so aus und enthält nur eine Zeile.
exten => {{ item.name }} ,1,Dial(SIP/{{ item.name }})
In der extension.conf werden alle diese Konfigurationen eingebunden
#include "my/internal-calls-\*.conf"
Damit ist gibt es für jedes Telefon eine Anrufmöglichkeit.
Telefon Definition
Ähnlich baue ich die SIP Definitionen
Task:
- name: Create a sip1.conf
template:
src=sip-conf.j2
dest=/etc/asterisk/my/sip-{{ item.name }}.conf
owner=asterisk
group=asterisk
mode=0750
with_items: "{{ sipphones }}"
Template:
[{{ item.name }}] ; Name
type=friend
username = {{ item.name }}
secret = {{ item.name }}
pickupgroup = 1
callgroup = 1
context=mycontext;
setvar=EXTERNAL_CALLERID=”{{ item.callerid_name }}” <{{ item.callerid_num }}>;
....
.....
.....
{% if item.mailbox is defined %}
mailbox= {{ item.mailbox }}
{% endif %}
In der /etc/asterisk/sip.conf steht dann
#include /etc/asterisk/my/sip-\*.conf
Telefonkonfiguraton
Bleibt noch die Konfiguration der Telefone selbst. Auch die ist recht einfach gehalten aber mit etwas Logik kann man das auch komplizierter machen.
Tasks:
- name: Create a Phone XML Configuration
template:
src=sip-config-xml.j2
dest=/opt/tftp/diskless/SIP{{ item.mac }}.cnf
owner=asterisk
group=asterisk
mode=0750
with_items: "{{ sipphones }}"
Template:
phone_label: "{{ item.name }}"
proxy_register: 1
line1_name: "{{ item.name }}"
line1_displayname: "{{ item.name }}"
line1_shortname: "{{ item.name }}"
line1_authname: "{{ item.name }}"
line1_password: "{{ item.name }}"
{% if item.logo_url is defined %}
logo_url: "{{ item.logo_url }}"
{% endif %}
Ergebniss
Jetzt trage ich nur noch in der Ansible Server Konfiguration ein neues Telefon mit der gewünschten Nummer und der Mac Adresse ein und mit einem Befehl wird der Account definiert, die Nummer eingerichtet und die Telefonkonfiguration erstellt.
ansible-playbook asterisk.yml -b