Disconnected Install of OpenShift Origin (Single VM)

This article explains the technique for installing OpenShift Origin (open source) v3.6.1 on a single-VM in disconnected mode (i.e. no internet proxy).

Ref: The disconnected install of OpenShift Container Platform (enterprise) is documented here, which was a great help for finding this workaround.

Environment Setup

Linux VM – CentOS 7.x Minimal
– SELINUX Disabled
– Firewall Disabled

Export docker images on a DMZ host

OPENSHIFT_REL=v3.6.1

# fetch openshift-origin images
docker pull openshift/origin-deployer:${OPENSHIFT_REL}
docker pull openshift/origin-docker-registry:${OPENSHIFT_REL}
docker pull openshift/origin-haproxy-router:${OPENSHIFT_REL}
docker pull openshift/origin-pod:${OPENSHIFT_REL}
docker pull openshift/origin-sti-builder:${OPENSHIFT_REL}
docker pull openshift/origin-docker-builder:${OPENSHIFT_REL}
docker pull centos:7

# export images
docker save -o openshift-origin-${OPENSHIFT_REL}-images.tar \
docker.io/openshift/origin-deployer:${OPENSHIFT_REL} \
docker.io/openshift/origin-docker-registry:${OPENSHIFT_REL} \
docker.io/openshift/origin-haproxy-router:${OPENSHIFT_REL} \
docker.io/openshift/origin-pod:${OPENSHIFT_REL} \
docker.io/openshift/origin-sti-builder:${OPENSHIFT_REL} \
docker.io/openshift/origin-docker-builder:${OPENSHIFT_REL} \
docker.io/centos:7

# verify - it should be ~1.8GB ; transfer it to target host (somehow!)
ls -hl openshift-origin-${OPENSHIFT_REL}-images.tar

Downalod origin-server binaries

# download origin-server
OPENSHIFT_REL=v3.6.1
OPENSHIFT_BLD=008f2d5
curl -fLOk https://github.com/openshift/origin/releases/download/${OPENSHIFT_REL}/openshift-origin-server-${OPENSHIFT_REL}-${OPENSHIFT_BLD}-linux-64bit.tar.gz
# verify - it should be ~109MB ; transfer it to target host (somehow!)
ls -hl openshift-origin-server-${OPENSHIFT_REL}-${OPENSHIFT_BLD}-linux-64bit.tar.gz

Prep target host

yum install -y docker git

cat > /etc/docker/daemon.json << '__EOF__'
{
  "insecure-registries" : ["172.30.0.0/16"]
}
__EOF__

systemctl start docker
systemctl enable docker

Import docker images on target host

from previously exported tarball

OPENSHIFT_REL=v3.6.1
# verify - it should be ~1.8GB
ls -hl openshift-origin-${OPENSHIFT_REL}-images.tar
# import images
docker load --input openshift-origin-${OPENSHIFT_REL}-images.tar

Set environments

tee /etc/profile.d/openshift.sh << '__EOF__'
export OPENSHIFT_REL=v3.6.1
export OPENSHIFT_BLD=008f2d5
export OPENSHIFT=/opt/openshift-origin-${OPENSHIFT_REL}
export PATH=$OPENSHIFT:$PATH
export KUBECONFIG=$OPENSHIFT/openshift.local.config/master/admin.kubeconfig
export CURL_CA_BUNDLE=$OPENSHIFT/openshift.local.config/master/ca.crt
__EOF__

chmod 755 /etc/profile.d/openshift.sh
. /etc/profile.d/openshift.sh

Unpack binaries

from previously downloaded tarball

mkdir -p ${OPENSHIFT}
chmod 755 ${OPENSHIFT}

cd ${OPENSHIFT}
tar -zxvf openshift-origin-server-*.tar.gz --strip-components 1
rm -f openshift-origin-server-*.tar.gz

Generate config

cd ${OPENSHIFT}
./openshift start --write-config=openshift.local.config
# make it readbale by oc
chmod +r openshift.local.config/master/*.kubeconfig

Launch server

nohup ./openshift start --master-config=openshift.local.config/master/master-config.yaml --node-config=openshift.local.config/node-*/node-config.yaml &

