In this Article we will show you how to deploy and full Lamp ( Apache /MariaDB server /Php) stack installation from your laptop or local computer to your Centos 7 or FreeBSD 10.x server. In this small test i will show how i installed lamp on Centos 7 from another Centos machine
Lets show you Python Auto deploy LAMP script how it work .
Behavior
Server1 : puppetnode1
[root@puppetnode1 ~]# lsb_release LSB Version: :core-4.1-amd64:core-4.1-noarch [root@puppetnode1 ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.2.1511 (Core) Release: 7.2.1511 Codename: Core [root@puppetnode1 ~]# ifconfig | grep 192 inet 192.168.28.142 netmask 255.255.255.0 broadcast 192.168.28.255 [root@puppetnode1 ~]#
Server 2 : puppetnode2
[root@puppetnode2 ~]# ifconfig | grep 192 inet 192.168.28.141 netmask 255.255.255.0 broadcast 192.168.28.255 [root@puppetnode2 ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.2.1511 (Core) Release: 7.2.1511 Codename: Core
Show /etc/hosts file on both machines
cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.28.142 puppetnode1.unixmen.com puppetnode1 192.168.28.141 puppetnode2.unixmen.com puppetnode2
Lets Start from downloading script in Node2
Downlaod script from Github
[root@puppetnode2 ~]# wget https://github.com/jamalshahverdiev/freebsd-centos7-amp/archive/master.zip --2016-05-26 06:10:57-- https://github.com/jamalshahverdiev/freebsd-centos7-amp/archive/master.zip Connecting to 10.133.80.35:8080... connected. Proxy request sent, awaiting response... 302 Found Location: https://codeload.github.com/jamalshahverdiev/freebsd-centos7-amp/zip/master [following] --2016-05-26 06:10:57-- https://codeload.github.com/jamalshahverdiev/freebsd-centos7-amp/zip/master Connecting to 10.133.80.35:8080... connected. Proxy request sent, awaiting response... 200 OK Length: 59418 (58K) [application/zip] Saving to: ‘master.zip’ 100%[=======================================================================================================>] 59,418 49.6KB/s in 1.2s 2016-05-26 06:10:59 (49.6 KB/s) - ‘master.zip’ saved [59418/59418]
Extract the zip master
[root@puppetnode2 ~]# unzip master.zip Archive: master.zip 81ccf91ee0ee7775c90dbc5a7b50faae4650fdb0 creating: freebsd-centos7-amp-master/ inflating: freebsd-centos7-amp-master/README.md inflating: freebsd-centos7-amp-master/add-vhost-apmyph.py inflating: freebsd-centos7-amp-master/apmyph.py creating: freebsd-centos7-amp-master/jinja2temps/ inflating: freebsd-centos7-amp-master/jinja2temps/apvhost.conf inflating: freebsd-centos7-amp-master/jinja2temps/c7httpd.conf inflating: freebsd-centos7-amp-master/jinja2temps/cmy.cnf inflating: freebsd-centos7-amp-master/jinja2temps/fhttpd.conf inflating: freebsd-centos7-amp-master/jinja2temps/fphp.ini inflating: freebsd-centos7-amp-master/jinja2temps/lhttpd.conf inflating: freebsd-centos7-amp-master/jinja2temps/lphp.ini inflating: freebsd-centos7-amp-master/jinja2temps/my.cnf inflating: freebsd-centos7-amp-master/jinja2temps/newindex.php inflating: freebsd-centos7-amp-master/jinja2temps/ngindex.html inflating: freebsd-centos7-amp-master/jinja2temps/nginx.conf inflating: freebsd-centos7-amp-master/jinja2temps/ngphp.conf inflating: freebsd-centos7-amp-master/jinja2temps/ngphp.lan inflating: freebsd-centos7-amp-master/jinja2temps/ngsec.conf inflating: freebsd-centos7-amp-master/jinja2temps/tempindex.html inflating: freebsd-centos7-amp-master/jinja2temps/tempindex.php inflating: freebsd-centos7-amp-master/jinja2temps/www.conf [root@puppetnode2 ~]#
Enter the Directory
you can also check the content script of apmyph.py that we will use
cat apmyph.py add the bellow code
#!/usr/bin/env python2.7 import sys import os import jinja2 from fabric.api import * from fabric.tasks import execute import getpass templateLoader = jinja2.FileSystemLoader( searchpath="/" ) templateEnv = jinja2.Environment( loader=templateLoader ) TEMPAVFILE = os.getcwd()+'/jinja2temps/apvhost.conf' TEMPHFILE = os.getcwd()+'/jinja2temps/tempindex.html' TEMPPFILE = os.getcwd()+'/jinja2temps/tempindex.php' tempav = templateEnv.get_template( TEMPAVFILE ) tempht = templateEnv.get_template( TEMPHFILE ) tempphp = templateEnv.get_template( TEMPPFILE ) env.host_string = raw_input('Please enter WEB server IP address: ') env.user = raw_input('Please enter username for UNIX/Linux server: ') env.password = getpass.getpass() sitename = raw_input('Please enter site name: ') tempavVars = { "sname" : sitename, "domain" : sitename, } outputavText = tempav.render( tempavVars ) outputahText = tempht.render( tempavVars ) with settings( hide('warnings', 'running', 'stdout', 'stderr'), warn_only=True ): osver = run('uname -s') lintype = run('cat /etc/redhat-release | awk \'{ print $1 }\'') ftype = run('uname -v | awk \'{ print $2 }\' | cut -f1 -d \'.\'') if osver == 'FreeBSD' and ftype >= 10: print(' This is FreeBSD server...') getfhttpdpack = run('which httpd') httpdpidfile = run('cat /var/run/httpd.pid') httpdpid = run('ps waux | grep httpd | grep root | grep -v grep | awk \'{ print $2 }\'') if getfhttpdpack == '/usr/local/sbin/httpd' and httpdpidfile == httpdpid: print(' You have already installed and running Apache web server...') print(' If you want add new VirtualHost, please use ./add-vhost-apmyph.py script. ') sys.exit() elif getfhttpdpack != '/usr/local/sbin/httpd': run('pkg install -y apache24') run('echo \'apache24_enable="YES"\' >> /etc/rc.conf') ip = run('ifconfig em0 | grep \'inet \' | awk \'{ print $2 }\'') name = run('hostname') run('echo \"'+ip+' '+name+'.lan '+name+'\" >> /etc/hosts') put(os.getcwd()+'/jinja2temps/fhttpd.conf', '/usr/local/etc/apache24/httpd.conf') run('mkdir -p /usr/local/domen /var/log/httpd/ /var/www/'+sitename+'_public_html') with open(sitename+".conf", "wb") as apvhostfile: apvhostfile.write(outputavText) put(sitename+'.conf', '/usr/local/domen/'+sitename+'.conf') with open("index.html", "wb") as aphtfile: aphtfile.write(outputahText) put('index.html', '/var/www/'+sitename+'_public_html') run('/usr/local/etc/rc.d/apache24 start') print('Apache 24 server installed and configured...') print('If you want install and configure MySQL PHP just press "Enter"!!!') print('If you want to exit from script write "n" and press Enter button. ') inst = raw_input('Please select: ') if inst == "": print('You are selected "Enter" button') run('pkg install -y mysql55-server') run('pkg install -y mod_php56') run('pkg install -y php56-bz2 php56-mysql php56-mysqli php56-calendar php56-ctype php56-curl php56-dom php56-exif php56-fileinfo php56-filter php56-gd php56-gettext php56-hash php56-iconv php56-json php56-mbstring php56-mcrypt php56-openssl php56-posix php56-session php56-simplexml php56-tokenizer php56-wddx php56-xml php56-xmlreader php56-xmlwriter php56-xmlrpc php56-xsl php56-zip php56-zlib') put(os.getcwd()+'/jinja2temps/my.cnf', '/etc/my.cnf') put(os.getcwd()+'/jinja2temps/fphp.ini', '/usr/local/etc/php.ini') run('echo \'mysql_enable="YES"\' >> /etc/rc.conf') run('touch /var/log/mysql.log ; chown mysql:mysql /var/log/mysql.log') run('/usr/local/etc/rc.d/mysql-server start') run('echo -e "\n\nfreebsd\nfreebsd\n\n\n\n\n" | mysql_secure_installation 2>/dev/null') msqlpidfile = run('ps waux|grep mysql | grep -v grep| grep -v safe | awk \'{ print $2 }\'') msqlpid = run('cat /var/db/mysql/*.pid') if msqlpidfile == msqlpid: print('MySQL service already running...') pass else: sys.exit() sitedb = raw_input('Enter name for new database: ') sitedbuser = raw_input('Enter new mysql user name: ') sitedbpasswd = getpass.getpass('Enter pass for '+sitedbuser+': ') sitedbpasswd1 = getpass.getpass('Repeat pass for '+sitedbuser+': ') if sitedbpasswd == sitedbpasswd1: pass else: print('The password for site db username must be the same!!! ') run('mysql -u root -p\'freebsd\' -e "CREATE DATABASE '+sitedb+';"') run('mysql -u root -p\'freebsd\' -e "GRANT ALL PRIVILEGES ON '+sitedb+'.* TO '+sitedbuser+'@localhost IDENTIFIED BY \''+sitedbpasswd+'\';"') run('mysql -u root -p\'freebsd\' -e "FLUSH PRIVILEGES;"') tempphVars = { "sitedb" : sitedb, "sitedbuser" : sitedbuser, "sitedbpasswd" : sitedbpasswd} outputphpText = tempphp.render( tempphVars ) with open("index.php", "wb") as aphtfile: aphtfile.write(outputphpText) put('index.php', '/var/www/'+sitename+'_public_html/index.php') run('/usr/local/etc/rc.d/apache24 restart') print('MySQL, Apache24 and PHP installed and configured...') elif inst == "n": print('You entered "n" button.') else: print('You can only press "Enter" button or write "n" and after press enter button!!!') elif osver == 'Linux' and lintype == 'CentOS': print(' This is CentOS server...') getlhttpdpack = run('which httpd') httpdpidfile = run('cat /var/run/httpd/httpd.pid') httpdpid = run('ps waux | grep httpd | grep root | grep -v grep | awk \'{ print $2 }\'') if getlhttpdpack == '/usr/sbin/httpd' and httpdpidfile == httpdpid: print(' You have already installed and running Apache web server...') print(' If you want add new VirtualHost, please use ./add-vhost-apmyph.py script') sys.exit() elif getlhttpdpack != '/usr/sbin/httpd': run('yum install -y httpd') ip = run('ifconfig `ifconfig | head -n1 | cut -f1 -d\':\'` | grep \'inet \' | awk \'{ print $2 }\'') name = run('hostname') run('echo \"'+ip+' '+name+'.lan '+name+'\" >> /etc/hosts') put(os.getcwd()+'/jinja2temps/c7httpd.conf', '/etc/httpd/conf/httpd.conf') run('mkdir -p /usr/local/domen /var/www/'+sitename+'_public_html') with open(sitename+".conf", "wb") as apvhostfile: apvhostfile.write(outputavText) put(sitename+'.conf', '/usr/local/domen/'+sitename+'.conf') with open("index.html", "wb") as aphtfile: aphtfile.write(outputahText) put('index.html', '/var/www/'+sitename+'_public_html') run('systemctl start httpd.service ; systemctl enable httpd.service') print('Apache 24 server installed and configured...') print('If you want install and configure MySQL PHP just press "Enter"!!!') print('If you want to exit from script write "n" and press Enter button. ') inst = raw_input('Please select: ') if inst == "": print('You are selected "Enter" button') run('yum -y install mariadb-server mariadb') run('yum -y install php php-mysql') run('yum -y install php-bcmath.x86_64 php-cli.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-xml.x86_64') put(os.getcwd()+'/jinja2temps/cmy.cnf', '/etc/my.cnf') # put(os.getcwd()+'/jinja2temps/fphp.ini', '/etc/php.ini') run('touch /var/log/mysql.log ; chown mysql:mysql /var/log/mysql.log') run('systemctl start mariadb ; systemctl enable mariadb') run('echo -e "\n\nfreebsd\nfreebsd\n\n\n\n\n" | mysql_secure_installation 2>/dev/null') msqlpidfile = run('ps waux|grep mysql | grep -v grep| grep -v safe | awk \'{ print $2 }\'') msqlpid = run('cat /var/run/mariadb/mariadb.pid') if msqlpidfile == msqlpid: print('MySQL service already running...') pass else: print('MySQL service is not running...') sys.exit() sitedb = raw_input('Enter name for new database: ') sitedbuser = raw_input('Enter new mysql user name: ') sitedbpasswd = getpass.getpass('Enter pass for '+sitedbuser+': ') sitedbpasswd1 = getpass.getpass('Repeat pass for '+sitedbuser+': ') if sitedbpasswd == sitedbpasswd1: pass else: print('The repeated password for '+sitedbuser+' must be the same!!! ') run('mysql -u root -p\'freebsd\' -e "CREATE DATABASE '+sitedb+';"') run('mysql -u root -p\'freebsd\' -e "GRANT ALL PRIVILEGES ON '+sitedb+'.* TO '+sitedbuser+'@localhost IDENTIFIED BY \''+sitedbpasswd+'\';"') run('mysql -u root -p\'freebsd\' -e "FLUSH PRIVILEGES;"') tempphVars = { "sitedb" : sitedb, "sitedbuser" : sitedbuser, "sitedbpasswd" : sitedbpasswd} outputphpText = tempphp.render( tempphVars ) with open("index.php", "wb") as aphtfile: aphtfile.write(outputphpText) put('index.php', '/var/www/'+sitename+'_public_html/index.php') run('systemctl restart httpd.service') print('MySQL, Apache24 and PHP installed and configured...') elif inst == "n": print('You entered "n" button.') else: print('You can only press "Enter" button or write "n" and after press enter button!!!') else: print(' This script supports FreeBSD or CentOS7 server...')
Save and exit
make the file executable
chmod +x lamp.py
Run the File
[root@puppetnode2 ~]# python lamp.py Traceback (most recent call last): File "lamp.py", line 5, in <module> import jinja2 ImportError: No module named jinja2
Oww issues with Python Jinja2 module.!!!
How to to solve Python Jinja2 missing ?
Install Jinja2 python module
[root@puppetnode2 ~]# yum install python-jinja2 Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: centos.ams.host-engine.com * extras: centos.ams.host-engine.com * updates: centos.mirror.triple-it.nl Resolving Dependencies --> Running transaction check ---> Package python-jinja2.noarch 0:2.7.2-2.el7 will be installed --> Processing Dependency: python-babel >= 0.8 for package: python-jinja2-2.7.2-2.el7.noarch --> Processing Dependency: python-markupsafe for package: python-jinja2-2.7.2-2.el7.noarch --> Running transaction check ---> Package python-babel.noarch 0:0.9.6-8.el7 will be installed ---> Package python-markupsafe.x86_64 0:0.11-10.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================= Package Arch Version Repository Size ================================================================================= Installing: python-jinja2 noarch 2.7.2-2.el7 base 515 k Installing for dependencies: python-babel noarch 0.9.6-8.el7 base 1.4 M python-markupsafe x86_64 0.11-10.el7 base 25 k
Try again
[root@puppetnode2 ~]# python lamp.py Traceback (most recent call last): File "lamp.py", line 7, in <module> from fabric.api import * ImportError: No module named fabric.api [root@puppetnode2 ~]#
Jinja2 solved . we need fabric
First install epel-release for centos 7
yum install epel-release
Install Fabric
yum install fabric ================================================================================= Package Arch Version Repository Size ================================================================================= Installing: fabric noarch 1.6.2-1.el7 epel 133 k Installing for dependencies: libtomcrypt x86_64 1.17-23.el7 epel 224 k libtommath x86_64 0.42.0-4.el7 epel 35 k python-paramiko noarch 1.15.1-1.el7 epel 999 k python2-crypto x86_64 2.6.1-9.el7 epel 475 k python2-ecdsa noarch 0.13-4.el7 epel 83 k
Run and start deploying from Node2 to Node1
[root@puppetnode2 freebsd-centos7-amp-master]# ./apmyph.py Please enter WEB server IP address: 192.168.28.142 Please enter username for UNIX/Linux server: root Password: Please enter site name: puppetnode1 This is CentOS server... Apache 24 server installed and configured... If you want install and configure MySQL PHP just press "Enter"!!! If you want to exit from script write "n" and press Enter button. Please select: You are selected "Enter" button MySQL service already running... Enter name for new database: UNIXMEN Enter new mysql user name: test Enter pass for test: Repeat pass for test: MySQL, Apache24 and PHP installed and configured...
Check if Lamp is running on Node 1
Check Ports:
[root@puppetnode1 ~]# netstat -an | grep LISTEN | grep tcp tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp6 0 0 :::80 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 :::443 :::* LISTEN
Check apache :
[root@puppetnode1 ~]# ps -ef | grep htt root 64778 1 0 06:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 64780 64778 0 06:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 64781 64778 0 06:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 64782 64778 0 06:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 64783 64778 0 06:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 64784 64778 0 06:22 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND root 64965 12455 0 06:22 pts/1 00:00:00 grep --color=auto htt [root@puppetnode1 ~]#
Check database
[root@puppetnode1 ~]# mysql -u test -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 13 Server version: 5.5.47-MariaDB MariaDB Server Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | UNIXMEN | +--------------------+ 2 rows in set (0.00 sec) MariaDB [(none)]> use UNIXMEN; Database changed MariaDB [UNIXMEN]>
Configure Firewall to Allow Apache port :
[root@puppetnode1 ~]# sudo firewall-cmd --permanent --add-port=80/tcp success [root@puppetnode1 ~]# sudo firewall-cmd --reload success
Check in ur browser if you see this you are done
The browser is reading first php file (httpd.conf)
[root@puppetnode1 puppetnode1_public_html]# cat index.php <?php ini_set('display_errors', 1); //Enable error print to the screen $dblocation = "localhost"; //IP address for the database $dbname = "UNIXMEN"; //Database name to which we will connect $dbuser = "test"; //New username for new database $dbpasswd = "test"; //Password for the new username $dbcnx = @mysql_connect($dblocation, $dbuser, $dbpasswd); if (!$dbcnx){ echo "<p>So pity MySQL is not working</p>"; exit(); } if (!@mysql_select_db($dbname,$dbcnx)){ echo "<p>We are sorry, to connect to the database was not successfully.</p>"; exit(); } $ver = mysql_query("SELECT VERSION()"); if(!$ver){ echo "<p>Request error</p>"; exit(); } echo mysql_result($ver, 0); ?>
Check your browser now
it works!!. i have not tested that on FreeBSD. but i think it will work smoothly
Please review that and give us your feedback