Search code examples
loopsansibleroles

Ansible to loop x times


I have to do some benchmarks and loop over 10 commands 3 times (run all 10x3, not the firstx3 then the secondx3 - so run all 10x3). The 10 commands I extract from a file in a register variable (it doesn't work with_lines: and then the command) and execute them 1,2,3..,10 pipe the output in a file, echo something and then again execute them... all this 3 times

this how I'm doing it the code below x3 (there are 10 commands/lines in the nagios_check registered variable):

... more code above
- name: get the date for naming purpose
  shell: date +%Y%m%d-%HH%MM%SS
  register: dateext
- name: grep the commands from nagios
  shell: grep -R check_http_EDEN_ /etc/nagios/nrpe.cfg | cut -d= -f2-
  register: nagios_check
- name: check_eden_before
  shell: (printf $(echo '{{ item }}' | awk -F'country=' '{print $2}' | cut -d'&' -f1); printf ' ';{{ item }} | cut -d ' ' -f-2) >> {{ ansible_env.DATA_LOG }}/eden-{{ ansible_hostname }}-{{ dateext.stdout }}
  with_items: "{{ nagios_check.stdout_lines }}"
  ignore_errors: True
- name: enter simple line
  shell: echo "=================" >> {{ ansible_env.DATA_LOG }}/eden-{{ ansible_hostname }}-{{ dateext.stdout }}

... this part above I have it written 3 times (all of it) and after more code

is there a way to make it more simpler ?(it's already a role, I use this role 4 times - don't make me brake it in smaller roles because it's more complex and I'll end up with a huge playbook with something like 12x"this role" and it would look horrible)


Solution

  • You can put the tasks you want to repeat in a separate yaml file:

    ---
    # tasks-to-repeat.yml
    - name: get the date for naming purpose
      shell: date +%Y%m%d-%HH%MM%SS
      register: dateext
    - name: grep the commands from nagios
      shell: grep -R check_http_EDEN_ /etc/nagios/nrpe.cfg | cut -d= -f2-
      register: nagios_check
    - name: check_eden_before
      shell: (printf $(echo '{{ item }}' | awk -F'country=' '{print $2}' | cut -d'&' -f1); printf ' ';{{ item }} | cut -d ' ' -f-2) >> {{ ansible_env.DATA_LOG }}/eden-{{ ansible_hostname }}-{{ dateext.stdout }}
      with_items: "{{ nagios_check.stdout_lines }}"
      ignore_errors: True
    - name: enter simple line
      shell: echo "=================" >> {{ ansible_env.DATA_LOG }}/eden-{{ ansible_hostname }}-{{ dateext.stdout }}
    

    and then include it in your playbook 3 times:

    ---
    # Your playbook
    ... more code above
    - include: task-to-repeat.yml
    - include: task-to-repeat.yml
    - include: task-to-repeat.yml