---
title: Locations
---

Locations are the environments to which Brooklyn deploys applications. Most commonly these 
are cloud services such as AWS, GCE, and IBM Softlayer. Brooklyn also supports deploying 
to a pre-provisioned network or to localhost (primarily useful for testing blueprints).

See also:

* The [Locations yaml guide]({{book.path.docs}}/blueprints/setting-locations.md)
* Use within an entity of the configuration option 
  [provisioning.properties]({{book.path.docs}}/blueprints/entity-configuration.md#entity-provisioningproperties-overriding-and-merging)
* How to add location definitions to the [Catalog]({{book.path.docs}}/blueprints/catalog/index.md); and 
* How to use [Externalized Configuration]({{book.path.docs}}/ops/externalized-configuration.md).

The requirements for how a provisioned machine should behave will depend on the
entites subsequently deployed there.

Below are a set of common assumptions, made by many entity implementations, which
could cause subsequent errors if they do not hold. These relate to the machine's 
configuration, rather than additional networking or security that a given Cloud 
might offer.

Also see the [Troubleshooting]({{book.path.docs}}/ops/troubleshooting/index.md) docs.


## Remote Access

### SSH or WinRM Access

Many entities require ssh'ing (or using WinRM for Windows), to install and configure 
the software.

An example of disabling all ssh'ing is shown below:

    location:
      aws-ec2:us-east-1:
        identity: XXXXXXXX
        credential: XXXXXXXX
        waitForSshable: false
        pollForFirstReachableAddress: false
    services:
    - type: org.apache.brooklyn.entity.software.base.EmptySoftwareProcess
      brooklyn.config:
        onbox.base.dir.skipResolution: true
        sshMonitoring.enabled: false


### Parsing SSH stdout: No Extra Lines

For entities that execute ssh commands, these sometimes parse the resulting stdout.

It is strongly recommended that VMs are configured so that no additional stdout is written when executing 
remote ssh (or WinRM) commands. Such stdout risks interfering with the response parsing in some blueprints.

For example, if configuring the VM to write out "Last login" information, this should be done for only 
"interactive" shells (see [Stackoverflow](http://stackoverflow.com/a/415444/1393883) for more details).


### Passwordless Sudo

Does passwordless sudo work?

Try executing:

    sudo whoami

See [Passwordless Sudo](#passwordless-sudo).


## Advertised Addresses

### Hostname Resolves Locally

Does the hostname known at the box resolve at the box?

Try executing:

    ping $(hostname)

if not, consider setting `generate.hostname: true` in the location config, for jclouds-based locations.


### IP Resolves Locally

For the IP address advertised in Brooklyn using the sensor `host.addresses.private` (or `host.subnet.address`), 
can the machine reach that IP?

Get the sensor value, and then try executing:

    ping ${PRIVATE_IP}

Is there a public IP (advertised using the sensor `host.addresses.public`, or `host.address`), and can the 
machine reach it?

Get the sensor value, and then try executing:

    ping ${PUBLIC_IP}


## Networking

### Public Internet Access

Can the machine reach the public internet, and does DNS resolve?

Try executing:

    ping www.example.org


### Machine's Hostname in DNS

Is the machine hostname well-known? If ones does a DNS lookup, e.g. from the Brooklyn server, does it resolve and 
does it return the expected IP (e.g. the same IP as the `host.addresses.public` sensor)? Try using the hostname
that the machine reports when you execute `hostname`.

Many blueprints do not require this, instead using IP addresses directly. Some blueprints may include registration
with an appropriate DNS server. Some clouds do this automatically.


### Reachability

When provisioning two machines, can these two machines reach each other on the expected IP(s) and hostname(s)?

Try using `ping` from one machine to another using the public or subnet ip or hostname.
However, note that `ping` requires access over ICMP, which may be disabled. Alternatively,
try connecting to a specific TCP port using `telnet <address> <port>`.


### Firewalls

What firewall(s) are running on the machine, and are the required ports open?
On Linux, check things like `iptables`, `firewalld`, `ufw` or other commercial
firewalls. On Windows, check the settings of the 
[Windows Firewall](https://en.wikipedia.org/wiki/Windows_Firewall).

Consider using `openIptables: true`, or even `stopIptables: true`.


## Sufficient Entropy for /dev/random

Is there sufficient entropy on the machine, for `/dev/random` to respond quickly?

Try executing:

    { cat /dev/random > /tmp/x & } ; sleep 10 ; kill %1 ; { cat /dev/random > /tmp/x & } ; sleep 1 ; kill %1 ; wc /tmp/x | awk '{print $3}'

The result should be more than 1M.

If not, consider setting `installDevUrandom: true` for jclouds-based locations.

See instructions to [Increase Entropy]({{book.path.docs}}/ops/troubleshooting/increase-entropy.md).


## File System

### Permissions of /tmp

Is `/tmp` writable?

Try executing:

    touch /tmp/amp-test-file ; rm /tmp/amp-test-file

Are files in `/tmp` executable (e.g. some places it has been mounted NO_EXECUTE)?

Try executing:

    echo date > /tmp/brooklyn-test.sh && chmod +x /tmp/brooklyn-test.sh && /tmp/brooklyn-test.sh && rm /tmp/brooklyn-test.sh

{% include '_clouds.md' %}
{% include '_AWS.md' %}
{% include '_azure-ARM.md' %}
{% include '_azure-classic.md' %}
{% include '_cloudstack.md' %}
{% include '_GCE.md' %}
{% include '_ibm-softlayer.md' %}
{% include '_openstack.md' %}
{% include '_inheritance-and-named-locations.md' %}
{% include '_byon.md' %}
{% include '_ssh-keys.md' %}
{% include '_localhost.md' %}
{% include '_location-customizers.md' %}
{% include '_location-customizer-security-groups.md' %}
{% include '_special-locations.md' %}
