Ansible循环x次

Posted

技术标签:

【中文标题】Ansible循环x次【英文标题】:Ansible to loop x times 【发布时间】:2015-12-10 00:51:38 【问题描述】:

我必须做一些基准测试并循环 10 个命令 3 次(运行全部 10x3,而不是 firstx3 然后是 secondx3 - 所以全部运行 10x3)。我从寄存器变量中的文件中提取的 10 个命令(它不适用于_lines: 然后是命令)并执行它们 1,2,3..,10 将输出管道传输到文件中,回显某些内容然后再次执行他们......所有这些都是3次

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

... 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 

...上面的这部分我已经写了 3 次(全部),然后写了更多代码

有没有办法让它更简单?(它已经是一个角色,我使用了这个角色 4 次 - 不要让我在较小的角色中停止它,因为它更复杂,我最终会得到一个巨大的剧本像12x“这个角色”这样的东西看起来很可怕)

【问题讨论】:

请添加您正在使用的真实代码。这将更容易理解您的尝试方式。 我刚刚编辑了需要重构的代码 恐怕没有一种简单直接的方法可以在 Ansible 中重复 一组任务。我想到的最好的事情是编写一个 shell 脚本,它将执行您正在执行的三个任务,并使用适当的参数从 Ansible 调用该单个 shell 脚本三次。虽然不是一个很好的解决方案。 【参考方案1】:

除了现有的答案:您可以使用 with_sequence 指令,而不是复制粘贴 ninclude 块:

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

【讨论】:

【参考方案2】:

您可以将要重复的任务放在单独的 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

【讨论】:

此答案已过时,请使用@Httqm 解决方案。【参考方案3】:

我相信您最好的选择是 write custom module,它将封装您尝试实现的所有步骤。并将所有不同于 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' 

而不是一遍又一遍地重复同一组任务。

【讨论】:

以上是关于Ansible循环x次的主要内容,如果未能解决你的问题,请参考以下文章

ansible的yaml文件,循环引用

Ansible Loop循环控制

010.Ansible_palybook 循环语句

Ansible 学习总结—— Ansible 循环条件判断触发器处理失败等任务控制使用总结

Ansible-playbook 之 loops 循环一

ansible循环的使用