Note: This doc has been deprecated. Please see instead: Get started with Juju.
This guide introduces you to Juju and charmed operators deployment on a local Ubuntu machine. If you are using MS Windows or macOS you can still follow this tutorial by installing Multipass. By the end of this guide you will have a running web application backed by a database.
Create the test environment
MS Windows and macOS users. Optional step for Ubuntu users.
- Install the Juju CLI client
- Create a local cloud
- Bootstrap the Juju OLM controller into the cloud
- Deploy charmed operators
- Relate charmed operators
- Destroy your test environment
- Next steps
The instructions in this tutorial are based on an Ubuntu system. This section details how to quickly create a test environment on MS Windows and macOS using a virtual machine deployed by Multipass.
This section is also useful for those that are already running Ubuntu, but would like to create an isolated test environment that could be easily removed.
Info: Multipass is a tool for quickly running virtual machines from any host operating system. This will allow you to create a fully-isolated test environment that won’t impact your host system.
You can find system specific information on how to install Multipass at multipass.run.
To start a virtual machine called, for example, “microcloud”, that has 8 GB RAM allocated to it, execute:
multipass launch -n microcloud -m 8g -c 2 -d 20G
Multipass will confirm the creation:
multipass has downloaded the latest Long Term Support version of the Ubuntu operating system, you will be able to enter a command-line with the
multipass shell microcloud
This gives you access to the shell (you may see a different prompt, depending on the version installed):
You are now ready to follow the rest of this guide in our newly created Ubuntu machine. All commands should be typed in this shell.
If for whatever reason you need to interrupt this tutorial,we recommend running
multipass stop microcloud to stop the instance. When you resume, run
multipass start microcloud.
We will now install the Juju client via
snap: this is the easiest and fastest way to get started with Juju.
Other installation methods You can find a comprehensive list of all the ways you have to install Juju at Juju | How to install `juju` .
The following command will install the Juju client:
sudo snap install juju --classic
If the installation was successful, you will see a message similar to the one below:
juju 2.8.10 from Canonical✓ installed
We will use LXD for creating a cloud on the localhost. LXD should be already installed in your Ubuntu system. (See How to set up a LXD cloud for a more detailed how-to guide.)
Info: LXD is a system container and virtual machine manager. Juju uses it to instantiate the set of containers that are needed for the app. Need to install LXD? Visit the LXD docs for installation instructions.
Juju speaks directly to the local LXD daemon, which also requires
lxd group membership.
newgrp lxd sudo adduser $USER lxd
The Ubuntu user is already a member of
LXD then needs to be configured for its environment:
lxd init --auto
Finally, IPv6 needs to be disabled:
lxc network set lxdbr0 ipv6.address none
localhost cloud is now established. We can verify that by running
Juju should have detected the presence of LXD and added it as the
[...] localhost 1 localhost lxd LXD Container Hypervisor
Juju uses an active software agent, called the controller, to manage applications. The controller is installed on a machine through the bootstrap process. The code below illustrates this for a controller called “overlord”.
juju bootstrap localhost overlord
During the bootstrap process, Juju connects with the cloud, then provisions a machine on which to install the controller, then installs the controller.
Creating Juju controller "overlord" on localhost/localhost Looking for packaged Juju agent version 2.6.8 for amd64 [...]
The first workload that you’ll deploy is a simple web application. You’ll deploy an application that uses the Flask microframework to send “Hello Juju!” via HTTP.
juju deploy hello-juju
The charmed operator name
hello-juju is resolved into an actual charmed operator version by contacting Charmhub. This charmed operator is then downloaded by the controller and used as the source of the application that was created with the same name:
Located charm "hello-juju-4". Deploying charm "hello-juju-4".
The next step is to use
juju expose to configure the necessary security groups and firewall rules and make the
hello-world application publicly available over the network:
Check the deployment
juju expose hello-juju
Now that a workload is in place, use
juju status to inspect what is happening. It can take a few minutes for the application to start up but, once it’s ready, the output will show the status of the
hello-juju app as active:
It can take a few minutes for the application to start up, but once it’s ready, the output will show that the status of the hello-juju app is active:
Model Controller Cloud/Region Version SLA Timestamp default overlord localhost/localhost 2.8.10 unsupported 16:24:04+12:00 App Version Status Scale Charm Store Rev OS Notes hello-juju active 1 hello-juju jujucharms 4 ubuntu Unit Workload Agent Machine Public address Ports Message hello-juju/0* active idle 0 10.47.112.215 80/tcp Machine State DNS Inst id Series AZ Message 0 started 10.47.112.215 juju-646ac9-0 bionic Running
juju status output above provided the “Public address” of the
hello-juju/0 unit as
10.47.112.215 and its “Port” as
80/tcp. Let’s connect!
If the connection was successful, you will (among other things) see:
Relations are Juju’s defining concept and its main point of difference with other systems in its class. They enable the simplicity, security, and stability offered by the whole project.
hello-juju web server maintains a count for each greeting that it has sent out via the
By default, this state is maintained within a SQLite database that is set up by the
hello-juju charmed operator itself. In this section, we will deploy a PostgreSQL database and relate it to our
hello-juju charmed operator.
To deploy the PostgreSQL database, we will use the same
juju deploy postgresql
Located charm "postgresql-199". Deploying charm "postgresql-199".
The PostgreSQL charm may take a few moments to be deployed. You can check the status of the deployment by running:
When ready, the field
status will ready
active. You should wait for the charm deployment to finish before following the next steps.
To relate the two charmed operators, all we need to do is run:
juju relate postgresql:db hello-juju
The applications will auto-configure themselves. You now have a web application and a database deployed and ready to use without having to deal with application-specific configuration!
With another application and a relation in place, the
juju status output has expanded:
juju status --relations
--relations option to include relations information:
Model Controller Cloud/Region Version SLA Timestamp default overlord localhost/localhost 2.8.10 unsupported 16:24:04+12:00 App Version Status Scale Charm Store Rev OS Notes hello-juju active 1 hello-juju jujucharms 3 ubuntu postgresql 10.10 active 1 postgresql jujucharms 199 ubuntu Unit Workload Agent Machine Public address Ports Message hello-juju/0* active idle 0 10.47.112.215 80/tcp postgresql/0* active idle 0 10.47.112.216 5432/tcp Live master (10.10) Machine State DNS Inst id Series AZ Message 0 started 10.47.112.215 juju-646ac9-0 bionic Running 1 started 10.47.112.216 juju-646ac9-1 bionic Running Relation provider Requirer Interface Type Message postgresql:coordinator postgresql:coordinator coordinator peer postgresql:db hello-juju:db pgsql regular postgresql:replication postgresql:replication pgpeer peer
Once you are done, you can run
multipass delete microcloud to delete your instance. You can also uninstall Multipass to remove any trace of this guide.
This tutorial has introduced you to the basic things you can do with Juju. Visit the Juju How-to docs to experiment with further features such as scaling or cross-model relations; the Juju Reference docs to learn more about the primitive notions and commands that make Juju work; or the Juju Explanation docs, just for fun.