Hi, I am trying to get kamailio working cloud provider, autoscaling them behind a TCP load balancer.
Is there a way for kamailio to discover its Public IP at startup? Or do people generally program their own startup scripts that modify the kamailio config file before starting it?
Is there any gotchas you have hit while configuring this setup?
Thank you!
Alex
I’m working on something similar, what cloud are you using?
In my case, using GCP, I have a script that queries the metadata API and uses information from there, but for the setup I’m trying out, I use the LB public IP not the VM one.
I’m curious as to how you plan to get it to work, why would you need the public IP of the VM?
Also, I’m having trouble getting Kamailio to use existing (established) TCP connections when it’s not the initial request...
I’d love to hear if you get it working!
Cheers, Joel.
On Sun, Nov 10, 2019 at 09:23 Mack Hendricks mack@dopensource.com wrote:
On Sun, Nov 10, 2019 at 06:16:44PM +0100, Alejandro Recarey wrote:
They generally do the latter, especially since public IP discovery mechanisms tend to be specific to the cloud provider.
But various templating mechanisms make this quite easy to do.
I needed to discover the user/pass for the dB when kamailio starts so as not to store it locally. I get the data via an AWS script, then start kamailio passing the parameters, then use of those in the script. You can do exactly this to get and set the current ip address.
I don’t know how to share a thread from this mailing list, but search for the subject “ define a DBURL with SLQOPS fails” and you will find all info there.
On Sun, 10 Nov 2019 at 17:48, Alex Balashov abalashov@evaristesys.com wrote:
Hi David,
You mean this thread from may 2019. https://lists.kamailio.org/pipermail/sr-users/2019-May/105599.html
Pro Tipp, search on lists.kamailio.org/pipermail/ to get your link. Great help the mailing list archive btw.
Cheers Karsten
David Villasmil david.villasmil.work@gmail.com schrieb am So., 10. Nov. 2019, 19:03:
-A ... oh wow. That's savvy! Cheers.
On Sun, Nov 10, 2019 at 08:51:59PM +0100, Karsten Horsmann wrote:
That's the one, thanks @Karsten!
More info, i changed my systemd unit to execute a script when starting up, like so:
# cat /etc/systemd/system/multi-user.target.wants/kamailio.service [Unit] Description=Kamailio (OpenSER) - the Open Source SIP Server After=network.target
[Service] Type=forking Environment='CFGFILE=/etc/kamailio/kamailio.cfg' Environment='SHM_MEMORY=64' Environment='PKG_MEMORY=8' Environment='USER=kamailio' Environment='GROUP=kamailio' EnvironmentFile=-/etc/default/kamailio EnvironmentFile=-/etc/default/kamailio.d/* # PIDFile requires a full absolute path PIDFile=/var/run/kamailio/kamailio.pid ExecStart=/etc/kamailio/startkam.sh Restart=on-abort
[Install] WantedBy=multi-user.target
And /etc/kamailio/startkam.sh is like:
#!/bin/bash
MYSQL=$(/etc/kamailio/aws-getpass.sh dev us-east-1 dburl) SHM_MEMORY=64 PKG_MEMORY=8 USER=kamailio GROUP=kamailio CFGFILE=/etc/kamailio/kamailio.cfg /usr/sbin/kamailio -P /var/run/kamailio/kamailio.pid -f $CFGFILE -m $SHM_MEMORY -M $PKG_MEMORY -u $USER -g $GROUP -A "DBURL="$MYSQL"" -A "CBDBURL="cb=>$MYSQL"" -A "ASGDBURL="asg=>$MYSQL""
which in turn calls /etc/kamailio/aws-getpass.sh, which is the actual script talking to AWS via BOTO3 to get the data i need.
You can just change the params and use them in your kam script normally like:
modparam("acc", "db_url", DBURL )
Hope that helps.
Regards,
David Villasmil email: david.villasmil.work@gmail.com phone: +34669448337
On Sun, Nov 10, 2019 at 9:22 PM Alex Balashov abalashov@evaristesys.com wrote:
You can also update kamailio.cfg to include listeners.cfg Example. Need add to kamailio.cfg
####### Listeners ########## include_file "/var/run/kamailio/listeners-eth0.cfg"
Before kamailio started you will generate listeners.cfg file. This may by done by drop-in file. Need create "/etc/systemd/system/kamailio.service.d/10-listners-eth0.conf" with content [Service] ExecStartPre=/bin/curl -s -S --output /var/run/kamailio/listeners-eth0.cfg http://169.254.169.254/latest/meta-data/public-ipv4 ExecStartPre=/bin/sed --in-place --regexp-extended -e 's/(.*)/listen=udp:\1:5060\nlisten=tcp:\1:5060\n/' /var/run/kamailio/listeners-eth0.cfg
On Mon, Nov 11, 2019 at 2:50 AM David Villasmil < david.villasmil.work@gmail.com> wrote:
How about to create set of systemd drop-in for cloud providers and then package them? User will simple install package like "kamailio-cfg-google" or "kamailio-cfg-amazon" and get part of kamailio runtime config. Please comment here https://github.com/kamailio/kamailio/issues/2125
On Mon, Nov 11, 2019 at 8:00 AM Sergey Safarov s.safarov@gmail.com wrote:
I prefer more flexibility, and so use a slightly more ornate approach involving the Jinja2 template engine (inspired by Jango)[1] and Python 3. I'll spread it in the network in the hope that it helps someone.
--- kamailio-settings.yaml --- listeners: - proto: udp addr: 127.0.0.1 port: 5060
- proto: tcp addr: 172.30.105.10 port: 5060
db_conn: driver: mysql user: kamailio_ro password: abc123 host: 172.30.106.11 name: kamailio ------------------------------
And the Kamailio config:
--- kamailio.cfg.tpl ---- #!define DB_URL "{{ db_conn['driver'] }}://{{ db_conn['user'] }}:{{ db_conn['password'] }}@{{ db_c onn['host'] }}/{{ db_conn['name'] }}"
...
{% for l in listeners -%} listen={{ l['proto'] }}:{{ l['addr'] }}:{{ l['port'] }} {% endfor %} -------------------------
And:
--- apply.py --- #!/usr/bin/python3
import sys, os, re, yaml from jinja2 import Template, Environment
env = Environment() cfg_buf = None settings = None
with open('/usr/local/etc/kamailio/kamailio.cfg.tpl', 'r') as f: cfg_buf = f.read()
tpl_instance = env.from_string(cfg_buf)
with open('kamailio-settings.yaml', 'r') as f: settings = yaml.load(f.read(), Loader=yaml.FullLoader)
finished = tpl_instance.render(settings)
with open('/usr/local/etc/kamailio/kamailio.cfg', 'w') as f: f.write(finished) ----------------
Then, this goes in the systemd unit:
ExecStartPre=/usr/bin/python3 /opt/evariste/scripts/apply.py
Result:
--- #!define DB_URL "mysql://kamailio_ro:abc123@172.30.106.11/kamailio"
...
listen=udp:127.0.0.1:5060 listen=tcp:172.30.105.10:5060 ---
-- Alex
[1] https://jinja.palletsprojects.com/en/2.10.x/
On Mon, Nov 11, 2019 at 08:00:46AM +0300, Sergey Safarov wrote:
Nice idea Alex.
I use import_file and include_file and fill this with my settings from Puppet.
Many ways to get your config strings.
There is also some ENV stuff for Kamailio to feature config strings into startup for container environments AFAIK.
Cheers Karsten
Alex Balashov abalashov@evaristesys.com schrieb am Mo., 11. Nov. 2019, 06:45:
Guys, blown away by the support what an awesome community! Thanks for all the replies, they are all great!
On Mon, Nov 11, 2019 at 8:34 AM Karsten Horsmann khorsmann@gmail.com wrote: