From fc1f4e5ffd9cced293b73f78fb1c1513aa46d2c0 Mon Sep 17 00:00:00 2001 From: Jeff Geerling Date: Mon, 5 Oct 2020 12:19:36 -0500 Subject: [PATCH] helm: Support for single or multiple values files (#236 was #136) --- molecule/default/roles/helm/files/values.yaml | 2 + .../default/roles/helm/tasks/tests_chart.yml | 19 ++++++++++ plugins/modules/helm.py | 37 ++++++++++++++++--- 3 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 molecule/default/roles/helm/files/values.yaml diff --git a/molecule/default/roles/helm/files/values.yaml b/molecule/default/roles/helm/files/values.yaml new file mode 100644 index 00000000..7b057068 --- /dev/null +++ b/molecule/default/roles/helm/files/values.yaml @@ -0,0 +1,2 @@ +--- +revisionHistoryLimit: 0 diff --git a/molecule/default/roles/helm/tasks/tests_chart.yml b/molecule/default/roles/helm/tasks/tests_chart.yml index 26cf19f0..bb600f9b 100644 --- a/molecule/default/roles/helm/tasks/tests_chart.yml +++ b/molecule/default/roles/helm/tasks/tests_chart.yml @@ -258,6 +258,25 @@ that: - install is changed +- name: "Install {{ chart_test }} from {{ source }} with values_files" + helm: + binary_path: "{{ helm_binary }}" + name: test + chart_ref: "{{ chart_source }}" + chart_version: "{{ chart_source_version | default(omit) }}" + namespace: "{{ helm_namespace }}" + values_files: + - "{{ role_path }}/files/values.yaml" + register: install + +- name: "Assert that {{ chart_test }} chart has var from {{ source }}" + assert: + that: + - install is changed + - install.status.status | lower == 'deployed' + - install.status.chart == "{{ chart_test }}-{{ chart_test_version }}" + - "install.status['values'].revisionHistoryLimit == 0" + - name: Remove helm namespace k8s: api_version: v1 diff --git a/plugins/modules/helm.py b/plugins/modules/helm.py index ea62bb3f..9a796b1c 100644 --- a/plugins/modules/helm.py +++ b/plugins/modules/helm.py @@ -73,6 +73,17 @@ options: default: {} aliases: [ values ] type: dict + values_files: + description: + - Value files to pass to chart. + - Paths will be read from the target host's filesystem, not the host running ansible. + - values_files option is evaluated before values option if both are used. + - Paths are evaluated in the order the paths are specified. + required: false + default: [] + type: list + elements: str + version_added: '1.1.0' update_repo_cache: description: - Run C(helm repo update) before the operation. Can be run as part of the package installation or as a separate step. @@ -155,6 +166,14 @@ EXAMPLES = r''' chart_version: 5.0.12 values: "{{ lookup('template', 'somefile.yaml') | from_yaml }}" +- name: Deploy Grafana chart using values files on target + community.kubernetes.helm: + name: test + chart_ref: stable/grafana + release_namespace: monitoring + values_files: + - /path/to/values.yaml + - name: Remove test release and waiting suppression ending community.kubernetes.helm: name: test @@ -328,8 +347,8 @@ def fetch_chart_info(command, chart_ref): def deploy(command, release_name, release_values, chart_name, wait, - wait_timeout, disable_hook, force, atomic=False, create_namespace=False, - replace=False): + wait_timeout, disable_hook, force, values_files, atomic=False, + create_namespace=False, replace=False): """ Install/upgrade/rollback release chart """ @@ -362,6 +381,10 @@ def deploy(command, release_name, release_values, chart_name, wait, if create_namespace: deploy_command += " --create-namespace" + if values_files: + for value_file in values_files: + deploy_command += " --values=" + value_file + if release_values != {}: fd, path = tempfile.mkstemp(suffix='.yml') with open(path, 'w') as yaml_file: @@ -403,6 +426,7 @@ def main(): release_namespace=dict(type='str', required=True, aliases=['namespace']), release_state=dict(default='present', choices=['present', 'absent'], aliases=['state']), release_values=dict(type='dict', default={}, aliases=['values']), + values_files=dict(type='list', default=[], elements='str'), update_repo_cache=dict(type='bool', default=False), # Helm options @@ -437,6 +461,7 @@ def main(): release_namespace = module.params.get('release_namespace') release_state = module.params.get('release_state') release_values = module.params.get('release_values') + values_files = module.params.get('values_files') update_repo_cache = module.params.get('update_repo_cache') # Helm options @@ -491,15 +516,15 @@ def main(): if release_status is None: # Not installed helm_cmd = deploy(helm_cmd, release_name, release_values, chart_ref, wait, wait_timeout, - disable_hook, False, atomic=atomic, create_namespace=create_namespace, - replace=replace) + disable_hook, False, values_files=values_files, atomic=atomic, + create_namespace=create_namespace, replace=replace) changed = True elif force or release_values != release_status['values'] \ or (chart_info['name'] + '-' + chart_info['version']) != release_status["chart"]: helm_cmd = deploy(helm_cmd, release_name, release_values, chart_ref, wait, wait_timeout, - disable_hook, force, atomic=atomic, create_namespace=create_namespace, - replace=replace) + disable_hook, force, values_files=values_files, atomic=atomic, + create_namespace=create_namespace, replace=replace) changed = True if module.check_mode: