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 指令,而不是复制粘贴 n
倍 include
块:
- 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次的主要内容,如果未能解决你的问题,请参考以下文章