Helm-apps role for installing helm charts (#8347)

* Sketch of helm-apps role interface

* helm-apps: Early implementation and settings

* helm-apps: Fix README.md example playbook

* fixup! Sketch of helm-apps role interface

* Make the argument specs more explicit

* Remove exposed options from hardcoded default

* Simplify example playbook in README.md

- Define directly the roles parameters
- Add an example of option override for one chart only

* Use release instead of charts

Make explicit that the role is mananing releases, not charts.
Simplify parameters naming
This commit is contained in:
Max Gautier 2022-03-14 16:29:58 +01:00 committed by GitHub
parent d444a2fb83
commit 307d122a84
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 156 additions and 0 deletions

39
roles/helm-apps/README.md Normal file
View file

@ -0,0 +1,39 @@
Role Name
=========
This role is intended to be used to fetch and deploy Helm Charts as part of
cluster installation or upgrading with kubespray.
Requirements
------------
The role needs to be executed on a host with access to the Kubernetes API, and
with the helm binary in place.
Role Variables
--------------
See meta/argument_specs.yml
Playbook example:
```yaml
---
- hosts: kube_control_plane[0]
gather_facts: no
roles:
- name: helm-apps
releases:
- name: app
namespace: app
chart_ref: simple-app/simple-app
- name: app2
namespace: app
chart_ref: simple-app/simple-app
wait_timeout: "10m" # override the same option in `release_common_opts`
repositories: "{{ repos }}"
- repo_name: simple-app
repo_url: "https://blog.leiwang.info/simple-app"
release_common_opts: "{{ helm_params }}"
wait_timeout: "5m"
```

View file

@ -0,0 +1,93 @@
---
argument_specs:
main:
short_description: Install a list of Helm charts.
options:
releases:
type: list
elements: dict
required: true
description: |
List of dictionaries passed as arguments to kubernetes.core.helm.
Arguments passed here will override those in `helm_settings`. For
structure of the dictionary, see the documentation for
kubernetes.core.helm ansible module.
options:
chart_ref:
type: path
required: true
chart_version:
type: str
name:
type: str
required: true
namespace:
type: str
required: true
values:
type: dict
# Possibly general options
create_namespace:
type: bool
chart_repo_url:
type: str
disable_hook:
type: bool
history_max:
type: int
purge:
type: bool
replace:
type: bool
skip_crds:
type: bool
wait:
type: bool
default: true
wait_timeout:
type: str
repositories:
type: list
elements: dict
description: |
List of dictionaries passed as arguments to
kubernetes.core.helm_repository.
default: []
options:
name:
type: str
required: true
password:
type: str
username:
type: str
url:
type: str
release_common_opts:
type: dict
description: |
Common arguments for every helm invocation.
default: {}
options:
create_namespace:
type: bool
default: true
chart_repo_url:
type: str
disable_hook:
type: bool
history_max:
type: int
purge:
type: bool
replace:
type: bool
skip_crds:
type: bool
wait:
type: bool
default: true
wait_timeout:
type: str
default: "5m"

View file

@ -0,0 +1,17 @@
---
- name: Add Helm repositories
kubernetes.core.helm_repository: "{{ helm_repository_defaults | combine(item) }}"
loop: "{{ repositories }}"
- name: Update Helm repositories
kubernetes.core.helm:
state: absent
binary_path: "{{ bin_dir }}/helm"
release_name: dummy # trick needed to refresh in separate step
release_namespace: kube-system
update_repo_cache: true
when: repositories != []
- name: Install Helm Applications
kubernetes.core.helm: "{{ helm_defaults | combine(release_common_opts, item) }}"
loop: "{{ releases }}"

View file

@ -0,0 +1,7 @@
---
helm_defaults:
atomic: true
binary_path: "{{ bin_dir }}/helm"
helm_repository_defaults:
binary_path: "{{ bin_dir }}/helm"