Using Chamilo juju charm to setup a dev environment on Digital Ocean

If you're in a hurry/on speed, know this:
  • this procedure is slightly more difficult (so longer) than installing the charm on Amazon
  • you can skip directly to "Installing Juju"
  • if you already have juju installed, you can skip to the last 2 lines of the "Installing juju" section
  • if you already have juju-docean installed and configured, you can skip directly to "Provisioning VMs"
  • otherwise, just continue reading, it's worth a few minutes...
This tutorial regroups a lot of advanced notions, so if you want to know more about one of the following elements, please follow these links: Before anything else, please note that the following is highly experimental. There are still a series of issues that should be worked out in order to make this process failproof.

Basic setup

Before we start using commands and stuff, you'll have to note the following:
  • We are using a Chamilo Charm developed by José Antonio Rey (kudos to him) as a voluntary contribution to the project
  • Charms are configurations to install applications (and stuff) inside the Juju framework
  • The Juju framework is developed by the Ubuntu team, so we're using an Ubuntu (14.04) desktop (or in this case laptop) to launch all the following
  • Digital Ocean is one cloud hosting provider, which is particularly cheap and good for development purposes. The "default" environment for Juju is Amazon, so we'll have a few additional steps because of this choice. The Digital Ocean plugin to Juju is developed by geekmush on Github, and as far as I know he is not related to either Ubuntu nor Digital Ocean, so he is also worth praising for his contribution
  • Chamilo requires a web server and a database server. In this Charm, it is assumed that we want both of these on separate virtual machines, so you will need two of them (unless you change the parameters a little)
  • Juju is written in Go but relies on several Python libraries. As such, you'll have to have python installed on your system and maybe Juju will shout because it is missing a few dependencies. Notably, I installed python3-yaml to avoid a few warnings (it is required for the following, although the installer for Juju says it's optional)

Installing Juju

On a default Ubuntu desktop installation, you'll have to install Juju first. Because we are going to use Juju connected to Digital Ocean, we need a recent version of Juju, so let's add it the unconventional way (with the ppa), launching the following on the command line:
sudo add-apt-repository ppa:juju/devel
sudo apt-get update && apt-get install juju
juju version
For some reason, in my case, this created my home directory's .juju/ folder with root permissions, which then prevented me to reconfigure my environment (requirement for the Digital Ocean Juju plugin), so I changed permissions (my user is "ywarnier", so change that to your user):
sudo chown -R ywarnier:ywarnier .juju
Then we need to install the juju-docean plugin:
sudo apt-get install python3-yaml
sudo pip install -U juju-docean

Setting up Digital Ocean access

Now we need to configure our Digital Ocean (D.O.) API so the system will be able to call D.O. in our place and create instances (and stuff). You first need to grab your API key, client ID and SSH key ID from the Digital Ocean interface. You can do that from the Digital Ocean API page. Obviously, you need a Digital Ocean account to do this and a few bucks of credit (although you can get $10 free credit from several places). If your API key says "Hidden", that's because you must have it stored somewhere already (for other services?). If you don't, you'll have to re-generate one. Your SSH key ID is the name you gave to the SSH key you use from your computer to connect to your new instances. If you don't have it, that's probably because you haven't configured any. Please do in the "SSH Keys" menu item on the left side of your D.O. panel.
 export DO_CLIENT_ID=aseriesof21alphanumericalcharacters
 export DO_SSH_KEY="user@computer"
 export DO_API_KEY=aseriesof32characters

Setting up the Digital Ocean Juju environment

Now we need a bit of manual config to be able to use Digital Ocean (last bit, promised). Edit the ~/.juju/environments.yaml file and paste the following:
environments:
 digitalocean:
 type: manual
 bootstrap-host: null
 bootstrap-user: root
Just a note: the "type: manual" line implies it is a bit more complicated than on amazon later on, and we will have to launch a few more commands to provision new machines *before* we deploy Chamilo.

Generating the Juju environment

Now we're going to create our Juju controller. The Juju controller can be an independent Virtual Machine (VM), or it can be the same as the one on which you will deploy Chamilo. It all depends on your budget and your requirements.
juju docean bootstrap --constraints="mem=1g, region=nyc1"
  2014/06/22 11:50.24:INFO Launching bootstrap host
  2014/06/22 11:51.29:INFO Bootstrapping environmen