Browse to URL: https://vm_ip_address:8443

Create admin user

oc login -u system:admin
oc project default

oc policy add-role-to-user cluster-admin admin

Install registry & router

mkdir /opt/openshift-registry
chcon -Rt svirt_sandbox_file_t /opt/openshift-registry
chown 1001.root /opt/openshift-registry
oadm policy add-scc-to-user privileged -z registry 
oadm registry --service-account=registry --mount-host=/opt/openshift-registry

oadm policy add-scc-to-user hostnetwork -z router
oadm router router --replicas=1

Validate that pods are up & running

[root@kube-osv3 ~]# oc get po -n default
NAME                         READY     STATUS    RESTARTS   AGE
po/docker-registry-1-q3692   1/1       Running   0          21m
po/router-1-7n48q            1/1       Running   0          21m

TODO: get imagestreams, build containers

Cheers,

Minimal Mesosphere DC/OS v1.9 (Single)

… (with tweak for running a tiny marathon-lb on the slave node)

Introduction

Mesosphere DC/OS is built on top of Apache Mesos, which is a leading open-source framework for distributed applications. The key design differentiation is its two-level scheduler which enables it to handle complex workloads like big-data analytics, grid computing, etc.

The official recommendation for a lab-install is Vagrant, which may not be available in many big enterprise environments (for obvious reasons).

In this article, we’ll go over the procedure for setting up a tiny DC/OS cluster using a Single VM and demonstration of basic orchestration capability using Marathon framework.

Requirements

  • One VM only! (for a resource constrained lab or laptop)
  • CentOS 7.3 Minimal + SELINUX Disabled + Firewall Disabled + IPv6 Disabled
  • Docker (docker-ce 17.06.0.ce)

Configuration

Host Role VM Size
mesos-single bootstrap + master + slave + dcos-cli 2 CPU, 6GB RAM, 60GB HDD

Prerequisites

NOTE: set proxy related environment variables if needed.

# only if proxy is needed
export http_proxy="http://192.168.20.225:3128"
export https_proxy="http://192.168.20.225:3128"
# get yum repo for docker-ce
curl -sfo /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo

# install docker-ce and other required packages
yum install -y epel-release docker-ce tar xz unzip curl ipset chrony
groupadd nogroup
# clean yum cache (optional)
yum clean all

# only if proxy is needed
# proxy needed - start
mkdir -p /etc/systemd/system/docker.service.d

cat > /etc/systemd/system/docker.service.d/override.conf << '__EOF__'
[Service] 
Environment="HTTP_PROXY=http://192.168.20.225:3128"
Environment="HTTPS_PROXY=http://192.168.20.225:3128"
Environment="NO_PROXY=localhost,127.0.0.0/8,192.168.20.0/24,*.sudhaker.com"
__EOF__

systemctl daemon-reload
# proxy needed - end

# enable and start docker
systemctl enable docker
systemctl start docker

# add to host file if DNS doesn't resolve the hostname
tee -a /etc/hosts << '__EOF__'
192.168.20.80 mesos-single
__EOF__

To be run for bootstrap

Generate bootstrap

# create setup directory, download the install binary
mkdir /opt/dcos-setup && cd /opt/dcos-setup && curl -O https://downloads.dcos.io/dcos/stable/dcos_generate_config.sh

# create config directory 
mkdir -p genconf

# create ip-detect script; change 'ens192' if needed
cat > genconf/ip-detect << '__EOF__'
#!/usr/bin/env bash
set -o nounset -o errexit
export PATH=/usr/sbin:/usr/bin:$PATH
echo $(ip addr show ens192 | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1)
__EOF__
chmod 755 genconf/ip-detect

### VERY IMPORTANT: validate that the following ip-detect is working
### if not then follow https://dcos.io/docs/1.9/administration/installing/custom/advanced/
###   to get a working script, must work consistently on this node
./genconf/ip-detect

