Ansible - deploy java application and Zabbix

Posted by Pavlo Khmel on Wed 06 January 2016

This post is related to previous post "Vagrant with multiple machines and ports".

We configure application and monitoring servers. And we install Java application and Zabbix via Ansible.

1. Ansible

1.1. Install ansible

sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

1.2. Register host in /etc/ansible/hosts

[appsrv]
appsrv ansible_ssh_port=3333 ansible_ssh_host=127.0.0.1 ansible_ssh_private_key_file=~/.vagrant.d/id_rsa
[monsrv]
monsrv ansible_ssh_port=4444 ansible_ssh_host=127.0.0.1 ansible_ssh_private_key_file=~/.vagrant.d/id_rsa

1.3. Run ansible playbook (Files below)

ansible-playbook playbook-appsrv.yml
ansible-playbook playbook-monsrv.yml
ansible-playbook playbook-deployment.yml

1.4. Reboot environment

cd ~/vagrant-homework/
vagrant reload

1.5. Files

./vagrant-homework/run_app.sh

#!/bin/bash
cd /opt
nohup /usr/bin/java HomeWork > /dev/null 2>&1 &
exit 0

./playbook-appsrv.yml

- hosts: appsrv 
  sudo: yes
  remote_user: vagrant

  tasks:
  - hostname: name=appsrv

  - service: name=iptables enabled=no
  - service: name=iptables state=stopped

  - name: Add Zabbix repository
    yum: name=http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm state=present

  - name: Install wget
    yum: name=wget state=present

  - name: Install Apache HTTP
    yum: name=httpd state=latest
    yum: name=mod_ssl state=latest

  - service: name=httpd enabled=yes

  - name: Install Zabbix-Client
    yum: name=zabbix-agent state=present

  - service: name=zabbix-agent state=started

  - service: name=zabbix-agent enabled=yes 

  - name: Configure zabbix-agent1
    command: sed -i 's/Server=127.0.0.1/Server=10.10.10.3/g' /etc/zabbix/zabbix_agentd.conf

  - name: Configure zabbix-agent2
    command: sed -i 's/ServerActive=127.0.0.1/ServerActive=10.10.10.3/g' /etc/zabbix/zabbix_agentd.conf

  - name: Configure zabbix-agent3
    command: sed -i 's/Hostname=Zabbix\ server/Hostname=appsrv/g' /etc/zabbix/zabbix_agentd.conf

  - name: Check if the userparameter_homework.conf exists.
    command: /usr/bin/test -e /etc/zabbix/zabbix_agentd.d/userparameter_homework.conf 
    ignore_errors: True
    register: zab_exists

  - name: Create userparameter_homework.conf shell
    file: path=/etc/zabbix/zabbix_agentd.d/userparameter_homework.conf state=touch owner=root group=root mode=0644
    when: zab_exists.rc != 0

  - name: Update file UserParameter=custom.homework
    lineinfile: dest=/etc/zabbix/zabbix_agentd.d/userparameter_homework.conf line="UserParameter=custom.homework,curl http://127.0.0.1:5555 2>/dev/null | awk '{ print $2 }'"  

  - name: Restart zabbix agent
    service: name=zabbix-agent state=restarted

  - name: Install SNMPD
    yum: name=net-snmp-utils state=present
    yum: name=net-snmp state=present

  - service: name=snmpd state=started

  - service: name=snmpd enabled=yes

  - name: Install OpenJDK
    yum: name=java-1.8.0-openjdk-devel state=present

  - name: Check if the app.conf exists.
    command: /usr/bin/test -e /etc/httpd/conf.d/app.conf
    ignore_errors: True
    register: app_exists

  - name: Create app.conf shell
    file: path=/etc/httpd/conf.d/app.conf state=touch owner=root group=root mode=0644
    when: app_exists.rc != 0

  - name: Make config app.conf line1
    lineinfile: dest=/etc/httpd/conf.d/app.conf line="<VirtualHost *:80>"

  - name: Make config app.conf line2
    lineinfile: dest=/etc/httpd/conf.d/app.conf line="ProxyRequests Off"

  - name: Make config app.conf line3
    lineinfile: dest=/etc/httpd/conf.d/app.conf line="ProxyPass /app http://127.0.0.1:8888"

  - name: Make config app.conf line4
    lineinfile: dest=/etc/httpd/conf.d/app.conf line="ProxyPassReverse /app http://127.0.0.1:8888"

  - name: Make config app.conf line5
    lineinfile: dest=/etc/httpd/conf.d/app.conf line="ProxyPass /mon http://127.0.0.1:5555"

  - name: Make config app.conf line6
    lineinfile: dest=/etc/httpd/conf.d/app.conf line="ProxyPassReverse /mon http://127.0.0.1:5555"

  - name: Make config app.conf line7
    lineinfile: dest=/etc/httpd/conf.d/app.conf line="</VirtualHost>"

  - name: Restart Apache HTTP
    service: name=httpd state=restarted

./playbook-monsrv.yml