Note that we took a decision to use a 1GB (RAM) VM here (mem=1g), in a datacenter in New York (region=nyc1). For the record, I tried creating them in nyc2, which is also a valid D.O. datacenter, but it failed miserably (sometimes not creating the VM, sometimes creating it without IP, sometimes creating it fully, but in the end never returning with a proper success response for my environment to be created), so sticking to nyc1 is probably a reasonable time-saver.

Provisioning VMs

To be able to deploy Chamilo, we'll use two VMs: one for the web server and one for the database
juju docean add-machine -n 2 --constraints="mem=1g, region=nyc1"
2014/06/22 12:44.59:INFO Launching 2 instances
2014/06/22 12:46.42:INFO Registered id:1908893 name:digitalocean-8d14c9bc671555ff872d8d6731f84d68 ip:198.199.82.172 as juju machine
2014/06/22 12:49.08:INFO Registered id:1908894 name:digitalocean-a9ba29cfe55549f58e5f7e365199c5ed ip:208.68.39.19 as juju machine
Now, the "-n 2" above allows you to create these 2 instances, but you could also launch 2 different instances of different properties, doing it one by one. In our case, I suggest you use version Trusty of Ubuntu for the MySQL machine, to avoid a little bug in the Precise version of the charm:
juju docean add-machine --constraints="mem=2g, region=nyc1"
juju docean add-machine --series=trusty --constraints="mem=1g, region=nyc1"
The important thing here being that you can later identify the machine itself by a simple ID, using juju status:
juju status
environment: digitalocean
machines:
 "0":
  agent-state: started
  agent-version: 1.19.3
  dns-name: 192.241.142.154
  instance-id: 'manual:'
  series: precise
  hardware: arch=amd64 cpu-cores=1 mem=994M
  state-server-member-status: has-vote
 "1":
  agent-state: started
  agent-version: 1.19.3
  dns-name: 198.199.82.172
  instance-id: manual:198.199.82.172
  series: precise
  hardware: arch=amd64 cpu-cores=1 mem=994M
 "2":
  agent-state: started
  agent-version: 1.19.3
  dns-name: 208.68.39.19
  instance-id: manual:208.68.39.19
  series: trusty
  hardware: arch=amd64 cpu-cores=1 mem=994M
If you made a mistake at some point or just wanna try things out, you can destroy these instances with
juju docean terminate-machine 1
where "1" is the ID of the machine, as shown above before each of them.

Deploying Chamilo

Now we've got our machines, we just need to deploy the Chamilo Charm and the MySQL Charm (you need MySQL to run Chamilo):
juju deploy cs:~jose/chamilo --to 1
juju deploy mysql --to 2
Please note that the "--to n" option is to specify on which machine you want to deploy the selected service. Now, we need to configure Chamilo a little. We're going to give it a domain name (you'll have to redirect this domain name to the IP of the first machine - the one with the Chamilo service - in order to use it when ready) and a password for the "admin" user (the user created by default):
juju set chamilo domain=test.chamilo.net pass=blabla
Now we still need to tell Juju to link the Chamilo service with the MySQL service:
juju add-relation chamilo mysql
And finally, apply all the above and expose the chamilo service to the public:
juju expose chamilo
If something goes wrong with a service, you can always remove it with:
juju destroy-service chamilo
You can replace "chamilo" by the service with which you are having the issue, of course. If that doesn't work out, you can always remove (terminate) the machine itself (see above).

Useful tricks

You can connect at any time to any of your virtual machines through the command
juju ssh chamilo/0
where "chamilo/0" is the name appearing below "units" in your services. You can check the status of all your instances with
juju status
Note that, sometimes, you might end up with dozens or hundreds of instances. In this case, it won't be as practical to show the status of all instances (I have no solution for that now, but I'm sure there is a way to filter the results of a juju status). You can launch a command on the virtual machines' command line like this:
juju run --service chamilo "tail /var/log/juju/unit-chamilo-0.log"
This way, you are actually executing the command remotely and getting the results locally. You can also see the error log locally, connecting in SSH (first) and then launching:
 tail /var/log/juju/unit-chamilo-0.log
Obviously, that gives you a little more flexibility.

Notes about unexpected errors