# configuration yaml
cat > genconf/config.yaml << '__EOF__'
---
bootstrap_url: http://mesos-single:8081       
cluster_name: dcos
exhibitor_storage_backend: static
master_discovery: static
master_list:
- 192.168.20.80
resolvers:
- 8.8.4.4
- 8.8.8.8
telemetry_enabled: 'false'
# only if proxy is needed
use_proxy: 'true'
http_proxy: http://192.168.20.225:3128
https_proxy: http://192.168.20.225:3128
no_proxy:
- localhost
- 127.0.0.0/8
- 192.168.20.0/24
- '*.sudhaker.com'
__EOF__

# generate bootstarp
bash dcos_generate_config.sh

Launch bootstrap

# serve the bootstrap code-base using tiny nginx (alpine based)
docker pull nginx:alpine
docker run -d --restart=unless-stopped -p 8081:80 -v /opt/dcos-setup/genconf/serve:/usr/share/nginx/html:ro --name=dcos-bootstrap-nginx nginx:alpine

To be run for {master}

mkdir -p /tmp/dcos && cd /tmp/dcos && curl -O --noproxy '*' http://mesos-single:8081/dcos_install.sh && bash dcos_install.sh master && cd -

The installation progress can be seen at exhibitor URL i.e. http://192.168.20.80:8181/

Install dcos-cli (while we are waiting for the master to come up).

mkdir -p ~/bin && cd ~/bin && curl -sfO https://downloads.dcos.io/binaries/cli/linux/x86-64/0.4.17/dcos && chmod 755 ~/bin/dcos && cd -

dcos config set core.dcos_url http://192.168.20.80
dcos auth login

To be run for {slave}

NOTE: this is the tweak for running slave on the master node (not supported officially, may break in the future release).

export opt_mesos=$(ls -1d /opt/mesosphere/packages/mesos--*)
ln -s $opt_mesos/dcos.target.wants_slave/dcos-mesos-slave.service /etc/systemd/system
ln -s $opt_mesos/dcos.target.wants_slave/dcos-mesos-slave.service /etc/systemd/system/dcos.target.wants
systemctl start dcos-mesos-slave

DC/OS UI

Browse to http://192.168.20.80 (when ready – usually takes 5-to-10 minutes)

DC/OS v1.9 UI

Install the tiny marathon-lb (0.1 CPU, 128mb RAM)

IMPORTANT: dcos package based install won’t allow our proposed tiny configuration, so we’ll use marathon!

Export marathon json

# allows to run on slave and skip port 80+443 binding
cat > marathon-lb-internal.json << '__EOF__'
{ "marathon-lb":{ "name": "marathon-lb-internal", "instances": 1, "haproxy-group": "internal", "role": "", "bind-http-https": false} }
__EOF__
# export the marathon configuration (for tweaking)
dcos package describe --app --render marathon-lb --options=marathon-lb-internal.json > marathon-lb.json

Edit the json, use sed or manually edit it
Set cpu to 0.1 and mem to 128 (more than enough for a demo setup)

sed -i 's/"cpus": 2/"cpus": 0.1/' marathon-lb.json
sed -i 's/ "mem": 1024/ "mem": 128/' marathon-lb.json

Let marathon deploy this app

dcos marathon app add marathon-lb.json

Install the demo app (dockercloud/hello-world)

Our demo app for this setup is dockercloud/hello-world

cat > dockercloud-hello-world.json << '__EOF__'
{
  "id": "dockercloud-hello-world",
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "dockercloud/hello-world",
      "network": "BRIDGE",
      "portMappings": [
        { "hostPort": 0, "containerPort": 80, "servicePort":10000 }
      ],
      "forcePullImage":true
    }
  },
  "instances": 2,
  "cpus": 0.1,
  "mem": 128,
  "healthChecks": [{
      "protocol": "HTTP",
      "path": "/",
      "portIndex": 0,
      "timeoutSeconds": 10,
      "gracePeriodSeconds": 10,
      "intervalSeconds": 2,
      "maxConsecutiveFailures": 10
  }],
  "labels":{
    "HAPROXY_GROUP":"internal"
  }
}
__EOF__

# deploy the demo app
dcos marathon app add dockercloud-hello-world.json

Browse to => http://192.168.20.80:10000/

or run the follwoing command

for i in $(seq 1 5); do curl -sf http://192.168.20.80:10000/ | grep -oP "My hostname is [0-9,a-z]+"; done

Output:

