diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/README.md b/Infrastructure_as_Code/Ansible/Volume_Management/README.md index 3e2754c..8a5adca 100644 --- a/Infrastructure_as_Code/Ansible/Volume_Management/README.md +++ b/Infrastructure_as_Code/Ansible/Volume_Management/README.md @@ -7,16 +7,24 @@ 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 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.| +| 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. @@ -83,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 new file mode 100644 index 0000000..a531fb3 --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/clone_volume.yaml @@ -0,0 +1,81 @@ +# Title: clone_volume.yaml + +--- +- name: Playbook to clone 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_profile 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..aeaa2b3 --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/create_cifs_share.yaml @@ -0,0 +1,73 @@ +# Title: create_cifs_share.yaml + +--- +- 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_profile 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..068f7a3 --- /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_profile 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.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/create_volume.yaml index dc787a0..ff943db 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 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 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/create_volume_and_share.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/create_volume_and_share.yaml index 6d4ff13..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 @@ -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 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 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 been 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_max_size | default(omit) }}" + minimum_size: "{{ autosize_min_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..8fe30f0 --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/delete_cifs_share.yaml @@ -0,0 +1,71 @@ +# Title: delete_cifs_share.yaml + +--- +- 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_profile 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: Delete 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/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/delete_volume_and_share.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/delete_volume_and_share.yaml index afee118..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 @@ -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 @@ -24,41 +24,16 @@ - 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 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 - - - 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 +55,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 +86,6 @@ state: absent name: "{{ volume_name }}" vserver: "{{ vserver }}" - aggregate_name: "{{ aggr }}" use_lambda: "{{ use_lambda }}" lambda_config: aws_profile: "{{ aws_profile }}" 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..d0b606b --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_autosize.yaml @@ -0,0 +1,78 @@ +# 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: 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) }}" + 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..8482fc2 --- /dev/null +++ b/Infrastructure_as_Code/Ansible/Volume_Management/set_volume_efficiency.yaml @@ -0,0 +1,80 @@ +# Title: set_volume_efficiency.yaml + +--- +- name: Playbook to set a volumes efficiencies. + 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' }}" diff --git a/Infrastructure_as_Code/Ansible/Volume_Management/variables.yaml b/Infrastructure_as_Code/Ansible/Volume_Management/variables.yaml index 62016e8..bc4fa19 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 +volume_name: "test_volume" +volume_size: 1024 vserver: "fsx" -fsxn_hostname: "10.0.0.13" -lambda_function_name: "lambda-8nlmlCR" +fsxn_hostname: "10.1.1.1" +lambda_function_name: "lambda-aaaaaaaa" aws_region: "us-west-2" secret_name: "fsxn/default" -snapshot_name: "snapshot1" +snapshot_name: "test_snapshot" +autosize_mode: "grow" 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