---
- hosts: monsrv 
  sudo: yes
  remote_user: vagrant

  tasks:
  - hostname: name=monsrv

  - service: name=iptables enabled=no
  - service: name=iptables state=stopped

  - name: Install wget
    yum: name=wget state=present

  - name: Add Zabbix repository
    yum: name=http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm state=present

  - name: Install Zabbix-Server
    yum: name=zabbix-server-mysql state=present

  - name: Install Zabbix-Web-Mysql
    yum: name=zabbix-web-mysql state=present

  - name: Install the Python MySQL module
    yum: name=MySQL-python

  - name: Install Mysql Server
    yum: name=mysql-server state=present

  - service: name=mysqld state=started
  - service: name=mysqld enabled=yes

  - name: Create zabbix database 
    mysql_db: name=zabbix state=present collation=utf8_general_ci
    register: mysql_db

  - mysql_user: name=zabbix password=zabbix priv=*.*:ALL state=present

  - name: Import schema sql
    mysql_db: state=import name=zabbix target=/usr/share/doc/zabbix-server-mysql-2.4.6/create/schema.sql
    when: mysql_db.changed

  - name: Import images sql
    mysql_db: state=import name=zabbix target=/usr/share/doc/zabbix-server-mysql-2.4.6/create/images.sql
    when: mysql_db.changed

  - name: Import data sql
    mysql_db: state=import name=zabbix target=/usr/share/doc/zabbix-server-mysql-2.4.6/create/data.sql
    when: mysql_db.changed

  - name: Change time zone
    command: sed -i 's/# php_value date.timezone Europe\/Riga/php_value date.timezone Europe\/Kiev/g' /etc/httpd/conf.d/zabbix.conf

  - name: Change Zabbix Server conf
    command: sed -i 's/# DBHost=localhost/DBHost=localhost/g' /etc/zabbix/zabbix_server.conf

  - name: Change Zabbix Server conf 2
    command: sed -i 's/# DBPassword=/DBPassword=zabbix/g' /etc/zabbix/zabbix_server.conf 

  - name: Install SNMPD
    yum: name=net-snmp-utils state=present
    yum: name=net-snmp state=present

  - service: name=snmpd state=restarted
  - service: name=snmpd enabled=yes

  - name: Install Apache HTTP
    yum: name=httpd state=latest
    yum: name=mod_ssl state=latest

  - service: name=httpd state=restarted

  - service: name=httpd enabled=yes

  - service: name=zabbix-server enabled=yes

  - service: name=zabbix-server state=restarted

  - name: Install Zabbix-Client
    yum: name=zabbix-agent state=present

  - service: name=zabbix-agent state=started

  - service: name=zabbix-agent enabled=yes

./playbook-deployment.yml

- hosts: appsrv 
  sudo: yes
  remote_user: vagrant

  tasks:

  - name: copy app class
    shell: cp /vagrant/HomeWork.java /opt/

  - name: copy run script
    shell: cp /vagrant/run_app.sh /opt/

  - name: compile class 
    shell: cd /opt; javac HomeWork.java

  - name: autorun
    lineinfile: dest=/etc/rc.d/rc.local line="bash /opt/run_app.sh"

  - name: Start Java app
    shell: bash /opt/run_app.sh

./vagrant-homework/HomeWork.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

class NewThread extends Thread {
    protected Socket socket;

    public NewThread(Socket clientSocket) {
        this.socket = clientSocket;
    }

    public void run() {
        boolean isRunning = true;
        try
        {
            while (isRunning) {
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintWriter out = new PrintWriter(socket.getOutputStream());
                out.println("HTTP/1.1 200 "); 
                out.println("Content-Type: text/html"); 
                out.println("Connection: close"); 
                out.println("");
                out.println("<!DOCTYPE html>");
                out.println("<h1>Welcome... wait 5 sec...</h1>\r\n");
                String line;
                  while ((line = in.readLine()) != null) {
                        if (line.length() == 0)
                          break;
                      }
                out.flush();
                Thread.sleep(60000);
                out.close();
                HomeWork.connection_counter--;
                isRunning = false;
            }
        }
        catch(Exception e)
        {
            System.out.println("Error" + e);
        }
    }
}

class Socket0 implements Runnable
{
    public void run()
    {
        try {
            ServerSocket ss = new ServerSocket(5555);
            for (;;) {
              Socket client = ss.accept();
              BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
              PrintWriter out = new PrintWriter(client.getOutputStream());
              out.print("HTTP/1.1 200 \r\n"); 
              out.print("Content-Type: text/plain\r\n"); 
              out.print("Connection: close\r\n"); 
              out.print("\r\n");
              String line;
              out.print("Counter: " + HomeWork.connection_counter + "\r\n");
              while ((line = in.readLine()) != null) {
                if (line.length() == 0)
                  break;
              }
              out.close();
              in.close();
              client.close();
            }
          }
          catch (Exception e) {
            System.err.println(e);
          }
    }
}

public class HomeWork {
    public static int connection_counter = 0;
    public static void main(String args[]) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(8888, 0, InetAddress.getByName(null));
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Service is started on local port: 127.0.0.1:8888, and monitoring port: 5555");
        Socket0 s0=new Socket0();
        Thread t1=new Thread(s0);
        t1.start();

        while (true) {
            try {
                socket = serverSocket.accept();
            } catch (IOException e) {
                System.out.println("I/O error: " + e);
            }
            connection_counter++;
            new NewThread(socket).start();
            System.out.println("Connections: " + connection_counter);
        }
    }
}