query on ansible

I have below playbook:

i have put a loop, there are 8 aggr and 4 protocols: this playbook output is like after every 4 loop, it increments aggr and protocols.

output of the playbook is:

svm1,svm2,svm3,svm4—aggr1 and nfs
svm5,svm6,svm7,svm8—aggr2 and iscsi

svm9,svm10,svm11,svm12—aggr3 and cifs

svm13,svm14,svm15,svm16—aggr4 and fcp

currently the ansible is failing because after 16th loop it is not finding any protocols.

but after 16th loop i want protcols to repeat :

expecting ouput:

svm17,svm18,svm19,svm20—aggr5 and nfs
svm21,svm22,svm23,svm24—aggr6 and iscsi

svm25,svm26,svm27,svm28—aggr7 and cifs

svm29,svm30,svm31,svm32—aggr8 and fcp

  • hosts: localhost
    gather_facts: false
    vars_files:
  • /etc/ansible/group_vars/host_vars

vars:
aggr:

  • aggr_1
  • aggr_2
  • aggr_3
  • aggr_4
  • aggr_5
  • aggr_6
  • aggr_7
  • aggr_8
    protocols:
  • nfs
  • iscsi
  • cifs
  • fcp
    tasks:
  • name: Create SVM
    na_ontap_svm:
    state: present
    name: “svm{{ item }}”
    root_volume: “svm{{ item }}_root_vol”
    root_volume_aggregate: “{{ aggr[((item|int-1)//4)] }}”
    allowed_protocols: “{{ protocols[(((item)|int-1)//4)] }}”
    root_volume_security_style: mixed
    hostname: “{{ aiqumip }}”
    username: “{{ aiqumusername }}”
    password: “{{ aiqumpassword }}”
    https: false
    with_sequence: start=1 end=32

There is better way to handle all permutations. Replace with_sequence:

  loop: "{{ aggr | product(protocols) | list }}"
  loop_control:
        index_var: "loop_index"

Then adjust your module parameters:

  name: "svm{{ loop_index + 1 }}"
  root_volume: "svm{{ loop_index + 1 }}_root_vol"
  root_volume_aggregate: "{{ item[0] }}"
  allowed_protocols: "{{ item[1] }}"

That should do the trick.

Regards
           Racke

Thank u very much …it worked.

I need one more help…the aggr is coming from the playbook1. every time i run that playbook1 individually and i enter the aggr array in playbook2.
so how do i get the output of the playbook1 in the form of array so that i dont have to enter the aggr array in the playbook2.

playbook2: is the one i shared earlier.

playbook1:

tasks:

  • name: Create Aggregates and wait 5 minutes until aggregate is online
    na_ontap_aggregate:
    state: absent
    service_state: online
    name: “aggr_{{item }}”
    disk_count: 5
    wait_for_online: True
    nodes: “{{ node[((item|int-1)//2)] }}”
    time_out: 300
    hostname: “{{ aiqumip }}”
    username: “{{ aiqumusername }}”
    password: “{{ aiqumpassword }}”
    validate_certs: false
    with_sequence: start=1 end=8

Thank u very much ...it worked.

You are welcome.

I need one more help....the aggr is coming from the playbook1. every time i run that playbook1 individually and i enter
the aggr array in playbook2.
so how do i get the output of the playbook1 in the form of array so that i dont have to enter the aggr array in the
playbook2.

playbook2: is the one i shared earlier.

First question would be why do you have two separate playbooks?

Regards
        Racke

I am newbie to ansible…i have to create many objects like this(aggr,svm,volumes,luns,policies,network interfaces) so i have created playbook for each objects and thought of stitching it together.

I am newbie to ansible....i have to create many objects like this(aggr,svm,volumes,luns,policies,network interfaces) so
i have created playbook for each objects and thought of stitching it together.

Yes it is good idea to split up tasks logically, but not a good idea to use separate playbooks:

You can group them in task files,.e.g.

   tasks:
     - import_tasks: aggr.yml
     - import_tasks: svm.yml

Regards
         Racke

okay, so if i use them as tasks, will svm.yml takes aggr array from aggr.yml??