{"id":14482763,"url":"https://github.com/openfun/arnold","last_synced_at":"2026-03-17T18:36:03.038Z","repository":{"id":30105046,"uuid":"133722058","full_name":"openfun/arnold","owner":"openfun","description":":construction_worker_woman: Deploy your applications to Kubernetes with Ansible","archived":false,"fork":false,"pushed_at":"2026-02-28T13:23:30.000Z","size":1947,"stargazers_count":40,"open_issues_count":75,"forks_count":10,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-02-28T17:08:28.046Z","etag":null,"topics":["ansible","deployment","django","docker-application","edtech","microservices-architecture","reactjs"],"latest_commit_sha":null,"homepage":"","language":"Jinja","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openfun.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-05-16T20:56:15.000Z","updated_at":"2025-01-10T14:12:38.000Z","dependencies_parsed_at":"2023-09-28T18:14:47.353Z","dependency_job_id":"841c4a9d-19ae-4a07-954e-4ee059222f84","html_url":"https://github.com/openfun/arnold","commit_stats":null,"previous_names":[],"tags_count":119,"template":false,"template_full_name":null,"purl":"pkg:github/openfun/arnold","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openfun%2Farnold","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openfun%2Farnold/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openfun%2Farnold/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openfun%2Farnold/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openfun","download_url":"https://codeload.github.com/openfun/arnold/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openfun%2Farnold/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30628418,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T17:32:55.572Z","status":"ssl_error","status_checked_at":"2026-03-17T17:32:38.732Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","deployment","django","docker-application","edtech","microservices-architecture","reactjs"],"created_at":"2024-09-03T00:01:16.542Z","updated_at":"2026-03-17T18:36:03.023Z","avatar_url":"https://github.com/openfun.png","language":"Jinja","readme":"# Arnold\n\n[![CircleCI](https://circleci.com/gh/openfun/arnold.svg?style=svg)](https://circleci.com/gh/openfun/arnold)\n\nArnold is a generic tool to deploy dockerized applications to\n[Kubernetes](https://kubernetes.io/) with [Ansible](https://www.ansible.com). It was built\nby France Université Numérique to ease its infrastructure deployment.\n\n## Overview\n\nArnold has been designed as a suite of Ansible playbooks and Kubernetes object\ndefinition templates (Jinja2). We take advantage of the `k8s` Ansible modules\nto make Ansible talk with Kubernetes.\n\n## Requirements\n\n- [Docker](https://docs.docker.com/engine/installation/): we use docker to\n  develop and run Arnold. This is a strict requirement to use this project.\n- [Kubectl](https://kubernetes.io/docs/tasks/tools/) (\u003e`v.1.23.5`):\n  This CLI is used to communicate with the running Kubernetes instance you\n  will use.\n- [curl](https://curl.se/) is required by Arnold's CLI.\n\nOptionally:\n\n- [k3d](https://k3d.io/) (\u003e`v.5.0.0`): This tool is used to setup\n  and run a lightweight Kubernetes cluster, in order to have a local\n  environment (it is required to complete below's quickstart instructions to\n  avoid depending on an existing Kubernetes cluster).\n- [gnupg](https://gnupg.org/) to encrypt Ansible vaults passwords and\n  collaborate with your team.\n\n## Quick start for Arnold's users\n\n### Install Arnold\n\nArnold is a shell script that can be downloaded from its repository and\ninstalled somewhere in your `$PATH`. In the following, we choose to install it\nin the user space using the `${HOME}/.local/bin` directory:\n\n```bash\n# Download \u0026 install Arnold script somewhere in your ${PATH}\n$ mkdir -p ${HOME}/.local/bin/ \u0026\u0026 \\\n    curl https://raw.githubusercontent.com/openfun/arnold/master/bin/arnold \u003e ${HOME}/.local/bin/arnold \u0026\u0026 \\\n    chmod +x ${HOME}/.local/bin/arnold\n```\n\nIf the `${HOME}/.local/bin` directory is not in your `${PATH}`, you can add it\nby editing your shell configuration file (`${HOME}/.bashrc` or\n`${HOME}/.zshrc`) and copy/paste the following `export` command:\n\n```bash\n# Add this to your shell configuration (if not already done)\nexport PATH=\"${HOME}/.local/bin:${PATH}\"\n```\n\n### Bootstrap a project\n\nArnold provides a command to setup a new project from scratch. In the following\nexample, we consider that you want to create a namespace for the `hd-inc`\ncustomer (_aka_ Happy Days Incorporated) in a `development` environment (you\nwill find more details on the customer and environment concepts in the\n[documentation](./docs)).\n\n```bash\n# Create the project's directory\n$ mkdir myproject \u0026\u0026 cd myproject\n$ arnold -c hd-inc -e development setup\n```\n\nYour project's tree should look like a base Ansible's project:\n\n```\n.\n└── group_vars\n    ├── common\n    └── customer\n        └── hd-inc\n            ├── development\n            │   ├── main.yml\n            │   └── secrets\n            │       └── databases.vault.yml\n            └── main.yml\n\n6 directories, 3 files\n```\n\nWe will now edit our customer definition file to describe which application we\nwant to deploy:\n\n```yaml\n# group_vars/customer/hd-inc/main.yml\n#\n#\n# Variables specific to the hd-inc customer\nproject_display_name: \"Happy Days Incorporated ({{ env_type }})\"\nproject_description: \"HD-Inc applications in {{ env_type }} environment.\"\n\napps:\n  - name: hello\n```\n\nNow, let's deploy this project! You can either do it on an existing Kubernetes\ncluster, or on a local environment on your workstation.\n\n- To deploy on an existing Kubernetes cluster, please refer to\n[Authenticating against an existing cluster](./docs/config/k8s-authentication.md)\n\n- To deploy on a local environment, assuming you have the `k3d` dependency\n  installed, you just have to run `make cluster`. After a while, a\n  local k3d cluster should be up and running.\n\n\nAfter that, you can run the following command to deploy your application:\n\n\u003e The bootstrap command will ask your confirmation to create a new namespace,\n\u003e please proceed by pressing the enter key from your keyboard.\n\n```bash\n$ arnold -c hd-inc -e development bootstrap\n```\n\nAnd voilà! You have deployed your first application in a k8s project using\nArnold 🎉\n\nWe can check that our pods are running using the `kubectl` CLI:\n\n```bash\n# List created pods\n$ kubectl get pods -n development-hd-inc\n```\n\nThe output should look like the following:\n\n```\nNAME                     READY     STATUS    RESTARTS   AGE\nredirect-nginx-1-qrmrd   1/1       Running   0          4m\n```\n\nOur pod is running. Yata!\n\nArnold offers many more refinements and possibilities. We invite you to read\nour [documentation](./docs) to explore Arnold's features and dig deeper in its\nusage.\n\n## Quick start for Arnold's developers\n\n### Build Arnold\n\nFirst things first: you'll need to clone this repository to start playing with\nArnold:\n\n```bash\n$ cd path/to/working/directory\n$ git clone git@github.com:openfun/arnold.git\n```\n\nAs we heavily rely on Ansible and Kubernetes, we've cooked a Docker container\nimage that bundles Ansible and Arnold's playbooks (you have already installed\nDocker on your machine right?). You can build this image with a little helper\nwe provide:\n\n```bash\n$ cd arnold\n$ make build \u0026\u0026 make build-dev\n```\n\nIf everything goes well, you must have built Arnold's Docker images. You can\ncheck their availability _via_:\n\n```bash\n$ docker images arnold\nREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE\narnold              5.21.2              0d37702fd3e8        4 days ago          322MB\narnold              5.21.2-dev          cd799128fbf6        4 days ago          370MB\n```\n\nWhile the development image (noted `5.21.2-dev` in this build) contains\ndevelopment tools (quality checks as linters and test runners), the production\nimage (noted `5.21.2` in this build) only contains Ansible and Arnold's\nplaybooks.\n\n### Run a local Kubernetes cluster\n\nYou'll need to ensure that you have Kubernetes instance that will be used to\ndeploy your services. For development or testing purpose, we recommend you to\nuse the `make cluster` command to start a local minimalist cluster to work with\n(don't do it now, please read the next paragraph first).\n\nBefore starting the cluster, make sure that your system meets the following\nrequirements:\n\n1. To run ElasticSearch (you'll probably have an application that will use it),\n   you will need to ensure that your kernel's `vm.max_map_count` parameter is\n   at least `262144`:\n\n```bash\n$ sudo sysctl -w vm/max_map_count=262144\n```\n\nNow that you've configured your system, you can safely start a cluster _via_:\n\n```bash\n$ make cluster\n```\n\n### Deploy!\n\nNow that you have a working Kubernetes cluster, let's have fun (sic!) by\ncreating a project for a customer in a particular environment with the `arnold`\nscript:\n\n```bash\n# Activate development environment\n$ source bin/activate\n\n# Run the bootstrap command for the eugene customer in development environment\n$ bin/arnold -c eugene -e development -a hello bootstrap\n```\n\nTadaaa! Arnold has created a new Kubernetes namespace called `eugene-development` with\nthe `hello` application up and running. You can check this using the `oc` CLI:\n\n```bash\n# List namespaces\n$ kubectl get namespace\n\n# Get created pods\n$ kubectl get pods -n eugene-development\n```\n\n### Going further\n\nBy following this quick start guide, you only scratched the surface of\nArnold's capabilities. We invite you to read the project's\n[documentation](./docs) (see below), to know more about Arnold's core\nfeatures such as:\n\n- multiple client/environment configurations support\n- blue/green deployment strategy\n- application discovery (add your own applications easily)\n- ...\n\n## Documentation\n\nThe full documentation of the project is available in this repository (see\n[./docs](./docs)) (and also in readthedocs soon).\n\n## Contributing\n\nPlease, see the [CONTRIBUTING](CONTRIBUTING.md) file.\n\n## Contributor Code of Conduct\n\nPlease note that this project is released with a [Contributor Code of\nConduct](http://contributor-covenant.org/). By participating in this project\nyou agree to abide by its terms. See [CODE_OF_CONDUCT](CODE_OF_CONDUCT.md)\nfile.\n\n## License\n\nThe code in this repository is licensed under the MIT license terms unless\notherwise noted.\n\nPlease see `LICENSE` for details.\n","funding_links":[],"categories":["Jinja"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenfun%2Farnold","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenfun%2Farnold","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenfun%2Farnold/lists"}