My hostname is 705bc9fdf535
My hostname is d74cf174fff0
My hostname is 705bc9fdf535
My hostname is d74cf174fff0
My hostname is 705bc9fdf535

Summary

The single node DC/OS setup has a lower (roughly 3gb) resource/memory overhead and can be great for learning and tryout simple container / micro-service workloads. It is possible to run additional non-distributed frameworks (like Jenkins) if adequate RAM is available.

Have fun!

Economics of DC/OS Starter Cluster on AWS

… (with some tweaks and rants)

Ref: https://dcos.io/docs/1.8/administration/installing/cloud/aws/
Ref: https://downloads.dcos.io/dcos/stable/aws.html

DC/OS AWS CloudFormation Options

Master Agent Hourly Cost ($) Daily ($)
1 5 + 1 $1.862 (= 0.266*7) ~ $45
3 5 + 1 $2.394 (= 0.266*9) ~ $57.50

That’s about a COFFEE every hour. Not bad if you need it for few hours only (or PoC is funded by company).

A word of caution here – make sure that you completely destroy the stack using CloudFormation console. Your EC2 instances will come back to life if you simply kill them from “EC2 Dashboard”. One of my friend got over $800 invoice because he didn’t understand this awesome feature of CloudFormation.

So what to do if you are on a tighter budget (like self-funded learning adventure) and want to explore DC/OS?

How do I get DC/OS on AWS for cheap?

Option EC2 Hourly ($) Daily ($) Spot
Single m3.xlarge $0.266 ~ $6.38 ~$1.00
Mini m3.large + m3.xlarge $0.379 ~ $9.09 ~$1.40

FYI: SPOT gets 85-90% savings.

My suggestion would be Mini Install which is good enough for trying out simple utility & microservices use-cases or go for {1 master +5 agents} for big-data analytics use-case.

Ref: https://docs.mesosphere.com/1.8/administration/installing/custom/advanced/

Minimal Mesosphere DC/OS v1.8 (Mini)

… (with tweak for running a tiny marathon-lb on the slave node)

Prerequisites

  • Two VMs only! (for a resource constrained lab or laptop)
  • CentOS 7.x Minimal + SELINUX Disabled + Firewall Disabled + IPv6 Disabled
  • Docker 1.11.x with “–storage-driver=overlay”
  • Catch-all DNS *.a77.sudhaker.com => 192.168.20.77

Configuration

Host Role VM Size
mesos-mini-01 bootstrap + master + dcos-cli 2 CPU, 4GB RAM, 60GB HDD
mesos-mini-02 the slave (hybrid) 2 CPU, 4GB RAM, 60GB HDD

For AWS, mini-01 can be a m3.large or higher & mini-02 can be a m3.xlarge or higher!

Common script – To be run on every node

# add docker repo and install docker
cat > /etc/yum.repos.d/docker.repo << '__EOF__'
[docker]
name=Docker Repository - Centos $releasever
baseurl=http://yum.dockerproject.org/repo/main/centos/$releasever
enabled=1
gpgcheck=1
gpgkey=http://yum.dockerproject.org/gpg
__EOF__

yum install -y https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
yum install -y docker-engine-1.11.2 docker-engine-selinux-1.11.2 tar xz unzip curl ipset nfs-utils

yum clean all

groupadd nogroup

mkdir -p /etc/systemd/system/docker.service.d

cat > /etc/systemd/system/docker.service.d/override.conf << '__EOF__'
[Service] 
ExecStart= 
ExecStart=/usr/bin/docker daemon --storage-driver=overlay
__EOF__

systemctl daemon-reload
systemctl enable docker

systemctl start docker

# if the default DNS doesn't resolve
tee -a /etc/hosts << '__EOF__'

192.168.20.76 mesos-mini-01
192.168.20.77 mesos-mini-02
__EOF__

To be run on node1 {bootstrap + master + dcos-cli}

Generate bootstrap

mkdir /opt/dcos-setup && cd /opt/dcos-setup && curl -O https://downloads.dcos.io/dcos/stable/dcos_generate_config.sh

mkdir -p genconf

