可以循环 x 次
Ansible to loop x times
我必须做一些基准测试并循环执行 10 个命令 3 次(运行 所有 10x3,不是第一个 x3 然后第二个 x3 - 所以 运行 所有 10x3)。我从寄存器变量中的文件中提取的 10 个命令(它不起作用 with_lines: 然后是命令)并执行它们 1,2,3..,10 将输出管道传输到文件中,回显一些东西然后再次执行它们...所有这 3 次
这就是我在 x3 下面的代码(nagios_check 注册变量中有 10 个 commands/lines):
... 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 }' | 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"this role" 这样的巨大剧本,看起来会很糟糕)
我相信您最好的选择是 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' }
而不是一遍又一遍地重复同一组任务。
您可以将要重复的任务放在单独的 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 }' | 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
除了现有答案之外:您可以使用 with_sequence 指令,而不是复制粘贴 n
次 include
块:
- name: Do things
include_tasks: subtask.yml
with_sequence: count=3
我必须做一些基准测试并循环执行 10 个命令 3 次(运行 所有 10x3,不是第一个 x3 然后第二个 x3 - 所以 运行 所有 10x3)。我从寄存器变量中的文件中提取的 10 个命令(它不起作用 with_lines: 然后是命令)并执行它们 1,2,3..,10 将输出管道传输到文件中,回显一些东西然后再次执行它们...所有这 3 次
这就是我在 x3 下面的代码(nagios_check 注册变量中有 10 个 commands/lines):
... 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 }' | 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"this role" 这样的巨大剧本,看起来会很糟糕)
我相信您最好的选择是 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' }
而不是一遍又一遍地重复同一组任务。
您可以将要重复的任务放在单独的 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 }' | 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
除了现有答案之外:您可以使用 with_sequence 指令,而不是复制粘贴 n
次 include
块:
- name: Do things
include_tasks: subtask.yml
with_sequence: count=3