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