Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 可循环x次_Loops_Ansible_Roles - Fatal编程技术网

Loops 可循环x次

Loops 可循环x次,loops,ansible,roles,Loops,Ansible,Roles,我必须做一些基准测试,并在10个命令上循环3次(运行所有10x3,而不是第一个x3,然后是第二个x3,所以运行所有10x3)。我从寄存器变量中的文件中提取的10个命令(它不适用于_行:然后是命令)并执行它们1,2,3..,10在文件中管道输出,回显某些内容,然后再次执行它们。。。所有这一切都发生了三次 下面是我在x3下面的代码(nagios_check注册变量中有10条命令/行): 。。。上面这一部分我已经写了3次(全部),并且在编写了更多代码之后 有没有办法让它更简单?(这已经是一个角色了,我

我必须做一些基准测试,并在10个命令上循环3次(运行所有10x3,而不是第一个x3,然后是第二个x3,所以运行所有10x3)。我从寄存器变量中的文件中提取的10个命令(它不适用于_行:然后是命令)并执行它们1,2,3..,10在文件中管道输出,回显某些内容,然后再次执行它们。。。所有这一切都发生了三次

下面是我在x3下面的代码(nagios_check注册变量中有10条命令/行):

。。。上面这一部分我已经写了3次(全部),并且在编写了更多代码之后


有没有办法让它更简单?(这已经是一个角色了,我使用这个角色4次了-不要让我在更小的角色中打断它,因为它更复杂,我最终会有一个12倍于“这个角色”的大剧本,看起来很恐怖)我相信你最好的选择是,它将封装你试图实现的所有步骤。并将所有不同于1的变量放到一个列表中

根据您的描述,我可以假设您在以下方面存在问题:

  • 可读性
  • 维护
  • 这将是一个更干净的有一条线,看起来像这样:

     - name: Run my nagios checks
       my_custom_nagios_module_1.0: >
         date={{ item.date }}
         varaible_x={{ item.x }}
       with_items:
         - { date: '%Y-%m-%d', x: 'foo' }
         - { date: '%Y-%m-%d', x: 'bar' }
         - { date: '%Y-%m-%d', x: 'baz' }
    

    与反复重复同一组任务相反。

    您可以将要重复的任务放在单独的yaml文件中:

    ---
    # 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 }}
    
    然后将其包含在您的剧本中3次:

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

    除现有答案外:您可以使用以下说明,而不是复制粘贴
    n
    乘以
    包含
    块:

    - name: Do things
      include_tasks: subtask.yml
      with_sequence: count=3
    

    请添加您正在使用的真实代码。这将更容易理解您是如何尝试的。我刚刚编辑了需要重构的代码。恐怕没有一种简单直接的方法可以在Ansible中重复一组任务。我想到的最好的事情是编写一个shell脚本,它将完成您正在执行的三项任务,并使用适当的参数从Ansible调用单个shell脚本三次。这不是一个很好的解决方案。这个答案已经过时,请使用@Httqm解决方案。
    - name: Do things
      include_tasks: subtask.yml
      with_sequence: count=3