Juju documentation cover page

Juju is an enterprise Operator Lifecycle Manager (OLM) that provides model-driven application management and next-generation infrastructure-as-code.

The Kubernetes operator pattern replaces configuration file management with software-defined operations and shared, reusable ops code packages. Juju expands this idea to include traditional apps on Windows and Linux.

As a universal operator lifecycle manager for containers, virtual machines and bare metal that manages provisioning and underlying infrastructure, Juju provides a clean approach to multi-cloud operations. Applications can be managed on multiple clouds, and on premise, in machines or on Kubernetes, and then integrated automatically.

Operators are packaged in charms and distributed through Charmhub.io which hosts the Open Operator Collection. A charm is a compressed archive of the operator code and metadata, which can also be shared directly along with applications.

Reusable ops code

We share the code to our open source applications. Why don’t we share the operations code, too?

With traditional configuration management, the architecture of a deployment was hard-coded into the infrastructure-as-code for that operation.

With Juju, the architecture is expressed in a model, which captures the applications, the integration, the machines. Operators discover the model dynamically, which means they can be reused in different models, for different deployments, for different organisations.

Reuse improves quality for any software, and especially operations software, which benefits from application ops experience and hard-to-achieve domain knowledge. Over time, an open source operator reflects deep and wide experience of running that application in a very broad range of contexts.

Model-driven operators

Model-driven operations reduce duplication and errors in complex system administration, allowing administrators to express their intent and having machinery translate that intent to configuration or actions across all the affected applications.

With Juju, operators are deployed together in models, which provide an administrative boundary for permissions and capacity allocation. All the operators in a single model share the same group of administrators, and run on the same cloud or the same Kubernetes cluster.

Automated integration

The Juju model includes an application graph, which declares the lines of integration between applications. Operators drive that integration automatically based on the graph. Administrators can add or remove integration lines dynamically.

Integration can take place within a model, or between applications in different models with the permission of both groups of model administrators. Cross-model integration allows multi-cloud integration, or integration between different substrates such as bare metal Windows and virtualised Kubernetes.

Each operator declares integration endpoints. Integration can be declared between matching endpoints, and code in each operator then handles their end of the integration.

Why Juju?

Juju transforms your ability to integrate fast-moving open source components into large, complex deployments. The move to microservices and the explosion in open source have conspired to make modern operations incredibly complex and dependent on very rare skills. Model-driven operators solve two key problems - application operations domain knowledge is encapsulated in reusable packages, and dynamic model discovery allows reuse of those packages in widely different settings.

  • Multi-cloud operations
    Reusable operations packages mean that you can deploy on multiple clouds without changing operations code. Cross-model integration enables direct integration of workloads on different clouds.

  • Reduced complexity
    Microservices have made applications simpler, but operations more complex. Working at a higher level of abstraction makes it simpler to understand and share complex deployments. Delegating the details to shared open source ops code makes sense.

  • Simplify day two and beyond
    Model-driven operators go beyond the application lifecycle, to handle integration, upgrades, storage, networking, configuration and everyday actions like backup and restore.

  • Optimisation
    Charmed operators are aware of their setting and can optimise the application configuration accordingly.

Navigation

