diff --git a/roles/pbx/defaults/main.yml b/roles/pbx/defaults/main.yml index 11db76841..c703d8503 100644 --- a/roles/pbx/defaults/main.yml +++ b/roles/pbx/defaults/main.yml @@ -5,3 +5,13 @@ pbx_installed: False asterisk_url: http://downloads.asterisk.org/pub/telephony/asterisk/ asterisk_src_file: asterisk-16-current.tar.gz asterisk_src_dir: /opt/iiab/asterisk + +asterisk_db_host: localhost +asterisk_db_user: asterisk +asterisk_db_dbname: asterisk +asterisk_db_password: changeme +asterisk_db_cdrdbname: asteriskcdrdb + +freepbx_url: http://mirror.freepbx.org/modules/packages/freepbx/ +freepbx_src_file: freepbx-15.0-latest.tgz +freepbx_src_dir: /opt/iiab/freepbx diff --git a/roles/pbx/meta/main.yml b/roles/pbx/meta/main.yml new file mode 100644 index 000000000..239d8ab35 --- /dev/null +++ b/roles/pbx/meta/main.yml @@ -0,0 +1,3 @@ + dependencies: + - { role: nodejs, tags: ['nodejs'], when: pbx_install } + diff --git a/roles/pbx/tasks/asterisk.yml b/roles/pbx/tasks/asterisk.yml index 129fbeb11..8fdee19ee 100644 --- a/roles/pbx/tasks/asterisk.yml +++ b/roles/pbx/tasks/asterisk.yml @@ -142,7 +142,7 @@ regexp: 'rungroup =' line: 'rungroup = asterisk' -- name: Enable & Start asterisk service +- name: Asterisk - Enable & Start asterisk service systemd: daemon_reload: yes name: asterisk @@ -150,7 +150,7 @@ state: started when: pbx_enabled -- name: Disable & Stop asterisk service +- name: Asterisk - Disable & Stop asterisk service systemd: daemon_reload: yes name: asterisk diff --git a/roles/pbx/tasks/asterisk_dependencies.yml b/roles/pbx/tasks/asterisk_dependencies.yml index 1191169eb..0738ddfe4 100644 --- a/roles/pbx/tasks/asterisk_dependencies.yml +++ b/roles/pbx/tasks/asterisk_dependencies.yml @@ -1,4 +1,4 @@ -- name: Install asterisk dependencies +- name: Asterisk - Install dependencies package: name: - git diff --git a/roles/pbx/tasks/freepbx.yml b/roles/pbx/tasks/freepbx.yml index e69de29bb..391873d63 100644 --- a/roles/pbx/tasks/freepbx.yml +++ b/roles/pbx/tasks/freepbx.yml @@ -0,0 +1,142 @@ +- name: FreePBX - Install dependencies + include: freepbx_dependencies.yml + +- name: FreePBX - Download software to /opt/iiab/downloads + get_url: + url: "{{ freepbx_url }}/{{ freepbx_src_file }}" + dest: "{{ downloads_dir }}/{{ freepbx_src_file }}" + timeout: "{{ download_timeout }}" + when: internet_available + +- name: FreePBX - Check for /opt/iiab/downloads/{{ freepbx_src_file }} + stat: + path: "{{ downloads_dir }}/{{ freepbx_src_file }}" + register: freepbx_src + +- name: FreePBX - FAIL (force Ansible to exit) IF /opt/iiab/downloads/{{ freepbx_src_file }} doesn't exist + fail: + msg: "{ downloads_dir }}/{{ freepbx_src_file }} is REQUIRED in order to install." + when: not freepbx_src.stat.exists + +- name: FreePBX - Create install source directory + file: + path: "{{ freepbx_src_dir }}" + state: directory + +- name: FreePBX - Extract source + unarchive: + src: "{{ downloads_dir }}/{{ freepbx_src_file }}" + dest: "{{ freepbx_src_dir }}" + owner: root + group: root + extra_opts: [--strip-components=1] + +- name: FreePBX - Add mysql user + mysql_user: + name: "{{ asterisk_db_user }}" + password: "{{ asterisk_db_password }}" + priv: "{{ asterisk_db_dbname }}.*:ALL/{{ asterisk_db_cdrdbname }}.*:ALL" + login_host: "{{ asterisk_db_host }}" + host: "{{ (asterisk_db_host == 'localhost') | ternary('localhost', ansible_default_ipv4.address) }}" + state: present + +- name: FreePBX - Add mysql db + mysql_db: + name: "{{ asterisk_db_dbname }}" + encoding: utf8 + collation: utf8_general_ci + login_host: "{{ asterisk_db_host }}" + state: present + +- name: FreePBX - Add cdr mysql db + mysql_db: + name: "{{ asterisk_db_cdrdbname }}" + encoding: utf8 + collation: utf8_general_ci + login_host: "{{ asterisk_db_host }}" + state: present + +- name: FreePBX - Disable & Stop asterisk service + systemd: + daemon_reload: yes + name: asterisk + enabled: no + state: stopped + +# using named groups due to this: http://www.handverdrahtet.org/2016/01/ansible-using-numbered-backreference.html +- name: FreePBX - Enable freepbx installation with remote mysql db + replace: + dest: "{{ freepbx_src_dir }}/installlib/installcommand.class.php" + regexp: "(?P\$amp_conf\[.AMPDBHOST.\] = .)localhost(.;)" + replace: "\g{{ asterisk_db_host }}\2" + +- name: Don't let freepbx take over the php sessions dir + blockinfile: + content: | + [blacklist] + directory = /var/lib/php/sessions + marker: "; {mark} ANSIBLE MANAGED BLOCK" + dest: /etc/asterisk/freepbx_chown.conf + owner: asterisk + group: asterisk + create: yes + +- name: Install freepbx (just ran once) + command: "{{ item }}" + args: + chdir: "{{ freepbx_src_dir }}/freepbx" + creates: /var/www/freepbx + with_items: + - ./start_asterisk start + - ./install -n --webroot /var/www/freepbx --dbuser {{ asterisk_db_user }} --dbpass {{ asterisk_db_password }} --dbname {{ asterisk_db_dbname }} --cdrdbname {{ asterisk_db_cdrdbname }} + register: freepbx_installation + +- name: Install systemd freepbx service + copy: src=freepbx.service.j2 dest=/etc/systemd/system/freepbx.service mode=755 + +# http://community.freepbx.org/t/fixing-cdr-cel-on-ubuntu-debian-installation/30836 +# Test using `isql -v MySQL-asteriskcdrdb` +- name: Fix asterisk cdr odbc connection (1) + blockinfile: + dest: /etc/odbcinst.ini + create: yes + marker: "; {mark} ANSIBLE MANAGED BLOCK" + content: | + [MySQL] + Description = ODBC for MySQL + Driver = {{ libodbc_path }} + FileUsage = 1 + notify: Reload asterisk modules + +- name: Fix asterisk cdr odbc connection (2) + replace: + dest: /etc/odbc.ini + regexp: /var/lib/mysql/mysql.sock + replace: /var/run/mysqld/mysqld.sock + notify: Reload asterisk modules + +- name: Install freepbx modules + command: "fwconsole ma downloadinstall {{ item }}" + args: + creates: /var/www/freepbx/admin/modules/{{ item }} + with_items: + - userman + - asteriskinfo + - backup + - outroutemsg + +- name: FreePBX - Enable and start FreePBX service + systemd: + daemon_reload: yes + name: freepbx + enabled: yes + state: started + when: pbx_enabled + +- name: FreePBX - Disable and Stop FreePBX service + systemd: + daemon_reload: yes + name: freepbx + enabled: no + state: stopped + when: pbx_enabled diff --git a/roles/pbx/tasks/freepbx_dependencies.yml b/roles/pbx/tasks/freepbx_dependencies.yml new file mode 100644 index 000000000..381faf8f8 --- /dev/null +++ b/roles/pbx/tasks/freepbx_dependencies.yml @@ -0,0 +1,29 @@ +- name: FreePBX - Install dependencies + package: + name: + - wget + - git + - unixodbc # for asterisk cdr + - sudo # required by freepbx install script + - net-tools # fwconsole requirement + - cron # required by freepbx ucp package + - sox # required for CDR web-playback + - php + - php-pear + - php-cgi + - php-common + - php-curl + - php-mbstring + - php-gd + - php-mysql + - php-gettext + - php-bcmath + - php-zip + - php-xml + - php-imap + - php-json + - php-snmp + - php-fpm + - libapache2-mod-php + - python-mysqldb # https://github.com/Yannik/ansible-role-freepbx/blob/master/tasks/freepbx.yml#L33 + state: latest diff --git a/roles/pbx/templates/freepbx.service.j2 b/roles/pbx/templates/freepbx.service.j2 new file mode 100644 index 000000000..50a23eea8 --- /dev/null +++ b/roles/pbx/templates/freepbx.service.j2 @@ -0,0 +1,12 @@ +[Unit] +Description=FreePBX VoIP Server +After=mysql.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/sbin/fwconsole start +ExecStop=/usr/sbin/fwconsole stop + +[Install] +WantedBy=multi-user.target