cat > genconf/ip-detect << '__EOF__'
#!/usr/bin/env bash
set -o nounset -o errexit
export PATH=/usr/sbin:/usr/bin:$PATH
echo $(ip addr show ens192 | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1)
__EOF__

chmod 755 genconf/ip-detect

### VERY IMPORTANT: validate that the following ip-detect is working
### if not then follow https://dcos.io/docs/1.8/administration/installing/custom/advanced/
###   to get a working script, must work consistently on each & every node
./genconf/ip-detect

cat > genconf/config.yaml << '__EOF__'
---
bootstrap_url: http://mesos-mini-01:8081       
cluster_name: dcos
exhibitor_storage_backend: static
master_discovery: static
master_list:
- 192.168.20.76
resolvers:
- 192.168.20.1
__EOF__

bash dcos_generate_config.sh

Launch bootstrap

docker pull nginx:alpine
docker run -d --restart=unless-stopped -p 8081:80 -v /opt/dcos-setup/genconf/serve:/usr/share/nginx/html:ro --name=dcos-bootstrap-nginx nginx:alpine

Install master

mkdir -p /tmp/dcos && cd /tmp/dcos && curl -O http://mesos-mini-01:8081/dcos_install.sh && bash dcos_install.sh master && cd -

Install dcos-cli (while we are waiting for master to come up).

mkdir -p ~/bin && cd ~/bin && curl -O https://downloads.dcos.io/binaries/cli/linux/x86-64/dcos-1.8/dcos && chmod 755 ~/bin/dcos && cd -

dcos config set core.dcos_url http://mesos-mini-01
dcos auth login

To be run on node2 {the hybrid slave}

mkdir -p /tmp/dcos && cd /tmp/dcos && curl -O http://mesos-mini-01:8081/dcos_install.sh && bash dcos_install.sh slave  && cd -

And then tweak it to support marathon-lb on it (thanks Vishnu for the ‘mesos-resource’ pointer).

systemctl kill -s SIGUSR1 dcos-mesos-slave
systemctl stop dcos-mesos-slave
unlink /var/lib/mesos/slave/meta/slaves/latest

Edit /var/lib/dcos/mesos-resources (add 80, 443) – whatever sed works (validate)

sed -i 's/\[{"begin"/\[{"begin": 80, "end": 80}, {"begin": 443, "end": 443}, {"begin"/' /var/lib/dcos/mesos-resources
OR
sed -i 's/\[{"end"/\[{"begin": 80, "end": 80}, {"begin": 443, "end": 443}, {"end"/' /var/lib/dcos/mesos-resources

Re-initialize the slave (with required ports – 80,443)

systemctl start dcos-mesos-slave

Install the tiny marathon-lb (0.1 CPU, 64mb RAM)

IMPORTANT: dcos package won’t let us install this minimal configuration, so we’ll use marathon!

Export marathon json

dcos package describe --app --render marathon-lb > marathon-lb.json

Edit the json, use sed or manually edit it

sed -i 's/"slave_public"/"*"/' marathon-lb.json
sed -i 's/"cpus": 2/"cpus": 0.1/' marathon-lb.json
sed -i 's/ "mem": 1024/ "mem": 64/' marathon-lb.json

Let marathon deploy this app

dcos marathon app add marathon-lb.json

Install the demo app (dockercloud/hello-world)

cat > dockercloud-hello-world.json << '__EOF__'
{
  "id": "dockercloud-hello-world",
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "dockercloud/hello-world",
      "network": "BRIDGE",
      "portMappings": [
        { "hostPort": 0, "containerPort": 80 }
      ],
      "forcePullImage":true
    }
  },
  "instances": 2,
  "cpus": 0.1,
  "mem": 128,
  "healthChecks": [{
      "protocol": "HTTP",
      "path": "/",
      "portIndex": 0,
      "timeoutSeconds": 10,
      "gracePeriodSeconds": 10,
      "intervalSeconds": 2,
      "maxConsecutiveFailures": 10
  }],
  "labels":{
    "HAPROXY_GROUP":"external",
    "HAPROXY_0_VHOST":"dockercloud-hello-world.a77.sudhaker.com"
  }
}
__EOF__

dcos marathon app add dockercloud-hello-world.json

Browse to => http://dockercloud-hello-world.a77.sudhaker.com

