我想在 Ansible 中运行一个循环,其次数是在变量中定义的。这有可能吗? 想象一个服务器列表,我们想在每个服务器上创建一些编号的文件。这些值在 vars.yml 中定义:
server_list:
server1:
name: server1
os: Linux
num_files: 3
server2:
name: server2
os: Linux
num_files: 2
我想要的输出是文件
/tmp/1
、
/tmp/2
和 /tmp/3
在 server1 上创建,/tmp/1
和 /tmp/2
在 server2 上创建。我尝试使用 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 会弄巧成拙。
- file:
state: touch
path: /tmp/{{ item }}
with_sequence: start=1 end={{ server_list[target].num_files }}
Ansible 2.5 中发生了变化。请参阅单独的文档页面了解 sequence 插件。 新的
loop
语法是:
- file:
state: touch
path: /tmp/{{ item }}
loop: "{{ query('sequence', 'start=1 end='+(server_list[target].num_files)|string) }}"
不幸的是,
sequence
仅接受字符串格式的参数,因此传递给
query
的参数看起来相当笨拙。 - file:
state: touch
path: /tmp/{{ item }}
loop: "{{ range(1, (server_list[target].num_files | int + 1)) }}"