One of the "silent" things is that Juju considers the default machine to be Ubuntu Precise. In the case of MySQL, the default Charm is configured for Trusty. This means that if you want to install this package, you need to install a virtual machine in Trusty. Otherwise, you might get some other issues. In my case, the Precise Charm didn't really work (missing yaml), so I decided to go for Trusty. You can choose the distribution of your machine with --series=trusty, for example:
juju docean add-machine --series=trusty --constraints="mem=2g, region=nyc1"
We tested the chamilo charm relatively extensively.

Unmounting the whole thing

If this was just a test, and you're happy, maybe you want to remove everything. If so, the quickest way to do that is to launch a destroy-environment command, but you will first need to destroy each machine and, before that, each services that :
juju destroy service chamilo mysql
juju destroy machine 1 2
juju destroy-environment digitalocean
This should reasonnably quickly remove the whole setup. You should still check your Digital Ocean's dashboard, though, as apparently it doesn't always delete the nodes you created with Juju...

Quick commands list for the impatient

Assuming you're running Ubuntu 14.04 and that you know which values to change in the commands below:
sudo add-apt-repository ppa:juju/devel
sudo apt-get update && apt-get install juju
sudo chmod -R 0700 .juju
sudo apt-get install python3-yaml
sudo pip install -U juju-docean
export DO_CLIENT_ID=aseriesof21alphanumericalcharacters 
export DO_SSH_KEY="user@computer" 
export DO_API_KEY=aseriesof32characters
juju docean bootstrap --constraints="mem=1g, region=nyc1"
juju docean add-machine --constraints="mem=2g, region=nyc1"
juju docean add-machine --series=trusty --constraints="mem=1g, region=nyc1"
juju deploy cs:~jose/chamilo --to 1
juju deploy mysql --to 2
juju set chamilo domain=test.chamilo.net pass=blabla
juju add-relation chamilo mysql
juju expose chamilo
And connect your browser to test.chamilo.net (that you must have redirected to the corresponding IP first) and login with admin/blabla.

Comments

waw it seems to be a door open to a simpler implementation of Chamilo on servers. I guess we can imagine that this charm will be able to implement Red5, Libreoffice and Xapian...

In reply to by YW

Permalink

There's still a long way to get there (just the basic charm must have taken about 40h building and testing in several configurations) but yes... that would also include videoconference, prestashop connector, etc). If we got rid of the shared disk issue, we could also scale pretty well.

In reply to by YW

Permalink

and one question more (I'm quite interested by the topic...) : I can't see any mail server on related charms list. Do you confirm it's not packaged with the Chamilo charm ?

Yes I can imagine the work it represents...
Questions : do you have any experiences with digital ocean or alternatives and their use with Juju ?

In reply to by YW

Permalink

If you need help with Juju and using it with Amazon EC2, HPCloud, OpenStack, MAAS, Joyent and more, let me know on #juju on irc.freenode.net, I'm 'jose' on the network. Myself or anyone else on the team should be able to help you out so you can get started. And if you want to get something for free, I can even help you set up your account for usage with the free tier!

Sure, we're using Digital Ocean for several bigbluebutton instances presently, and a few monitoring servers.
With Juju I don't have experience at all, except the large testing procedure we just did (which is not meant for scaling at this point)

Regarding the mail server: you're right, we should include that in the charm. At the moment, it's not present. I'll mention that to José.

I just have a try to that charm, and, well, I'm quite charmed.

Just a few more remarks about your tutorial :
- on my juju version, juju destroy service and juju destroy machine doesn't work (I have to use juju destroy-service and juju destroy-machine insted).
- curiously nyc1 doesn't work for me, while ams2 does.
- for the noobs like me : replace "--to 1" and "--to 2" to deploy on the bootstrap server.
- i had no probem with mysql charm without precising --series=trusty (while I had when trying to deploy wordpress)

And a few ones about the chamilo charm :
- it seems we can't configure an ip as domain (configuration.php tokens are not replaced then). Not a problem, but good to know.
- undeploy does not seem to work. It's impossible too to rebuild chamilo service with another domain, we have to destroy the machine and then try again (but maybe I miss something there)
- it might have been practical to put chamilo in another folder than /var/www (something like /opt/chamilo/) and to point the vhost there. it would be simplier to add others services (prestashop, drupal, another chamilo install...) on the server.

Anyway, thanks to make me discover Digital Ocean and Juju by the same time.