diff --git a/devops-service/INSTALL.md b/devops-service/INSTALL.md new file mode 100644 index 0000000..6a15d63 --- /dev/null +++ b/devops-service/INSTALL.md @@ -0,0 +1,235 @@ +Installation guide +============= + +This is the installation guide of the devops server. + +## Contents + +* [Software requirements](#software) + * [RHEL-based systems](#rhel) + * [Debian-based systems](#debian) +* [System users](#users) +* [Directories](#directories) +* [RVM](#rvm) +* [Downloads](#downloads) +* [Gems](#gems) +* [SSH configuration](#ssh) +* [Knife configuration](#knife) +* [Devops configuration](#clouds) + * [Openstack](#cloud_openstack) + * [Ec2](#cloud_ec2) +* [Init script](#init) +* [Run devops](#run) + +

Software requirements

+ +Before installing devops, you should install system requirements: bash, gcc, make, wget, unzip, libxml2, libxslt + +

RHEL-based systems

+ + # yum install -y bash gcc make wget unzip gcc-c++ libxml2-devel libxslt-devel + +

Debian-based systems

+ + # apt-get install bash gcc make wget unzip g++ libxml2-dev libxslt-dev + +

System users

+ +Create user devops + + # useradd -m -d /devops --system -s /bin/bash devops + +

Directories

+ +Create log directory: + + # mkdir -p /var/log/devops + # chown devops: /var/log/devops + +Create pid directory: + + # mkdir -p /var/run/devops + # chown devops: /var/run/devops + +Create devops directory: + + # mkdir -p /devops/devops + # chown devops: /devops/devops + +Create ssh, chef directories: + + # mkdir -p /devops/{.ssh,.chef} + # chown devops: /devops/{.ssh,.chef} + +Create bootstrap directory + + # mkdir -p /devops/.chef/bootstrap + # chown devops: /devops/.chef/bootstrap + +Create devops public directory: + + # mkdir -p /devops/devops/public + # chown devops: /devops/devops/public + +

RVM

+ +You should install rvm with ruby 1.9 or use system ruby + +

Downloads

+ +Download devops-service-master.zip from https://github.com/ggasoftware/devops-service into /tmp +Unzip devops-service-master.zip + + # unzip /tmp/devops-service-master.zip -d /tmp/ + +Copy devops-service + + # cp -rf /tmp/devops-service-master/devops-service/* /devops/devops + # chown devops: -R /devops/devops + +Create client gem + + # cd /tmp/devops-service-master/devops-client/ + # rake build + # cp pkg/devops-client*.gem /devops/devops/public/devops-client.gem + # chown devops: /devops/devops/public/devops-client.gem + +

Gems

+ +Install bundler + + # gem install bundler + +Then run bundler + + # cd /devops/devops && bundle install + +

SSH configuration

+ + # cat /devops/.ssh/config + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + +

Knife configuration

+ + # cat /devops/.chef/knife.rb + log_level :info + log_location STDOUT + node_name "devops" + chef_server_url "" + validation_client_name "chef-validator" + client_key "/devops/.chef/client.pem" + validation_key "/devops/.chef/validation.pem" + +Then you should create client 'devops' with admin privileges on your chef server and copy your client.pem and validation.pem into /devops/.chef + + chown devops: /devops/.chef/client.pem + chmod 0600 /devops/.chef/client.pem + chown devops: /devops/.chef/validation.pem + chmod 0600 /devops/.chef/validation.pem + +

Devops configuration

+ +Devops configuration file is /devops/devops/config.rb + + # cat /devops/devops/config.rb + config[:knife_config_file] = "/devops/.chef/knife.rb" + config[:role_separator] = "_" + config[:mongo_host] = "" + config[:mongo_port] = 27017 + config[:mongo_db] = "" + config[:mongo_user] = "" + config[:mongo_password] = "" + config[:port] = 7070 + config[:client_file] = "/devops/devops/public/devops-client.gem" + config[:public_dir] = "/devops/devops/public" + +

Openstack

+ +To configure openstack cloud, you should add to /devops/devops/config.rb: + + config[:openstack_username] = "" + config[:openstack_api_key] = "" + config[:openstack_auth_url] = "http://:5000/v2.0/tokens" + config[:openstack_tenant] = "" + config[:openstack_ssh_key] = "" + config[:openstack_certificate] = "/devops/.ssh/openstack.pem" + +And copy your openstack certificate 'openstack.pem' into /devops/.ssh/ + +

Ec2

+ +To configure ec2 cloud, you should add to /devops/devops/config.rb: + + config[:aws_access_key_id] = "" + config[:aws_secret_access_key] = "Init script + + # cat /etc/init.d/devops_service + #!/bin/bash + # + # devops_service: Start/Stop devops service + # + # chkconfig: - 80 05 + # description: Enable devops service + user=devops + devops_home=/devops/devops + pid_file=/var/run/devops/devops.pid + log_file=/var/log/devops/service.log + port=7070 + env=production + start() { + echo "Starting devops service" + PIDDIR="${pid_file%/?*}" + if [ ! -f $PIDDIR ]; then + mkdir -p $PIDDIR + chown $user $PIDDIR + fi + su - $user -c "cd $devops_home && bundle exec thin -R $devops_home/config.ru -e $env -d -p $port -t 600 -u $user --pid $pid_file --log $log_file start" + return $? + } + stop() { + echo "Stopping devops service" + su - $user -c "cd $devops_home && bundle exec thin --pid $pid_file stop" + } + status() { + if [ -f $pid_file ]; then + pid=`cat $pid_file` + echo "Running with pid: $pid" + else + echo "Not running" + fi + return $? + } + case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + stop + start + ;; + status) + status + ;; + *) + echo "Usage: $0 (start|stop|restart|status)" + exit 1 + esac + exit $? + +

Run devops

+ +Before run devops, check or disable iptables + + chmod +x /etc/init.d/devops_service + /etc/init.d/devops_service start diff --git a/devops-service/providers/openstack.rb b/devops-service/providers/openstack.rb index f1043ac..fabdc9b 100644 --- a/devops-service/providers/openstack.rb +++ b/devops-service/providers/openstack.rb @@ -125,13 +125,20 @@ puts list[0].inspect else out << "\nERROR: Bad request (400): #{response['badRequest']['message']}" end + out << "\n" return false else out << "\nERROR: Unknown server error (#{response['badRequest']['code']}): #{response['badRequest']['message']}" + out << "\n" return false end + rescue Excon::Errors::InternalServerError => ise + out << "\nError: openstack internal server error " + ise.message + out << "\n" + return false rescue => e2 - out << "Error: Unknown error: " + e.message + out << "\nError: Unknown error: " + e2.message + out << "\n" return false end sbody = o_server.body