Navigation
Level Path Navlink
0 Introduction
1 kubernetes Get started on Kubernetes
1 getting-started-with-juju Get started on machines
1 installing Install Juju
1 tutorials Tutorials
0 Understanding Juju
1 concepts-and-terms Overview of Juju’s concepts and terms
1 Core Concepts
2 applications-and-charms Application
2 models Model
2 relations Relation
1 Important Terms
2 clouds Clouds
2 credentials Credentials
2 controllers Controllers
2 constraints Constraints
2 fan-container-networking Fan container networking
2 ha-applications High availability
2 spaces Network spaces
0 Setting up
1 clouds Add a cloud
1 credentials Add credentials
1 creating-a-controller Create a controller
0 Deployment
1 deploying-applications Deploying applications
1 constraints Defining constraints
1 deploying-advanced-applications Tailoring the deployment
1 relations Relating applications
1 cross-model-relations Creating cross-model relations
0 Cloud Guides
1 Localhost
2 lxd-cloud LXD
1 Kubernetes
2 microk8s-cloud MicroK8s
2 kubernetes/azure-aks Azure AKS
2 kubernetes/amazon-eks Amazon EKS
2 kubernetes/google-gke Google GKE
2 kubernetes Other clusters
1 Private Cloud
2 vsphere-cloud VMware vSphere
2 openstack-cloud OpenStack
2 maas-cloud MAAS
2 manual-cloud “Manual” Cloud
1 Public Cloud
2 aws-cloud Amazon AWS
2 azure-cloud Microsoft Azure
2 gce-cloud Google GCE
2 oci-cloud Oracle
2 rackspace-cloud Rackspace
0 Operations Tasks
1 machine-auth Accessing individual machines with SSH
1 working-with-actions Running actions
1 collecting-juju-metrics Collecting metrics
1 gui Accessing Juju’s web interface
1 storage Defining and using persistent storage
1 removing-things Cleaning up
0 System Administration Tasks
1 upgrading Upgrading to a new release
1 controller-backups Backing up the controller
1 controller-high-availability Running a high-availability controller
1 working-with-multiple-users Working with multiple users
1 working-offline Working offline
1 migrating-models Migrating models
1 cloud-image-metadata Generate your own cloud image metadata
0 Writing Charms
1 charm-bundles Charm bundles
1 juju-resources Working with resources
1 charm-writing/kubernetes Kubernetes charm writing guide
1 charm-writing Charm writing guide
1 tools Software tools for charm writers
0 Reference
1 glossary Glossary
1 For Juju administrators
2 charm-unit-status-and-their-meanings Status values and their meanings
2 constraints-reference Juju constraints
2 commands Juju commands
2 juju-environment-variables Environment variables
1 For charm writers and developers
2 charm-writing/hook-tools Juju hook tools
2 charm-metadata metadata.yaml specification
2 bundle-reference bundle.yaml specification
2 Internal API docs
0 Troubleshooting
1 help Advanced status output
1 logs Finding Juju logs
0 Seeking help
1 Ask on our forum
1 File a bug
1 Report a docs issue
1 contact-us Further contact details

Redirects

