我需要在 Yaml 文件中写入一些行,次数不定:
- name: Retry a task until a certain condition is met
lineinfile:
path: /root/file
insertafter: '^listeners:'
line: 'iteration #iteration_number++'
retries: {{ a_variable }}
delay: 10
我也想将每次迭代的执行次数写入文件。类似于下面的for循环:
for i in {1..a_variable}
do
echo "i"
done
如何跟踪自己处于循环中的位置?
首先,重试不是循环,因为它们不会迭代任何内容。他们只是进行轮询,直到满足条件为止。相反,您需要将
lineinfile
执行放入 loop
中,该执行将在 0 到您的值的范围内迭代。像这样的东西(我现在无法验证,只是展示想法):
- name: Retry a task until a certain condition is met
lineinfile:
path: /root/file
insertafter: '^listeners:'
line: 'iteration #iteration_number++'
loop: "{{ lookup('range', 0, a_variable }}"
然后,您可以使用默认的
item
变量,或使用 loop_var
参数的可选 loop_control
指令将其设置为另一个变量。
但对于简单的情况来说确实如此。在现实世界中,人们会迭代一些对象列表,因此 Ansible 专门针对这种情况提供了一个特殊变量。它被覆盖在 通过循环跟踪进度
index_var
:
要跟踪循环中的位置,请使用
指令和index_var
。该指令指定一个变量名来包含当前循环索引。loop_control
- name: Count our fruit
ansible.builtin.debug:
msg: "{{ item }} with index {{ my_idx }}"
loop:
- apple
- banana
- pear
loop_control:
index_var: my_idx
您也可以考虑使用 Jinja2 来模板化文件。