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

How to loop in Ansible $var number of times?

我想运行在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 是在服务器 1 上创建的,/tmp/1/tmp/2 是在服务器 2 上创建的.我曾尝试使用 with_nestedwith_dictwith_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(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 的参数看起来很笨拙。