Mapping table
Path Location
/docs/authors-charm-writing /docs/charm-writing
/stable/models-config /docs/configuring-models
/stable/controllers-config /docs/configuring-controllers
/getting-started /docs/getting-started-with-juju
/docs/getting-started /docs/getting-started-with-juju
/docs/getting-started-with-jaas /docs/getting-started-with-juju-on-jaas
/docs/clouds-lxd-resources /docs/lxd-resources
/docs/applications/groups /docs/application-groups
/docs/applications/ha /docs/ha-applications
/docs/applications/metrics /docs/application-metrics
/docs/tutorials/client-basic /docs/client-usage-tutorial
/docs/applications/configuring /docs/configuring-applications
/docs/applications/deploying-advanced /docs/deploying-advanced-applications
/docs/applications/deploying /docs/deploying-applications
/docs/reference/constraints /docs/constraints-reference
/docs/tutorials/multi-user-basic /docs/multi-user-basic-tutorial
/docs/tutorials/multi-user-external /docs/multi-user-external-tutorial
/docs/applications/scaling /docs/scaling-applications
/docs/tutorials/k8s-static-pv /docs/k8s-static-pv-tutorial
/docs/tutorials/k8s-charms /docs/k8s-charms-tutorial
/docs/applications/upgrading /docs/upgrading-applications
/docs/aws /docs/aws-cloud
/docs/gce /docs/gce-cloud
/docs/gcp /docs/gce-cloud
/docs/azure /docs/azure-cloud
/docs/microk8s /docs/kubernetes/microk8s
/docs/microk8s-cloud /docs/kubernetes/microk8s
/docs/k8s-cloud /docs/kubernetes
/docs/aks /docs/kubernetes/azure-aks
/docs/eks /docs/kubernetes/amazon-eks
/docs/gke /docs/kubernetes/google-gke
/docs/azure-aks /docs/kubernetes/azure-aks
/docs/amazon-eks /docs/kubernetes/amazon-eks
/docs/google-gke /docs/kubernetes/google-gke
/docs/oracle /docs/oracle-cloud
/docs/openstack /docs/openstack-cloud
/docs/rackspace /docs/rackspace-cloud
/docs/clouds-aws /docs/aws-cloud
/docs/clouds-gce /docs/gce-cloud
/docs/clouds-joyent /docs/joyent-cloud
/docs/tutorials/k8s-microk8s /docs/microk8s-cloud
/docs/clouds-k8s /docs/k8s-cloud
/docs/clouds-lxd-advanced /docs/lxd-cloud-advanced
/docs/clouds-lxd /docs/lxd-cloud
/docs/clouds-maas /docs/maas-cloud
/docs/clouds-azure-advanced /docs/advanced-azure-cloud
/docs/clouds-azure /docs/azure-cloud
/docs/clouds-openstack /docs/openstack-cloud
/docs/clouds-oci /docs/oci-cloud
/docs/clouds-rackspace /docs/rackspace-cloud
/docs/tutorials/k8s-aws-integrator /docs/k8s-aws-integrator-tutorial
/docs/clouds-manual /docs/manual-cloud
/docs/clouds-vsphere /docs/vsphere-cloud
/docs/tutorials/k8s-cdk-autostorage /docs/k8s-cdk-autostorage-tutorial
/docs/tutorials/k8s-multicloud-gke-autostorage /docs/k8s-multicloud-gke-autostorage-tutorial
/docs/charm-building /docs/charm-writing
/docs/authors-charm-building /docs/charm-writing
/docs/install /docs/installing
/docs/install-juju /docs/installing
/docs/installing-juju /docs/installing
/docs/amulet /docs/tools#heading–amulet
/docs/configuring-applications https://discourse.jujucharms.com/t/configuring-applications/1059
/docs/multi-user-cloud https://discourse.jujucharms.com/t/a-multi-user-cloud/1190
/docs/charm-writing/actions https://discourse.jujucharms.com/t/actions-for-the-charm-author/1113
/docs/adding-a-model https://discourse.jujucharms.com/t/adding-a-model/1147
/docs/lxd-resources https://discourse.jujucharms.com/t/additional-lxd-resources/1092
/docs/appendix-gke https://discourse.jujucharms.com/t/appendix-installing-a-gke-cluster/1448
/docs/charm-writing/application-config https://discourse.jujucharms.com/t/application-configuration/1052
/docs/application-groups https://discourse.jujucharms.com/t/application-groups/1076
/docs/metrics-applications https://discourse.jujucharms.com/t/application-metrics/1067
/docs/client-usage-tutorial https://discourse.jujucharms.com/t/basic-client-usage-tutorial/1191
/docs/charm-writing/benchmarks https://discourse.jujucharms.com/t/benchmarking-juju-applications/1036
/docs/charm-writing/best-practice https://discourse.jujucharms.com/t/best-practice-for-charm-authors/1037
/docs/charm-hooks https://discourse.jujucharms.com/t/charm-hooks/1040
/docs/charm-layer-yaml-reference https://discourse.jujucharms.com/t/charm-layer-yaml-reference/1165
/docs/charm-network-primitives https://discourse.jujucharms.com/t/charm-network-primitives/1126
/docs/charm-writing/promulgation https://discourse.jujucharms.com/t/charm-promulgation/1054
/docs/charm-review-process https://discourse.jujucharms.com/t/charm-review-process/1055
/docs/charm-store-policy https://discourse.jujucharms.com/t/charm-store-policy/1044
/docs/charm-tools https://discourse.jujucharms.com/t/charm-tools/1180
/docs/charms-and-mysql-interfaces https://discourse.jujucharms.com/t/charms-and-mysql-interfaces/1139
/docs/client https://discourse.jujucharms.com/t/client/1083
/docs/cmr-scenario-1 https://discourse.jujucharms.com/t/cmr-scenario-1/1148
/docs/cmr-scenario-2 https://discourse.jujucharms.com/t/cmr-scenario-2/1149
/docs/command-changes-from-1-25-to-2-0 https://discourse.jujucharms.com/t/command-changes-from-1-25-to-2-0/1101
/docs/components-of-a-charm https://discourse.jujucharms.com/t/components-of-a-charm/1038
/docs/configuring-applications https://discourse.jujucharms.com/t/configuring-applications/1059
/docs/configuring-controllers https://discourse.jujucharms.com/t/configuring-controllers/1107
/docs/configuring-offline-usage https://discourse.jujucharms.com/t/configuring-juju-for-offline-usage/1068
/docs/configuring-models https://discourse.jujucharms.com/t/configuring-models/1151
/docs/controller-logins https://discourse.jujucharms.com/t/controller-logins/1389
/docs/create-a-google-compute-engine-controller https://discourse.jujucharms.com/t/create-a-google-compute-engine-controller/1189
/docs/appendix-creating-an-aws-vpc https://discourse.jujucharms.com/t/appendix-creating-an-aws-vpc/1064
/docs/creating-config-yaml-and-configuring-charms https://discourse.jujucharms.com/t/creating-config-yaml-and-configuring-charms/1039
/docs/creating-icons-for-charms https://discourse.jujucharms.com/t/creating-icons-for-charms/1041
/docs/creating-ssh-keypairs-on-windows https://discourse.jujucharms.com/t/creating-ssh-keypairs-on-windows/1133
/docs/charm-writing/hook-errors https://discourse.jujucharms.com/t/dealing-with-errors-encountered-by-charm-hooks/1048
/docs/debugging-building-layers https://discourse.jujucharms.com/t/debugging-building-layers/1115
/docs/charm-writing/hook-debug https://discourse.jujucharms.com/t/debugging-charm-hooks/1116
/docs/deploying-charms-offline https://discourse.jujucharms.com/t/deploying-charms-offline/1069
/docs/charm-writing/hook-debug-dhx https://discourse.jujucharms.com/t/dhx-a-customized-hook-debugging-environment-plugin/1114
/docs/disabling-commands https://discourse.jujucharms.com/t/disabling-commands/1141
/docs/event-cycle https://discourse.jujucharms.com/t/event-cycle/1117
/docs/getting-started-with-charm-development https://discourse.jujucharms.com/t/getting-started-with-charm-development/1118
/docs/getting-started-with-juju-on-jaas https://discourse.jujucharms.com/t/getting-started-with-juju-on-jaas/1134
/docs/charm-writing/howto-author https://discourse.jujucharms.com/t/how-to-become-a-juju-charm-author/1049
/docs/implementing-leadership https://discourse.jujucharms.com/t/implementing-leadership/1124
/docs/charm-writing/relations https://discourse.jujucharms.com/t/implementing-relations/1051
/docs/appendix-installing-ceph https://discourse.jujucharms.com/t/appendix-installing-ceph/1077
/docs/installing-snaps-offline https://discourse.jujucharms.com/t/installing-snaps-offline/1179
/docs/instance-naming-and-tagging-in-clouds https://discourse.jujucharms.com/t/instance-naming-and-tagging-in-clouds/1102
/docs/interface-layers https://discourse.jujucharms.com/t/interface-layers/1121
/docs/introducing-juju-2-0 https://discourse.jujucharms.com/t/introducing-juju-2-0/1140
/docs/introduction-to-juju-charms https://discourse.jujucharms.com/t/introduction-to-juju-charms/1188
/docs/juju-plugins https://discourse.jujucharms.com/t/juju-plugins/1145
/docs/centos https://discourse.jujucharms.com/t/juju-support-for-centos7/1142
/docs/language-details-contributing-to-juju-docs https://discourse.jujucharms.com/t/language-details-contributing-to-juju-docs/1104
/docs/layers-for-charm-authoring https://discourse.jujucharms.com/t/layers-for-charm-authoring/1122
/docs/leadership-howtos https://discourse.jujucharms.com/t/leadership-howtos/1123
/docs/managed-solutions https://discourse.jujucharms.com/t/managed-solutions/1132
/docs/metric-collecting-charms https://discourse.jujucharms.com/t/metric-collecting-charms/1125
/docs/multi-user-basic-tutorial https://discourse.jujucharms.com/t/multi-user-basic-setup-tutorial/1195
/docs/multi-user-external-tutorial https://discourse.jujucharms.com/t/multi-user-external-setup-tutorial/1196
/docs/notes-on-upgrading-juju-software https://discourse.jujucharms.com/t/notes-on-upgrading-juju-software/1153
/docs/offline-mode-strategies https://discourse.jujucharms.com/t/offline-mode-strategies/1071
/docs/persistent-storage-and-kubernetes https://discourse.jujucharms.com/t/persistent-storage-and-kubernetes/1078
/docs/reference https://discourse.jujucharms.com/t/reference-documents/1161
/docs/release-notes https://discourse.jujucharms.com/t/release-notes/1166
/docs/running-multiple-versions-of-juju https://discourse.jujucharms.com/t/running-multiple-versions-of-juju/1143
/docs/sample-command-usage-and-output-interpretation https://discourse.jujucharms.com/t/sample-command-usage-and-output-interpretation/1200
/docs/scaling-applications https://discourse.jujucharms.com/t/scaling-applications/1075
/docs/k8s-static-pv-tutorial https://discourse.jujucharms.com/t/setting-up-static-kubernetes-storage-tutorial/1193
/docs/charm-writing/subordinates https://discourse.jujucharms.com/t/subordinate-applications/1053
/docs/charm-writing/hook-env https://discourse.jujucharms.com/t/the-hook-environment-hook-tools-and-how-hooks-are-run/1047
/docs/charm-writing/store https://discourse.jujucharms.com/t/the-juju-charm-store/1045
/docs/charm-writing/relations-lifecycle https://discourse.jujucharms.com/t/the-lifecycle-of-charm-relations/1050
/docs/help-additions https://discourse.jujucharms.com/t/troubleshooting-additions/1182
/docs/help-clouds https://discourse.jujucharms.com/t/troubleshooting-clouds/1183
/docs/help-model-upgrades https://discourse.jujucharms.com/t/troubleshooting-model-upgrades/1186
/docs/help-removals https://discourse.jujucharms.com/t/troubleshooting-removals/1185
/docs/k8s-cdk-autostorage-tutorial https://discourse.jujucharms.com/t/tutorial-installing-kubernetes-with-cdk-and-using-auto-configured-storage/1469
/docs/k8s-multicloud-gke-autostorage-tutorial https://discourse.jujucharms.com/t/tutorial-multi-cloud-controller-with-gke-and-auto-configured-storage/1465
/docs/k8s-charms-tutorial https://discourse.jujucharms.com/t/understanding-kubernetes-charms-tutorial/1263
/docs/unmaintained-charms https://discourse.jujucharms.com/t/unmaintained-charms/1056
/docs/charm-writing/upgrading https://discourse.jujucharms.com/t/upgrading-a-charm/1131
/docs/upgrading-series https://discourse.jujucharms.com/t/upgrading-a-machine-series/1198
/docs/upgrading-applications https://discourse.jujucharms.com/t/upgrading-applications/1080
/docs/upgrading-models https://discourse.jujucharms.com/t/upgrading-models/1154
/docs/user-types-and-abilities https://discourse.jujucharms.com/t/user-types-and-abilities/1201
/docs/using-bundles-with-the-gui https://discourse.jujucharms.com/t/using-bundles-with-the-gui/1057
/docs/using-docker-in-charms https://discourse.jujucharms.com/t/using-docker-in-charms/1135
/docs/joyent-cloud https://discourse.jujucharms.com/t/using-joyent-with-juju/1089
/docs/lxd-cloud-advanced https://discourse.jujucharms.com/t/using-lxd-with-juju-advanced/1091
/docs/advanced-azure-cloud https://discourse.jujucharms.com/t/using-microsoft-azure-with-juju-advanced/1085
/docs/openstack-cloud https://discourse.jujucharms.com/t/using-openstack-with-juju/1097
/docs/using-resources-developer-guide https://discourse.jujucharms.com/t/using-resources-developer-guide/1127
/docs/k8s-aws-integrator-tutorial https://discourse.jujucharms.com/t/using-the-aws-integrator-charm-tutorial/1192
/docs/using-the-localhost-cloud-offline https://discourse.jujucharms.com/t/using-the-localhost-cloud-offline/1070
/docs/what-is-juju https://discourse.jujucharms.com/t/what-is-juju/1032
/docs/whats-new-2-6 https://discourse.jujucharms.com/t/whats-new-in-2-6/1202
/docs/writing-a-layer-by-example https://discourse.jujucharms.com/t/writing-a-layer-by-example/1120
/docs/writing-charm-tests https://discourse.jujucharms.com/t/writing-charm-tests/1130
/docs/writing-charms-that-use-storage https://discourse.jujucharms.com/t/writing-charms-that-use-storage/1128
/docs/writing-charms-that-use-terms https://discourse.jujucharms.com/t/writing-charms-that-use-terms/1129
/docs/writing-your-first-juju-charm https://discourse.jujucharms.com/t/writing-your-first-juju-charm/1046
/docs/tutorial-managing-credentials https://discourse.jujucharms.com/t/tutorial-managing-credentials/1289
/docs/command-consume https://discourse.charmhub.io/t/command-consume/1698
/docs/command-find-offers https://discourse.charmhub.io/t/command-find-offers/1722
/docs/command-list-firewall-rules https://discourse.charmhub.io/t/command-list-firewall-rules/1745
/docs/command-offer https://discourse.charmhub.io/t/command-offer/1772
/docs/command-offers https://discourse.charmhub.io/t/command-offers/1773
/docs/command-remove-offer https://discourse.charmhub.io/t/command-remove-offer/1788
/docs/command-remove-saas https://discourse.charmhub.io/t/command-remove-saas/1790
/docs/command-resume-relation https://discourse.charmhub.io/t/command-resume-relation/1799
/docs/command-set-firewall-rule https://discourse.charmhub.io/t/command-set-firewall-rule/1811
/docs/command-show-offer https://discourse.charmhub.io/t/command-show-offer/1826
/docs/command-suspend-relation https://discourse.charmhub.io/t/command-suspend-relation/1840

