Hi!

Could anyone give me feedback in the way I'm setting up our DevOps?
I really couldn't find much that actually dealt with multiple platforms so 
I had to piece together what I could and came up with the following 
(hopefully it will also help for anyone that comes after).

We, OpenConext.org <https://www.OpenConext.org>, are looking to replace a 
homegrown Bash setup, OpenConext-VM 
<https://github.com/OpenConext/OpenConext-vm>, with Ansible.
OpenConext is basically a platform with about 8 different software 
components (Java WARs running in a Tomcat and PHP apps running on LAMP) at 
this time (though that tends to vary).
What it currently does is provision a machine from scratch and build a demo 
project with all platform components from source.

We want it to do much more:
* Build a demo project from scratch with all *released* platform components 
(WARs for Java, tarballs for PHP) on a single vm.
* Switch any single component from build to source from any git branch (for 
developers). 
* Build and manage a production platform with some of the released platform 
components on multiple machines.
* Upgrade a component from one release to another (including any changes to 
provisioning) with as little downtime as possible.
* Get the version for a single or all components for a given environment.

Our goals are:
* More modularity in setup, mixing and matching components.
* Using this setup on a setup with multiple environments (test, staging, 
production).
* No more manual updates, every component is responsible for it's own 
updates.

These are the terms I'm using:
1. Platform
A single platform is a set of environments all running set of installed 
components with their given configuration values.
A Platform may be open (OpenConext) or a National Research Education 
Network may choose to run it closed (SURFconext).

1.1 Environment
An environment is part of a platform and is a set of hosts all running a 
set of installed component with their given configuration values.

1.1.1 Host
Is part of an environment running one or multiple installed components with 
their given configuration values.

2. (Platform) Component
Any piece of software that supports:
2.1. Install from build
2.2. Install from source.
2.3. Uninstall
2.4. Upgrade to newer version
2.5. Show version

Translating this to Ansible I've come up with the following structure:

*Inventory*
Inventory is per environment, listing the wiring of Hosts and Components in 
"inventory/platform_name/environment.ini".
Inventory specifies the components to use and their version, which may be a 
semver version or a git tag / branch / commit.

*Playbooks*

* install.yml
Install every component listed in the inventory.
Includes everything from install/install-*

* install/install-openconext.component.yml
Runs any setup tasks (like installing databases, configuring LDAP, etc), 
includes install.yml, injects configuration, includes activate.yml.

* version.yml
Get the version for every component listed in the inventory.

*Roles*
Every Component action is a role:

Examples:
* openconext.engine
* openconext.serviceregistry
* openconext.api

Every component has at least the following playbooks (note that we're not 
using main.yml):

* install.yml
Checks the version and either installs from source if the version is 
numeric or from a build if the version is non-numeric (with an include).

* install-build.yml
Install a component build for a given (semver) version.

* install-src.yml
Install a component with development tools for a given branch / tag / 
commit.

* activate.yml
Runs any migrations, switches symlinks, restarts webservers.

* erase.yml
Remove a component from a machine.

* version.yml
Displays the currently installed version.

*Branching*
In order to achieve multiple different platforms the base OpenConext-vm can 
be forked, like so:

** OpenConext / OpenConext-VM*
Base 'demo' project that has a single host on which it installs all 
components with their build.
*inventory/openconext/demo.openconext.org*

*** Developer / OpenConext-VM*
Fork of the main repository, contains a different inventory.
*inventory/openconext/dev.openconext.org*

*** SURFconext / OpenConext-VM*
Fork of the main repository contains multiple different inventories with 
different hosts, different configuration values, but the same roles.
*inventory/surfconext/integration.surfconext.nl*
*inventory/surfconext/test.surfconext.nl*
*inventory/surfconext/staging.surfconext.nl*
*inventory/surfconext/prod.surfconext.nl*

*** SURFnet / OpenConext-VM*
Fork of the main repository for a separate 'playground' environment.
*inventory/surfnet-playground/playground.surfnet.nl*

*Use case: *Developing a feature
A developer forks the OpenConext-vm, adds his dev.openconext.org 
environment with version = feature/some-feature and runs install.yml.
This installs all the build tools and the developer gets working.
He finished up, merges his work to develop. Later another developer checks 
out develop, tests it, merges it to master, tags and builds a new release.
This second developer then updates 
*inventory/openconext/demo.openconext.org* with *version=4.2.0* (was 4.1.0)
*. *
A demo user goes a git pull, and vagrant provision, which does an ansible 
install, which installs OpenConext-engine-4.2.0, runs any applicable 
migrations, switches over the symlink, restarts Apache.
A SURFconext developer updates *inventory/surfconext/test.surfconext.nl* 
and runs install. Testers test. Then *staging.surfconext.nl* gets modified, 
then *prod.surfconext.nl*.

Thank you for reading! Any feedback to this setup would be appreciated!

Cheers,
Boy

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to ansible-project+unsubscr...@googlegroups.com.
To post to this group, send email to ansible-project@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/66c39b36-733d-4931-b18a-b9533a0a8f38%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to