diff --git a/roles/assemble_template/defaults/main.yml b/roles/assemble_template/defaults/main.yml new file mode 100644 index 00000000..59e0548b --- /dev/null +++ b/roles/assemble_template/defaults/main.yml @@ -0,0 +1,19 @@ +# Copyright 2023 Cloudera, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- + +# cluster_template_fragments_regex: '.*\.json$' +cluster_template_fragments_directory: "{{ mandatory }}" +cluster_template_file: "{{ mandatory }}" diff --git a/roles/assemble_template/meta/argument_specs.yml b/roles/assemble_template/meta/argument_specs.yml new file mode 100644 index 00000000..ed12e794 --- /dev/null +++ b/roles/assemble_template/meta/argument_specs.yml @@ -0,0 +1,37 @@ +# Copyright 2023 Cloudera, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- + +argument_specs: + main: + short_description: "Discover and render files into a cluster template" + description: | + Discovers fragment files in a specified directory, loops through fragment files + rendering them through M(ansible.builtin.template), places them in a temporary directory, + and then assembles a single, final cluster template. + author: "Ronald Suplina " + options: + cluster_template_fragments_directory: + description: "Path to the directory containing fragment files for the cluster template" + type: "path" + required: true + cluster_template_file: + description: "Destination of the assembled cluster template" + type: "path" + required: true + cluster_template_fragments_regex: + description: "Regex pattern for filtering fragment files (optional)" + type: "str" + required: false diff --git a/roles/assemble_template/tasks/main.yml b/roles/assemble_template/tasks/main.yml new file mode 100644 index 00000000..28641881 --- /dev/null +++ b/roles/assemble_template/tasks/main.yml @@ -0,0 +1,48 @@ +# Copyright 2023 Cloudera, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- + +- name: Discover fragment files + ansible.builtin.find: + paths: "{{ cluster_template_fragments_directory }}" + patterns: "{{ cluster_template_fragments_regex | default(omit) }}" + use_regex: yes + recurse: yes + register: fragments + +- name: Create a temporary directory + ansible.builtin.tempfile: + state: directory + register: fragments_temp_directory + +- name: Loop through fragment files and template them + ansible.builtin.template: + src: "{{ __fragment.path }}" + dest: "{{ fragments_temp_directory.path }}/{{ __fragment.path | basename }}" + loop: "{{ fragments.files }}" + loop_control: + loop_var: __fragment + label: "{{ __fragment.path | basename }}" + when: fragments.matched > 0 + +- name: Create cluster template + cloudera.cluster.assemble_cluster_template: + src: "{{ fragments_temp_directory.path }}" + dest: "{{ cluster_template_file }}" + +- name: Remove temporary directory + ansible.builtin.file: + path: "{{ fragments_temp_directory.path }}" + state: absent