如何在 Ansible $var 中循环次数?

问题描述 投票:0回答:2

我想在 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 会弄巧成拙。

loops dictionary ansible nested-loops
2个回答
21
投票
循环整数序列

(ver 2.4) 对于您的任务:

- 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
的参数看起来相当笨拙。
    


0
投票

- file: state: touch path: /tmp/{{ item }} loop: "{{ range(1, (server_list[target].num_files | int + 1)) }}"

© www.soinside.com 2019 - 2024. All rights reserved.