--- title: World Simplest BOSH Release (New BOSH CLI version) tags: ["BOSH", "BOSH-Lite", "English"] categories: ["Dev", "Infrastructure", "BOSH"] date: 2017-01-23T15:59:05Z updated: 2017-06-04T15:45:59Z --- **⚠️ This article is [new BOSH CLI](https://github.com/cloudfoundry/bosh-cli) version of [this one](https://blog.ik.am/entries/399)**. I'd like to show how to create smallest [BOSH](http://bosh.io) release from scratch. I've tested with bosh-lite created in [this article](https://blog.ik.am/entries/404). ``` $ bosh -version version 0.0.147-ba602d1-2017-01-11T20:05:06Z ``` **Table of Contents** ### Create a project ``` bosh init-release --dir=simple-http-server-boshrelease --git cd simple-http-server-boshrelease ``` ### Create a job ``` bosh generate-job simple-http-server ``` Create `jobs/simple-http-server/templates/ctl.erb`: ``` bash #!/bin/bash JOB_NAME=simple-http-server RUN_DIR=/var/vcap/sys/run/$JOB_NAME LOG_DIR=/var/vcap/sys/log/$JOB_NAME PIDFILE=${RUN_DIR}/pid PORT=<%= p("server.port") %> case $1 in start) mkdir -p $RUN_DIR $LOG_DIR chown -R vcap:vcap $RUN_DIR $LOG_DIR cp /var/vcap/packages/$JOB_NAME/index.html . echo $$ > $PIDFILE exec chpst -u vcap:vcap python -m SimpleHTTPServer $PORT \ >>$LOG_DIR/$JOB_NAME.log 2>&1 ;; stop) kill -9 `cat $PIDFILE` rm -f $PIDFILE ;; *) echo "Usage: ctl {start|stop}" ;; esac ``` Create `jobs/simple-http-server/spec`: ``` yaml --- name: simple-http-server templates: ctl.erb: bin/ctl packages: properties: server.port: description: "Port on which server is listening" default: 8080 ``` Create `jobs/simple-http-server/monit`: ``` check process simple-http-server with pidfile /var/vcap/sys/run/simple-http-server/pid start program "/var/vcap/jobs/simple-http-server/bin/ctl start" stop program "/var/vcap/jobs/simple-http-server/bin/ctl stop" group vcap ``` ### Create a package ``` bosh generate-package simple-http-server ``` Create source files: ``` mkdir src/simple-http-server echo 'Hello BOSH!' > src/simple-http-server/index.html ``` Create `packages/simple-http-server/packaging`: ``` # abort script on any command that exits with a non zero value set -e -x cp -a simple-http-server/index.html $BOSH_INSTALL_TARGET ``` Create `packages/simple-http-server/spec`: ``` --- name: simple-http-server dependencies: files: - simple-http-server/index.html ``` Then update `jobs/simple-http-server/spec`: ``` yaml --- name: simple-http-server templates: ctl.erb: bin/ctl packages: - simple-http-server properties: server.port: description: "Port on which server is listening" default: 8080 ``` ### Create and Upload a release Create `config/final.yml`: ``` --- blobstore: provider: local options: blobstore_path: /tmp/simple-http-server final_name: simple-http-server ``` and ``` bosh create-release --name=simple-http-server --force && bosh -e vbox upload-release ``` ### Create a manifest ``` mkdir manifest ``` Create `manifest/simple-http-server.yml`: ``` yaml --- name: simple-http-server releases: - name: simple-http-server version: latest stemcells: - os: ubuntu-trusty alias: ubuntu version: latest instance_groups: - name: simple-http-server jobs: - name: simple-http-server release: simple-http-server properties: server: port: 8080 instances: 1 stemcell: ubuntu azs: [z1] vm_type: default persistent_disk_type: default networks: - name: default update: canaries: 1 max_in_flight: 3 canary_watch_time: 30000-600000 update_watch_time: 5000-600000 ``` ### Deploy a cluster Finally, ``` bosh -e vbox -n -d simple-http-server deploy manifest/manifest.yml ``` You can see the deployed VM(s): ``` $ bosh -e vbox vms Using environment '192.168.50.6' as client 'admin' Task 19. Done Deployment 'simple-http-server' Instance Process State AZ IPs VM CID VM Type simple-http-server/7b1b17a4-7dc6-4362-bbce-70fff4098aba running z1 10.244.0.3 f7b7df10-a93f-4282-47cf-c2040413c640 default 1 vms Succeeded ``` Hit the http server: ``` $ curl 10.244.0.3:8080 Hello BOSH! ```