From fe66546160082eb2b85e2e4bd6ba79921fb601bc Mon Sep 17 00:00:00 2001 From: Keith Cantrell Date: Wed, 29 Apr 2026 10:56:03 -0500 Subject: [PATCH 1/5] Made them more consistent. --- .../Volume_Management/create_volume.yaml | 40 +++++++++---------- .../Volume_Management/delete_volume.yaml | 4 +- .../Ansible/Volume_Management/variables.yaml | 15 +++---- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/create_volume.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/create_volume.yaml index dc787a0..ea6b4ce 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/create_volume.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/create_volume.yaml @@ -25,21 +25,6 @@ - fsxn_hostname # # Give default values to optional variables if they are not defined - - name: Set security_style to unix if not provided. - set_fact: - security_style: "unix" - when: security_style is not defined - - - name: Set aggr to 'aggr1' if not provided. - set_fact: - aggr: "aggr1" - when: aggr is not defined - - - name: Set volume_type to "rw" if not provided. - set_fact: - volume_type: "rw" - when: volume_type is not defined - - name: Set use_lambda to true if lambda_function_name is provided. set_fact: use_lambda: true @@ -50,11 +35,6 @@ aws_profile: "default" when: aws_profile is not defined - - name: Set junction path to "/" if not provided. - set_fact: - junction_path: "/{{ volume_name }}" - when: junction_path is not defined - - name: Ensure that aws_region has been provided if use_lambda is true. fail: msg: "aws_region must be defined when use_lambda is true." @@ -76,6 +56,26 @@ password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" no_log: true + - name: Set security_style to unix if not provide. + set_fact: + security_style: "unix" + when: security_style is not defined + + - name: Set aggr to 'aggr1' if not provided. + set_fact: + aggr: "aggr1" + when: aggr is not defined + + - name: Set volume_type to "rw" if not provided. + set_fact: + volume_type: "rw" + when: volume_type is not defined + + - name: Set junction path to "/" if not provided. + set_fact: + junction_path: "/{{ volume_name }}" + when: junction_path is not defined + - name: Create the volume netapp.ontap.na_ontap_volume: state: present diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume.yaml index 83f2933..349269d 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume.yaml @@ -18,7 +18,7 @@ msg: "Required variable {{item}} has not been provided." when: vars[item] is undefined loop: - - volume_name + - delete_volume_name - vserver - fsxn_hostname - secret_name @@ -57,7 +57,7 @@ - name: Delete the volume netapp.ontap.na_ontap_volume: state: absent - name: "{{ volume_name }}" + name: "{{ delete_volume_name }}" vserver: "{{ vserver }}" use_lambda: "{{ use_lambda }}" lambda_config: diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/variables.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/variables.yaml index 62016e8..7da8416 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/variables.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/variables.yaml @@ -1,8 +1,9 @@ -volume_name: "vol1" -volume_size: 100 -vserver: "fsx" -fsxn_hostname: "10.0.0.13" -lambda_function_name: "lambda-8nlmlCR" +volume_name: "keith_test_ansible" +volume_size: 1024 +vserver: "smb_svm" +fsxn_hostname: "10.100.13.122" +lambda_function_name: "demo-vpc-wf-link" aws_region: "us-west-2" -secret_name: "fsxn/default" -snapshot_name: "snapshot1" +secret_name: "keith/fsxn/default" +snapshot_name: "test_snapshot_from_ansible" +autosize_mode: "grow" From 8d43e7d512bb04034e97b93e845f548b36f06521 Mon Sep 17 00:00:00 2001 From: Keith Cantrell Date: Wed, 29 Apr 2026 10:59:11 -0500 Subject: [PATCH 2/5] Removed unused variables. --- .../delete_volume_and_share.yaml | 41 ++++++------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume_and_share.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume_and_share.yaml index afee118..a8741e3 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume_and_share.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume_and_share.yaml @@ -1,7 +1,7 @@ # Title: delete_volume_and_share.yaml --- -- name: Playbook to delete a volume and a CIFS share that points to it on an FSx for ONTAP file system. +- name: Playbook to delete a volume and the CIFS share that points to it. hosts: localhost collections: - netapp.ontap @@ -19,26 +19,12 @@ when: vars[item] is undefined loop: - volume_name + - volume_size - vserver - secret_name - fsxn_hostname # # Give default values to optional variables if they are not defined - - name: Set security_style to ntfs if not provide. - set_fact: - security_style: "ntfs" - when: security_style is not defined - - - name: Set aggr to 'aggr1' if not provided. - set_fact: - aggr: "aggr1" - when: aggr is not defined - - - name: Set volume_type to "rw" if not provided. - set_fact: - volume_type: "rw" - when: volume_type is not defined - - name: Set use_lambda to true if lambda_function_name is provided. set_fact: use_lambda: true @@ -48,17 +34,7 @@ set_fact: aws_profile: "default" when: aws_profile is not defined - - - name: Set junction_path to "/" if not provided. - set_fact: - junction_path: "/{{ volume_name }}" - when: junction_path is not defined - - - name: Set share_name to "" if not provided. - set_fact: - share_name: "{{ volume_name }}" - when: share_name is not defined - + - name: Ensure that aws_region has been provided if use_lambda is true. fail: msg: "aws_region must be defined when use_lambda is true." @@ -80,6 +56,16 @@ password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" no_log: true + - name: Set junction_path to "/" if not provided. + set_fact: + junction_path: "/{{ volume_name }}" + when: junction_path is not defined + + - name: Set share_name to "" if not provided. + set_fact: + share_name: "{{ volume_name }}" + when: share_name is not defined + - name: Delete CIFS Share netapp.ontap.na_ontap_cifs: state: absent @@ -101,7 +87,6 @@ state: absent name: "{{ volume_name }}" vserver: "{{ vserver }}" - aggregate_name: "{{ aggr }}" use_lambda: "{{ use_lambda }}" lambda_config: aws_profile: "{{ aws_profile }}" From 1b4b9a5dda4e884af9200d232c2e960874f38a69 Mon Sep 17 00:00:00 2001 From: Keith Cantrell Date: Wed, 29 Apr 2026 10:59:37 -0500 Subject: [PATCH 3/5] Added new samples --- .../Ansible/Volume_Management/README.md | 21 ++-- .../Volume_Management/clone_volume.yaml | 81 +++++++++++++ .../Volume_Management/create_cifs_share.yaml | 73 +++++++++++ .../create_cifs_unix_symlink_mapping.yaml | 78 ++++++++++++ .../create_volume_and_share.yaml | 114 +++++++++++++----- .../Volume_Management/delete_cifs_share.yaml | 71 +++++++++++ .../Volume_Management/get_volume_info.yaml | 69 +++++++++++ .../set_volume_autosize.yaml | 73 +++++++++++ .../set_volume_efficiency.yaml | 80 ++++++++++++ 9 files changed, 622 insertions(+), 38 deletions(-) create mode 100644 Infrastructure_as_Code/Ansible/Volume_Management/clone_volume.yaml create mode 100644 Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_share.yaml create mode 100644 Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_unix_symlink_mapping.yaml create mode 100644 Infrastructure_as_Code/Ansible/Volume_Management/delete_cifs_share.yaml create mode 100644 Infrastructure_as_Code/Ansible/Volume_Management/get_volume_info.yaml create mode 100644 Infrastructure_as_Code/Ansible/Volume_Management/set_volume_autosize.yaml create mode 100644 Infrastructure_as_Code/Ansible/Volume_Management/set_volume_efficiency.yaml diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/README.md b/Infrastructure_as_Code/Ansible/Volume_Management/README.md index 3e2754c..8fd1dc4 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/README.md +++ b/Infrastructure_as_Code/Ansible/Volume_Management/README.md @@ -7,16 +7,23 @@ node to have network connectivity to the FSx for ONTAP file system. For more inf Workload Factory Link, please refer to the [NetApp Workload Factory documentation](https://docs.netapp.com/us-en/workload-fsx-ontap/links-overview.html). The list of playbooks included in this folder is as follows: -- create\_snapshot.yaml -- delete\_snapshot.yaml -- create\_volume.yaml -- delete\_volume.yaml -- create\_volume\_and\_share.yaml -- delete\_volume\_and\_share.yaml +| Playbook Name | Description | +| clone_volume.yaml | Clones an existing volume.| +| create_cifs_share.yaml | Creates a new CIFS share on an existing volume.| +| create_cifs_unix_symlink_mapping.yaml | Creates a CIFS symlink mapping. | +| create_snapshot.yaml | Creates a snapshot of an existing volume.| +| create_volume.yaml | Creates a new volume.| +| create_volume_and_share.yaml | Creates a new volume with a CIFS share that points to it. It also sets autosize to grow and enables ONTAP efficiencies.| +| delete_cifs_share.yaml | Deletes an existing CIFS share.| +| delete_snapshot.yaml | Deletes an existing snapshot.| +| delete_volume.yaml | Deletes an existing volume.| +| delete_volume_and_share.yaml | Deletes an existing volume and its associated CIFS share.| +| set_volume_autosize.yaml | Sets the autosize policy on an existing volume.| +| set_volume_efficiency.yaml | Enables or disables ONTAP efficiencies on an existing volume.| ## Requirements - Ansible 2.9 or later. Installation instructions can be found [here](https://docs.ansible.com/ansible/latest/installation_guide/index.html) -- NetApp ONTAP Ansible collection. +- NetApp ONTAP Ansible collection. Version 2.17.14 or later. - AWS Ansible collection. - An AWS secret with the credentials necessary to run the required volume APIs against the FSx for ONTAP file system. The required format of the secret is described below. diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/clone_volume.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/clone_volume.yaml new file mode 100644 index 0000000..6efd8b9 --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/clone_volume.yaml @@ -0,0 +1,81 @@ +# Title: clone_volume.yaml + +--- +- name: Playbook to clones a volume in an FSx for ONTAP file system. + hosts: localhost + collections: + - netapp.ontap + - amazon.aws + gather_facts: false + vars_files: + - variables.yaml + vars: + use_lambda: false + + tasks: + - name: Ensure required variables are set. + fail: + msg: "Required variable {{item}} has not been provided." + when: vars[item] is undefined + loop: + - clone_volume_name + - volume_name + - vserver + - secret_name + - fsxn_hostname + # + # Give default values to optional variables if they are not defined + - name: Set use_lambda to true if lambda_function_name is provided. + set_fact: + use_lambda: true + when: lambda_function_name is defined + + - name: Set aws_provide to "default" if not provided. + set_fact: + aws_profile: "default" + when: aws_profile is not defined + + - name: Ensure that aws_region has been provided if use_lambda is true. + fail: + msg: "aws_region must be defined when use_lambda is true." + when: use_lambda and aws_region is not defined + + - name: Set aws_region to "" if not set at this point. + set_fact: + aws_region: "" + when: aws_region is not defined + + - name: Set lambda_function_name to "" if not set at this point. + set_fact: + lambda_function_name: "" + when: lambda_function_name is not defined + + - name: Get username and password from AWS secret. + set_fact: + username: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.username', nested=true) }}" + password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" + no_log: true + + - name: Set junction path to "/" if not provided. + set_fact: + junction_path: "/{{ clone_volume_name }}" + when: junction_path is not defined + + - name: Create the clone + netapp.ontap.na_ontap_volume_clone: + state: present + name: "{{ clone_volume_name }}" + parent_volume: "{{ volume_name }}" + parent_vserver: "{{ parent_vserver if parent_vserver is defined else omit }}" + parent_snapshot: "{{ parent_snapshot if parent_snapshot is defined else omit }}" + vserver: "{{ vserver }}" + junction_path: "{{ junction_path }}" + use_lambda: "{{ use_lambda }}" + lambda_config: + aws_profile: "{{ aws_profile }}" + aws_region: "{{ aws_region }}" + function_name: "{{ lambda_function_name }}" + hostname: "{{ fsxn_hostname }}" + username: "{{ username }}" + password: "{{ password }}" + validate_certs: false diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_share.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_share.yaml new file mode 100644 index 0000000..0930ed3 --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_share.yaml @@ -0,0 +1,73 @@ +# Title: create_a_cifs_share + +--- +- name: Playbook to create a CIFS share + hosts: localhost + collections: + - netapp.ontap + - amazon.aws + gather_facts: false + vars_files: + - variables.yaml + vars: + use_lambda: false + + tasks: + - name: Ensure required variables are set. + fail: + msg: "Required variable {{item}} has not been provided." + when: vars[item] is undefined + loop: + - share_path + - share_name + - vserver + - secret_name + - fsxn_hostname + # + # Give default values to optional variables if they are not defined + - name: Set use_lambda to true if lambda_function_name is provided. + set_fact: + use_lambda: true + when: lambda_function_name is defined + + - name: Set aws_provide to "default" if not provided. + set_fact: + aws_profile: "default" + when: aws_profile is not defined + + - name: Ensure that aws_region has been provided if use_lambda is true. + fail: + msg: "aws_region must be defined when use_lambda is true." + when: use_lambda and aws_region is not defined + + - name: Set aws_region to "" if not set at this point. + set_fact: + aws_region: "" + when: aws_region is not defined + + - name: Set lambda_function_name to "" if not set at this point. + set_fact: + lambda_function_name: "" + when: lambda_function_name is not defined + + - name: Get username and password from AWS secret. + set_fact: + username: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.username', nested=true) }}" + password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" + no_log: true + + - name: Create CIFS Share + netapp.ontap.na_ontap_cifs: + state: present + name: "{{ share_name }}" + path: "{{ share_path }}" + vserver: "{{ vserver }}" + use_lambda: "{{ use_lambda }}" + lambda_config: + aws_profile: "{{ aws_profile }}" + aws_region: "{{ aws_region }}" + function_name: "{{ lambda_function_name }}" + hostname: "{{ fsxn_hostname }}" + username: "{{ username }}" + password: "{{ password }}" + validate_certs: false diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_unix_symlink_mapping.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_unix_symlink_mapping.yaml new file mode 100644 index 0000000..93498d5 --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_unix_symlink_mapping.yaml @@ -0,0 +1,78 @@ +# Title: create_cifs_unix_symlink_mapping.yaml + +--- +- name: Playbook to create a CIFS unix symlink mapping. + hosts: localhost + collections: + - netapp.ontap + - amazon.aws + gather_facts: false + vars_files: + - variables.yaml + vars: + use_lambda: false + + tasks: + - name: Ensure required variables are set. + fail: + msg: "Required variable {{item}} has not been provided." + when: vars[item] is undefined + loop: + - unix_path + - share_name + - cifs_path + - cifs_server + - vserver + - secret_name + - fsxn_hostname + # + # Give default values to optional variables if they are not defined + - name: Set use_lambda to true if lambda_function_name is provided. + set_fact: + use_lambda: true + when: lambda_function_name is defined + + - name: Set aws_provide to "default" if not provided. + set_fact: + aws_profile: "default" + when: aws_profile is not defined + + - name: Ensure that aws_region has been provided if use_lambda is true. + fail: + msg: "aws_region must be defined when use_lambda is true." + when: use_lambda and aws_region is not defined + + - name: Set aws_region to "" if not set at this point. + set_fact: + aws_region: "" + when: aws_region is not defined + + - name: Set lambda_function_name to "" if not set at this point. + set_fact: + lambda_function_name: "" + when: lambda_function_name is not defined + + - name: Get username and password from AWS secret. + set_fact: + username: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.username', nested=true) }}" + password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" + no_log: true + + - name: Create the CIFS unix symlink mapping. + netapp.ontap.na_ontap_cifs_unix_symlink_mapping: + state: present + vserver: "{{ vserver }}" + unix_path: "{{ unix_path }}" + share_name: "{{ share_name }}" + cifs_path: "{{ cifs_path }}" + cifs_server: "{{ cifs_server }}" + locality: "{{ locality if locality is defined else 'local'}}" + use_lambda: "{{ use_lambda }}" + lambda_config: + aws_profile: "{{ aws_profile }}" + aws_region: "{{ aws_region }}" + function_name: "{{ lambda_function_name }}" + hostname: "{{ fsxn_hostname }}" + username: "{{ username }}" + password: "{{ password }}" + validate_certs: false diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/create_volume_and_share.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/create_volume_and_share.yaml index 6d4ff13..893df3c 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/create_volume_and_share.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/create_volume_and_share.yaml @@ -1,7 +1,7 @@ # Title: create_volume_and_share.yaml --- -- name: Playbook to create a volume and a CIFS share that points to it on an FSx for ONTAP file system. +- name: Playbook to create a volume and a CIFS share that points to it. This playbook will also set the autosize mode and enable efficiencies. hosts: localhost collections: - netapp.ontap @@ -25,62 +25,77 @@ - fsxn_hostname # # Give default values to optional variables if they are not defined - - name: Set security_style to ntfs if not provided. - set_fact: - security_style: "ntfs" - when: security_style is not defined - - - name: Set aggr to 'aggr1' if not provided. - set_fact: - aggr: "aggr1" - when: aggr is not defined - - - name: Set volume_type to "rw" if not provided. - set_fact: - volume_type: "rw" - when: volume_type is not defined - - name: Set use_lambda to true if lambda_function_name is provided. set_fact: use_lambda: true when: lambda_function_name is defined - + - name: Set aws_profile to "default" if not provided. set_fact: aws_profile: "default" when: aws_profile is not defined - - - name: Set junction_path to "/" if not provided. - set_fact: - junction_path: "/{{ volume_name }}" - when: junction_path is not defined - - - name: Set share_name to "" if not provided. - set_fact: - share_name: "{{ volume_name }}" - when: share_name is not defined - + - name: Ensure that aws_region has been provided if use_lambda is true. fail: msg: "aws_region must be defined when use_lambda is true." when: use_lambda and aws_region is not defined - + - name: Set aws_region to "" if not set at this point. set_fact: aws_region: "" when: aws_region is not defined - + - name: Set lambda_function_name to "" if not set at this point. set_fact: lambda_function_name: "" when: lambda_function_name is not defined - + - name: Get username and password from AWS secret. set_fact: username: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.username', nested=true) }}" password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" no_log: true + - name: Set junction_path to "/" if not provided. + set_fact: + junction_path: "/{{ volume_name }}" + when: junction_path is not defined + + - name: Set security_style to ntfs if not provide. + set_fact: + security_style: "ntfs" + when: security_style is not defined + + - name: Set aggr to 'aggr1' if not provided. + set_fact: + aggr: "aggr1" + when: aggr is not defined + + - name: Set volume_type to "rw" if not provided. + set_fact: + volume_type: "rw" + when: volume_type is not defined + + - name: Set share_name to "" if not provided. + set_fact: + share_name: "{{ volume_name }}" + when: share_name is not defined + + - name: Give efficiency_mode a default if it hasn't already set. + set_fact: + efficiency_mode: "enabled" + when: efficiency_mode is not defined + + - name: Ensure efficiency_mode is either 'enabled' or 'disabled' + fail: + msg: "efficiency_mode must be either 'enabled' or 'disabled'." + when: efficiency_mode not in ['enabled', 'disabled'] + + - name: Ensure autosize_mode is valid if it is defined. + fail: + msg: "autosize_mode must be either 'grow', 'grow_shrink', or 'off'." + when: autosize_mode is defined and autosize_mode not in ['grow', 'off', 'grow_shrink'] + - name: Create the volume netapp.ontap.na_ontap_volume: state: present @@ -102,6 +117,43 @@ password: "{{ password }}" validate_certs: false + - name: Set Autosize + netapp.ontap.na_ontap_volume_autosize: + volume: "{{ volume_name }}" + vserver: "{{ vserver }}" + use_lambda: "{{ use_lambda }}" + lambda_config: + aws_profile: "{{ aws_profile }}" + aws_region: "{{ aws_region }}" + function_name: "{{ lambda_function_name }}" + mode: "{{ autosize_mode }}" + maximum_size: "{{ autosize_maximum_size | default(omit) }}" + minimum_size: "{{ autosize_minimum_size | default(omit) }}" + hostname: "{{ fsxn_hostname }}" + username: "{{ username }}" + password: "{{ password }}" + validate_certs: false + when: autosize_mode is defined + + - name: Set efficiency of the volume based on the value of efficiency_mode variable. + netapp.ontap.na_ontap_volume_efficiency: + state: "{{ 'present' if efficiency_mode == 'enabled' else 'absent' }}" + volume_name: "{{ volume_name }}" + vserver: "{{ vserver }}" + use_lambda: "{{ use_lambda }}" + lambda_config: + aws_profile: "{{ aws_profile }}" + aws_region: "{{ aws_region }}" + function_name: "{{ lambda_function_name }}" + hostname: "{{ fsxn_hostname }}" + username: "{{ username }}" + password: "{{ password }}" + validate_certs: false + enable_compression: "{{ 'true' if efficiency_mode == 'enabled' else 'false' }}" + enable_data_compaction: "{{ 'true' if efficiency_mode == 'enabled' else 'false' }}" + enable_inline_compression: "{{ 'true' if efficiency_mode == 'enabled' else 'false' }}" + enable_inline_dedupe: "{{ 'true' if efficiency_mode == 'enabled' else 'false' }}" + - name: Create CIFS Share netapp.ontap.na_ontap_cifs: state: present diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/delete_cifs_share.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/delete_cifs_share.yaml new file mode 100644 index 0000000..61ac697 --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/delete_cifs_share.yaml @@ -0,0 +1,71 @@ +# Title: delete_a_cifs_share + +--- +- name: Playbook to delete a CIFS share + hosts: localhost + collections: + - netapp.ontap + - amazon.aws + gather_facts: false + vars_files: + - variables.yaml + vars: + use_lambda: false + + tasks: + - name: Ensure required variables are set. + fail: + msg: "Required variable {{item}} has not been provided." + when: vars[item] is undefined + loop: + - delete_share_name + - vserver + - secret_name + - fsxn_hostname + # + # Give default values to optional variables if they are not defined + - name: Set use_lambda to true if lambda_function_name is provided. + set_fact: + use_lambda: true + when: lambda_function_name is defined + + - name: Set aws_provide to "default" if not provided. + set_fact: + aws_profile: "default" + when: aws_profile is not defined + + - name: Ensure that aws_region has been provided if use_lambda is true. + fail: + msg: "aws_region must be defined when use_lambda is true." + when: use_lambda and aws_region is not defined + + - name: Set aws_region to "" if not set at this point. + set_fact: + aws_region: "" + when: aws_region is not defined + + - name: Set lambda_function_name to "" if not set at this point. + set_fact: + lambda_function_name: "" + when: lambda_function_name is not defined + + - name: Get username and password from AWS secret. + set_fact: + username: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.username', nested=true) }}" + password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" + no_log: true + + - name: Create CIFS Share + netapp.ontap.na_ontap_cifs: + state: absent + name: "{{ delete_share_name }}" + vserver: "{{ vserver }}" + use_lambda: "{{ use_lambda }}" + lambda_config: + aws_profile: "{{ aws_profile }}" + aws_region: "{{ aws_region }}" + function_name: "{{ lambda_function_name }}" + hostname: "{{ fsxn_hostname }}" + username: "{{ username }}" + password: "{{ password }}" + validate_certs: false diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/get_volume_info.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/get_volume_info.yaml new file mode 100644 index 0000000..7299810 --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/get_volume_info.yaml @@ -0,0 +1,69 @@ +# Title: get_volume_info.yaml + +--- +- name: Playbook to get information regarding a volume + hosts: localhost + collections: + - netapp.ontap + - amazon.aws + gather_facts: false + vars: + use_lambda: false +# vars_files: +# - variables.yaml + + tasks: + - name: Ensure required variables are set. + fail: + msg: "Required variable '{{ item }}' has not been provided." + when: vars[item] is undefined + loop: + - volume_name + - vserver + - fsxn_hostname + - secret_name + + - name: Set use_lambda to true if lambda_function_name is provided. + set_fact: + use_lambda: true + when: lambda_function_name is defined + + - name: Set aws_profile to its default value of 'default' if not provided. + set_fact: + aws_profile: "default" + when: aws_profile is not defined + + - name: Ensure that aws_region has been provided if use_lambda is true. + fail: + msg: "aws_region must be defined when use_lambda is true." + when: use_lambda and aws_region is not defined + + - name: Set aws_region to "" if not set at this point. + set_fact: + aws_region: "" + when: aws_region is not defined + + - name: Set lambda_function_name to "" if not set at this point. + set_fact: + lambda_function_name: "" + when: lambda_function_name is not defined + + - name: Get username and password from AWS secret + set_fact: + username: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.username', nested=true) }}" + password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" + no_log: true + + - name: Get volume information + netapp.ontap.na_ontap_rest_info: + use_lambda: "{{ use_lambda }}" +# lambda_config: +# aws_profile: "{{ aws_profile }}" +# aws_region: "{{ aws_region }}" +# function_name: "{{ lambda_function_name }}" + hostname: "{{ fsxn_hostname }}" + username: "{{ username }}" + password: "{{ password }}" + fields: "name" + gather_subset: "storage/volumes" + validate_certs: false diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_autosize.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_autosize.yaml new file mode 100644 index 0000000..e63e1c1 --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_autosize.yaml @@ -0,0 +1,73 @@ +# Title: set_volume_autosize.yaml + +--- +- name: Playbook to create set the autosize of a volume on an FSx for ONTAP file system. + hosts: localhost + collections: + - netapp.ontap + - amazon.aws + gather_facts: false + vars: + use_lambda: false + vars_files: + - variables.yaml + + tasks: + - name: Ensure required variables are set. + fail: + msg: "Required variable '{{ item }}' has not been provided." + when: vars[item] is undefined + loop: + - volume_name + - vserver + - fsxn_hostname + - secret_name + - autosize_mode + + - name: Set use_lambda to true if lambda_function_name is provided. + set_fact: + use_lambda: true + when: lambda_function_name is defined + + - name: Set aws_profile to its default value of 'default' if not provided. + set_fact: + aws_profile: "default" + when: aws_profile is not defined + + - name: Ensure that aws_region has been provided if use_lambda is true. + fail: + msg: "aws_region must be defined when use_lambda is true." + when: use_lambda and aws_region is not defined + + - name: Set aws_region to "" if not set at this point. + set_fact: + aws_region: "" + when: aws_region is not defined + + - name: Set lambda_function_name to "" if not set at this point. + set_fact: + lambda_function_name: "" + when: lambda_function_name is not defined + + - name: Get username and password from AWS secret + set_fact: + username: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.username', nested=true) }}" + password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" + no_log: true + + - name: Set autosize + netapp.ontap.na_ontap_volume_autosize: + volume: "{{ volume_name }}" + vserver: "{{ vserver }}" + use_lambda: "{{ use_lambda }}" + lambda_config: + aws_profile: "{{ aws_profile }}" + aws_region: "{{ aws_region }}" + function_name: "{{ lambda_function_name }}" + mode: "{{ autosize_mode }}" + minimum_size: "{{ autosize_min_size | default(omit) }}" + maximum_size: "{{ autosize_max_size | default(omit) }}" + hostname: "{{ fsxn_hostname }}" + username: "{{ username }}" + password: "{{ password }}" + validate_certs: false diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_efficiency.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_efficiency.yaml new file mode 100644 index 0000000..e076571 --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_efficiency.yaml @@ -0,0 +1,80 @@ +# Title: set_volume_efficiencies.yaml + +--- +- name: Playbook to set a volumes efficiencies of a volume. + hosts: localhost + collections: + - netapp.ontap + - amazon.aws + gather_facts: false + vars: + use_lambda: false + vars_files: + - variables.yaml + + tasks: + - name: Ensure required variables are set. + fail: + msg: "Required variable '{{ item }}' has not been provided." + when: vars[item] is undefined + loop: + - volume_name + - vserver + - fsxn_hostname + - secret_name + - efficiency_mode + + - name: Set use_lambda to true if lambda_function_name is provided. + set_fact: + use_lambda: true + when: lambda_function_name is defined + + - name: Set aws_profile to its default value of 'default' if not provided. + set_fact: + aws_profile: "default" + when: aws_profile is not defined + + - name: Ensure that aws_region has been provided if use_lambda is true. + fail: + msg: "aws_region must be defined when use_lambda is true." + when: use_lambda and aws_region is not defined + + - name: Set aws_region to "" if not set at this point. + set_fact: + aws_region: "" + when: aws_region is not defined + + - name: Set lambda_function_name to "" if not set at this point. + set_fact: + lambda_function_name: "" + when: lambda_function_name is not defined + + - name: Get username and password from AWS secret + set_fact: + username: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.username', nested=true) }}" + password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" + no_log: true + + - name: Ensure efficiency_mode is either 'enabled' or 'disabled' + fail: + msg: "efficiency_mode must be either 'enabled' or 'disabled'." + when: efficiency_mode not in ['enabled', 'disabled'] + + - name: Set efficiency of the volume based on the value of efficiency_mode variable. + netapp.ontap.na_ontap_volume_efficiency: + state: "{{ 'present' if efficiency_mode == 'enabled' else 'absent' }}" + volume_name: "{{ volume_name }}" + vserver: "{{ vserver }}" + use_lambda: "{{ use_lambda }}" + lambda_config: + aws_profile: "{{ aws_profile }}" + aws_region: "{{ aws_region }}" + function_name: "{{ lambda_function_name }}" + hostname: "{{ fsxn_hostname }}" + username: "{{ username }}" + password: "{{ password }}" + validate_certs: false + enable_compression: "{{ 'true' if efficiency_mode == 'enabled' else 'false' }}" + enable_data_compaction: "{{ 'true' if efficiency_mode == 'enabled' else 'false' }}" + enable_inline_compression: "{{ 'true' if efficiency_mode == 'enabled' else 'false' }}" + enable_inline_dedupe: "{{ 'true' if efficiency_mode == 'enabled' else 'false' }}" From b164f18ab1eca46431f33f8eaf13296e1f9550a5 Mon Sep 17 00:00:00 2001 From: Keith Cantrell Date: Wed, 29 Apr 2026 19:44:39 -0500 Subject: [PATCH 4/5] Fixed typos in comments. --- .../Ansible/Volume_Management/README.md | 5 +- .../Volume_Management/clone_volume.yaml | 4 +- .../Volume_Management/create_cifs_share.yaml | 4 +- .../create_cifs_unix_symlink_mapping.yaml | 2 +- .../Volume_Management/create_volume.yaml | 2 +- .../create_volume_and_share.yaml | 8 +-- .../Volume_Management/delete_cifs_share.yaml | 6 +- .../delete_volume_and_share.yaml | 3 +- .../Volume_Management/get_volume_info.yaml | 69 ------------------- .../set_volume_autosize.yaml | 5 ++ .../set_volume_efficiency.yaml | 4 +- .../Ansible/Volume_Management/variables.yaml | 12 ++-- 12 files changed, 30 insertions(+), 94 deletions(-) delete mode 100644 Infrastructure_as_Code/Ansible/Volume_Management/get_volume_info.yaml diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/README.md b/Infrastructure_as_Code/Ansible/Volume_Management/README.md index 8fd1dc4..8a5adca 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/README.md +++ b/Infrastructure_as_Code/Ansible/Volume_Management/README.md @@ -8,12 +8,13 @@ Workload Factory Link, please refer to the [NetApp Workload Factory documentatio The list of playbooks included in this folder is as follows: | Playbook Name | Description | +|:-----|:------| | clone_volume.yaml | Clones an existing volume.| | create_cifs_share.yaml | Creates a new CIFS share on an existing volume.| | create_cifs_unix_symlink_mapping.yaml | Creates a CIFS symlink mapping. | | create_snapshot.yaml | Creates a snapshot of an existing volume.| | create_volume.yaml | Creates a new volume.| -| create_volume_and_share.yaml | Creates a new volume with a CIFS share that points to it. It also sets autosize to grow and enables ONTAP efficiencies.| +| create_volume_and_share.yaml | Creates a new volume with a CIFS share that points to it. It also enables ONTAP efficiencies and potentially sets the autosize mode.| | delete_cifs_share.yaml | Deletes an existing CIFS share.| | delete_snapshot.yaml | Deletes an existing snapshot.| | delete_volume.yaml | Deletes an existing volume.| @@ -90,7 +91,7 @@ ok: [localhost] TASK [Set use_lambda to true if lambda_function_name is provided.] ********************************************************* ok: [localhost] -TASK [Set aws_provide to "default" if not provided.] *********************************************************************** +TASK [Set aws_profile to "default" if not provided.] *********************************************************************** ok: [localhost] TASK [Set junction path to "/" if not provided.] ************************************************************** diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/clone_volume.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/clone_volume.yaml index 6efd8b9..a531fb3 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/clone_volume.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/clone_volume.yaml @@ -1,7 +1,7 @@ # Title: clone_volume.yaml --- -- name: Playbook to clones a volume in an FSx for ONTAP file system. +- name: Playbook to clone a volume in an FSx for ONTAP file system. hosts: localhost collections: - netapp.ontap @@ -30,7 +30,7 @@ use_lambda: true when: lambda_function_name is defined - - name: Set aws_provide to "default" if not provided. + - name: Set aws_profile to "default" if not provided. set_fact: aws_profile: "default" when: aws_profile is not defined diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_share.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_share.yaml index 0930ed3..aeaa2b3 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_share.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_share.yaml @@ -1,4 +1,4 @@ -# Title: create_a_cifs_share +# Title: create_cifs_share.yaml --- - name: Playbook to create a CIFS share @@ -30,7 +30,7 @@ use_lambda: true when: lambda_function_name is defined - - name: Set aws_provide to "default" if not provided. + - name: Set aws_profile to "default" if not provided. set_fact: aws_profile: "default" when: aws_profile is not defined diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_unix_symlink_mapping.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_unix_symlink_mapping.yaml index 93498d5..068f7a3 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_unix_symlink_mapping.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_unix_symlink_mapping.yaml @@ -32,7 +32,7 @@ use_lambda: true when: lambda_function_name is defined - - name: Set aws_provide to "default" if not provided. + - name: Set aws_profile to "default" if not provided. set_fact: aws_profile: "default" when: aws_profile is not defined diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/create_volume.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/create_volume.yaml index ea6b4ce..ff943db 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/create_volume.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/create_volume.yaml @@ -56,7 +56,7 @@ password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" no_log: true - - name: Set security_style to unix if not provide. + - name: Set security_style to unix if not provided. set_fact: security_style: "unix" when: security_style is not defined diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/create_volume_and_share.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/create_volume_and_share.yaml index 893df3c..1c5e8bb 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/create_volume_and_share.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/create_volume_and_share.yaml @@ -61,7 +61,7 @@ junction_path: "/{{ volume_name }}" when: junction_path is not defined - - name: Set security_style to ntfs if not provide. + - name: Set security_style to ntfs if not provided. set_fact: security_style: "ntfs" when: security_style is not defined @@ -81,7 +81,7 @@ share_name: "{{ volume_name }}" when: share_name is not defined - - name: Give efficiency_mode a default if it hasn't already set. + - name: Give efficiency_mode a default if it hasn't already been set. set_fact: efficiency_mode: "enabled" when: efficiency_mode is not defined @@ -127,8 +127,8 @@ aws_region: "{{ aws_region }}" function_name: "{{ lambda_function_name }}" mode: "{{ autosize_mode }}" - maximum_size: "{{ autosize_maximum_size | default(omit) }}" - minimum_size: "{{ autosize_minimum_size | default(omit) }}" + maximum_size: "{{ autosize_max_size | default(omit) }}" + minimum_size: "{{ autosize_min_size | default(omit) }}" hostname: "{{ fsxn_hostname }}" username: "{{ username }}" password: "{{ password }}" diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/delete_cifs_share.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/delete_cifs_share.yaml index 61ac697..8fe30f0 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/delete_cifs_share.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/delete_cifs_share.yaml @@ -1,4 +1,4 @@ -# Title: delete_a_cifs_share +# Title: delete_cifs_share.yaml --- - name: Playbook to delete a CIFS share @@ -29,7 +29,7 @@ use_lambda: true when: lambda_function_name is defined - - name: Set aws_provide to "default" if not provided. + - name: Set aws_profile to "default" if not provided. set_fact: aws_profile: "default" when: aws_profile is not defined @@ -55,7 +55,7 @@ password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" no_log: true - - name: Create CIFS Share + - name: Delete CIFS Share netapp.ontap.na_ontap_cifs: state: absent name: "{{ delete_share_name }}" diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume_and_share.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume_and_share.yaml index a8741e3..41f3092 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume_and_share.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume_and_share.yaml @@ -19,7 +19,6 @@ when: vars[item] is undefined loop: - volume_name - - volume_size - vserver - secret_name - fsxn_hostname @@ -30,7 +29,7 @@ use_lambda: true when: lambda_function_name is defined - - name: Set aws_provide to "default" if not provided. + - name: Set aws_profile to "default" if not provided. set_fact: aws_profile: "default" when: aws_profile is not defined diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/get_volume_info.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/get_volume_info.yaml deleted file mode 100644 index 7299810..0000000 --- a/Infrastructure_as_Code/Ansible/Volume_Management/get_volume_info.yaml +++ /dev/null @@ -1,69 +0,0 @@ -# Title: get_volume_info.yaml - ---- -- name: Playbook to get information regarding a volume - hosts: localhost - collections: - - netapp.ontap - - amazon.aws - gather_facts: false - vars: - use_lambda: false -# vars_files: -# - variables.yaml - - tasks: - - name: Ensure required variables are set. - fail: - msg: "Required variable '{{ item }}' has not been provided." - when: vars[item] is undefined - loop: - - volume_name - - vserver - - fsxn_hostname - - secret_name - - - name: Set use_lambda to true if lambda_function_name is provided. - set_fact: - use_lambda: true - when: lambda_function_name is defined - - - name: Set aws_profile to its default value of 'default' if not provided. - set_fact: - aws_profile: "default" - when: aws_profile is not defined - - - name: Ensure that aws_region has been provided if use_lambda is true. - fail: - msg: "aws_region must be defined when use_lambda is true." - when: use_lambda and aws_region is not defined - - - name: Set aws_region to "" if not set at this point. - set_fact: - aws_region: "" - when: aws_region is not defined - - - name: Set lambda_function_name to "" if not set at this point. - set_fact: - lambda_function_name: "" - when: lambda_function_name is not defined - - - name: Get username and password from AWS secret - set_fact: - username: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.username', nested=true) }}" - password: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.password', nested=true) }}" - no_log: true - - - name: Get volume information - netapp.ontap.na_ontap_rest_info: - use_lambda: "{{ use_lambda }}" -# lambda_config: -# aws_profile: "{{ aws_profile }}" -# aws_region: "{{ aws_region }}" -# function_name: "{{ lambda_function_name }}" - hostname: "{{ fsxn_hostname }}" - username: "{{ username }}" - password: "{{ password }}" - fields: "name" - gather_subset: "storage/volumes" - validate_certs: false diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_autosize.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_autosize.yaml index e63e1c1..d0b606b 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_autosize.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_autosize.yaml @@ -49,6 +49,11 @@ lambda_function_name: "" when: lambda_function_name is not defined + - name: Ensure autosize_mode is valid. + fail: + msg: "autosize_mode must be either 'grow', 'grow_shrink', or 'off'." + when: autosize_mode not in ['grow', 'off', 'grow_shrink'] + - name: Get username and password from AWS secret set_fact: username: "{{ lookup('amazon.aws.aws_secret', '{{ secret_name }}.username', nested=true) }}" diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_efficiency.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_efficiency.yaml index e076571..8482fc2 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_efficiency.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_efficiency.yaml @@ -1,7 +1,7 @@ -# Title: set_volume_efficiencies.yaml +# Title: set_volume_efficiency.yaml --- -- name: Playbook to set a volumes efficiencies of a volume. +- name: Playbook to set a volumes efficiencies. hosts: localhost collections: - netapp.ontap diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/variables.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/variables.yaml index 7da8416..bc4fa19 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/variables.yaml +++ b/Infrastructure_as_Code/Ansible/Volume_Management/variables.yaml @@ -1,9 +1,9 @@ -volume_name: "keith_test_ansible" +volume_name: "test_volume" volume_size: 1024 -vserver: "smb_svm" -fsxn_hostname: "10.100.13.122" -lambda_function_name: "demo-vpc-wf-link" +vserver: "fsx" +fsxn_hostname: "10.1.1.1" +lambda_function_name: "lambda-aaaaaaaa" aws_region: "us-west-2" -secret_name: "keith/fsxn/default" -snapshot_name: "test_snapshot_from_ansible" +secret_name: "fsxn/default" +snapshot_name: "test_snapshot" autosize_mode: "grow" From 6cf7e5f88e21ea9dd0de369b356d5fb6f3890754 Mon Sep 17 00:00:00 2001 From: Keith Cantrell Date: Wed, 29 Apr 2026 20:00:33 -0500 Subject: [PATCH 5/5] Added some other fields that might come up. --- .../get_latency_metrics | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/Management-Utilities/Workload-Factory-API-Samples/get_latency_metrics b/Management-Utilities/Workload-Factory-API-Samples/get_latency_metrics index 2342609..4ae64cc 100755 --- a/Management-Utilities/Workload-Factory-API-Samples/get_latency_metrics +++ b/Management-Utilities/Workload-Factory-API-Samples/get_latency_metrics @@ -35,14 +35,18 @@ following environment variables: Legend: Timestamp - The time the metrics were collected. Volume ID - The ID of the volume these metrics are for. - Network - The network latency in milliseconds. - Cluster - The cluster interconnect latency in milliseconds. - Data - The CPU latency in milliseconds. - Disk - The disk latency in milliseconds. - QoS - The QoS latency in milliseconds. - NVRAM - The NVRAM synchronization latency in milliseconds. - Cloud - The tiering latency in milliseconds. - Details - Any details about the latency analysis. + Network - The network latency. + Cluster - The cluster interconnect latency. + Data - The CPU latency. + Disk - The disk latency. + QoS Max - The latency caused by a QoS Maximum settings. + QoS Min - The latency caused by a QoS Minimum settings. + NVRAM - The NVRAM synchronization latency. + Cloud - The tiering latency. + FlexCache - The latency caused by retrieving data from a FlexCache source. + SM Sync - The latency caused by a SnapMirror synchronous operations. + VA - The latency caused by volume activation (VA) operations. + Details - Any details about the latency event. EOF exit 1 } @@ -111,7 +115,7 @@ fi if [ "$JSON_OUTPUT" == true ]; then jq_query='.' else - jq_query='.items[] | "\(.createdAt / 1000 | todate),\(.volumeId),\(if(.latencyAnalysis.Network) then .latencyAnalysis.Network else 0 end),\(if(.latencyAnalysis.Cluster) then .latencyAnalysis.Cluster else 0 end),\(if(.latencyAnalysis.Data) then .latencyAnalysis.Data else 0 end),\(if(.latencyAnalysis.Disk) then .latencyAnalysis.Disk else 0 end),\(if(.latencyAnalysiss.QoS) then .latencyAnalysis.QoS else 0 end),\(if(.latencyAnalysis.NVRAM) then .latencyAnalysis.NVRAM else 0 end),\(if(.latencyAnalysis.Cloud) then .latencyAnalysis.Cloud else 0 end),\(.details)"' + jq_query='.items[] | "\(.createdAt),\(.volumeId),\(if(.latencyAnalysis.Network) then .latencyAnalysis.Network else 0 end),\(if(.latencyAnalysis.Cluster) then .latencyAnalysis.Cluster else 0 end),\(if(.latencyAnalysis.Data) then .latencyAnalysis.Data else 0 end),\(if(.latencyAnalysis.Disk) then .latencyAnalysis.Disk else 0 end),\(if(.latencyAnalysis."QoS Max") then .latencyAnalysis."QoS Max" else 0 end),\(if(.latencyAnalysis.NVRAM) then .latencyAnalysis.NVRAM else 0 end),\(if(.latencyAnalysis.Cloud) then .latencyAnalysis.Cloud else 0 end),\(if(.latencyAnalysis.FlexCache) then .latencyFlexCache else 0 end),\(.details)"' fi URL="https://api.workloads.netapp.com/accounts/${BLUEXP_ACCOUNT_ID}/builders/v1/latency/analysis/${VOLUME_ID}/history" @@ -141,5 +145,5 @@ done if [ "$JSON_OUTPUT" == true ]; then cat $tmpout2 else - sort -f $tmpout2 | column -s, -t -R 3,4,5,6,7,8,9 -N "Timestamp,Volume ID,Network,Cluster Inter,Data (CPU),Disk,QoS,NVRAM Sync,Cloud Tiering,Details" + sort -f $tmpout2 | column -s, -t -R 3,4,5,6,7,8,9,10 -N "Timestamp,Volume ID,Network,Cluster Inter,Data (CPU),Disk,QoS,NVRAM Sync,Cloud Tiering,Flex Cache,Details" fi