我想在Ansible中运行一个在变量中定义的次数的循环。这有可能吗?
想象一下服务器列表,我们想在每台服务器上创建一些编号文件。这些值在vars.yml中定义:
server_list:
server1:
name: server1
os: Linux
num_files: 3
server2:
name: server2
os: Linux
num_files: 2
我想要的输出是在server1上创建文件
/tmp/1
,/tmp/2
和/tmp/3
,在server2上创建/tmp/1
和/tmp/2
。我试图用with_nested
,with_dict
和with_subelements
编写剧本,但我似乎找不到任何解决办法:- hosts: "{{ target }}"
tasks:
- name: Load vars
include_vars: vars.yml
- name: Create files
command: touch /tmp/{{ loop_index? }}
with_dict: {{ server_list[target] }}
loop_control:
loop_var: {{ item.value.num_files }}
如果我需要在每个服务器上创建50个文件,我可以看到如果每个服务器都有一个列表变量,其中每个列表中包含50个项目,那么该变量就是1到50,那将是一个自我。击败Ansible的使用。
最佳答案
在文档中有一章:Looping over Integer Sequences(2.4版)
为您的任务:
- file:
state: touch
path: /tmp/{{ item }}
with_sequence: start=1 end={{ server_list[target].num_files }}
更新:Ansible 2.5中的发生了变化。请参见单独的docst页面以了解sequence插件。
新的
loop
语法为:- file:
state: touch
path: /tmp/{{ item }}
loop: "{{ query('sequence', 'start=1 end='+(server_list[target].num_files)|string) }}"
不幸的是,
sequence
仅接受字符串格式的参数,因此传递给query
的参数看起来很笨拙。
关于loops - 如何循环Ansible $ var次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43283100/