Question for @anthonydillon, @nottrobin & @pmatulis - would changing the title of this post impact negatively downstream? If it’s being pinned globally, I believe it should be inviting. (Also, why is it being pinned globally?)

“Juju documentation” makes it hard to know whether it’s worth clicking on. If it’s changed to “Need help? Links to Juju’s documentation”.

The introduction should also be more welcoming, in my opinion. It reads to me as “you’ve come to the wrong place”:

Yes, you can happily change the title, that won’t have any impact on the system.

The thinking behind it being pinned is that it provides effectively the navigation table for the documentation system. But I don’t think it needs to be pinned globally, that seems like a mistake.

But I consider it very much your call whether it’s the right decision to pin it at all. You can happily unpin it, again without having any impact on the documentation system.

The content above the “Navigation” title is also currently not used by the docs site, so you can change it to whatever you like for the time being. However, in other documentation sets - docs.snapcraft.io and the soon-to-be created maas.io/docs, the content above the “Navigation” title in that topic forms the content of the docs homepage, so we might want to move this way in Juju too before too long.

Does that all make sense?

Thanks for the response Robin. I’ll pin this thread to the #docs category, rather than globally. That way it can still be useful as an index for people writing documentation.

1 Like

Heads up, the following pages under the Reference section are missing actual links:

  • Juju commands
  • Environment variables

FYI, I very much like this page pinned to the Docs category. Helps me a lot. :slight_smile:

This currently links to Getting started with Juju - the same target as “Getting started on traditional infrastructure” which is highly confusing until you notice it.

As a minimum it should probably link to Using Kubernetes with Juju and be moved lower (because that document references Getting started with Juju as a prerequisite)

Thanks for raising this @doismellburning. I will get this addressed very shortly :slight_smile:

Edit: updated

I found these 404 broken links:

That’s strange… I must have edited the index incorrectly. I will take a look now.

Edit: the problem was that I had edited the titles of those URLs. Discourse is not sensitive to these changes (it only cares about the post ID).