Minimal Mesosphere DC/OS v1.8 (Single)

… (with tweak for running a tiny marathon-lb)

DEPRECATED: in favor of this article i.e. Minimal Mesosphere DC/OS v1.9 (with only 1 node)

warning

Prerequisites

  • One VMs only! (for a resource constrained lab or laptop)
  • CentOS 7.x Minimal + SELINUX Disabled + Firewall Disabled + IPv6 Disabled
  • Docker 1.11.x with “–storage-driver=overlay”

Configuration

Host Role VM Size
mesos-single-01 bootstrap + master + dcos-cli 2 CPU, 4GB RAM, 60GB HDD

Update: I was told that this setup will seize to work with DCOS v1.9 due to some unavoidable conflict. Ouch!

Common script – To be run on every node

# add docker repo and install docker
cat > /etc/yum.repos.d/docker.repo << '__EOF__'
[docker]
name=Docker Repository - Centos $releasever
baseurl=http://yum.dockerproject.org/repo/main/centos/$releasever
enabled=1
gpgcheck=1
gpgkey=http://yum.dockerproject.org/gpg
__EOF__

yum install -y https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
yum install -y docker-engine-1.11.2 docker-engine-selinux-1.11.2 tar xz unzip curl ipset nfs-utils

yum clean all

groupadd nogroup

mkdir -p /etc/systemd/system/docker.service.d

cat > /etc/systemd/system/docker.service.d/override.conf << '__EOF__'
[Service] 
ExecStart= 
ExecStart=/usr/bin/docker daemon --storage-driver=overlay --insecure-registry mesos-mini-01:5000 -H fd:// 
__EOF__

systemctl daemon-reload
systemctl enable docker

systemctl start docker

# if the default DNS doesn't resolve
tee -a /etc/hosts << '__EOF__'

192.168.20.80 mesos-single
__EOF__

To be run on node1 {bootstrap + master + dcos-cli}

Generate bootstrap

mkdir /opt/dcos-setup && cd /opt/dcos-setup && curl -O https://downloads.dcos.io/dcos/stable/dcos_generate_config.sh

mkdir -p genconf

cat > genconf/ip-detect << '__EOF__'
#!/usr/bin/env bash
set -o nounset -o errexit
export PATH=/usr/sbin:/usr/bin:$PATH
echo $(ip addr show ens192 | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1)
__EOF__

chmod 755 genconf/ip-detect

### VERY IMPORTANT: validate that the following ip-detect is working
### if not then follow https://dcos.io/docs/1.8/administration/installing/custom/advanced/
###   to get a working script, must work consistently on each & every node
./genconf/ip-detect

cat > genconf/config.yaml << '__EOF__'
---
bootstrap_url: http://mesos-mini-01:8081       
cluster_name: dcos
exhibitor_storage_backend: static
master_discovery: static
master_list:
- 192.168.20.80
resolvers:
- 192.168.20.1
__EOF__

bash dcos_generate_config.sh

Launch bootstrap

docker pull nginx:alpine
docker run -d --restart=unless-stopped -p 8081:80 -v /opt/dcos-setup/genconf/serve:/usr/share/nginx/html:ro --name=dcos-bootstrap-nginx nginx:alpine

Install master

mkdir -p /tmp/dcos && cd /tmp/dcos && curl -O http://mesos-single:8081/dcos_install.sh && bash dcos_install.sh master && cd -

Install slave

export opt_mesos=$(ls -1d /opt/mesosphere/packages/mesos--*)
ln -s $opt_mesos/dcos.target.wants_slave/dcos-mesos-slave.service /etc/systemd/system
ln -s $opt_mesos/dcos.target.wants_slave/dcos-mesos-slave.service /etc/systemd/system/dcos.target.wants
mkdir -p /var/log/mesos
systemctl start dcos-mesos-slave

Install dcos-cli (while we are waiting for master to come up).

mkdir -p ~/bin && cd ~/bin && curl -O https://downloads.dcos.io/binaries/cli/linux/x86-64/dcos-1.8/dcos && chmod 755 ~/bin/dcos && cd -

dcos config set core.dcos_url http://mesos-single
dcos auth login