loops - 如何循环Ansible $ var次?

标签 loops dictionary ansible nested-loops

我想在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_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(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/

相关文章:

c - 为什么在 C 中永远递减一个 unsigned int 循环?

arrays - 如何从 go map 对象访问深度嵌入的 json 对象?

python - 如何从字典中创建给定大小的列表列表?

ansible - Ansible 如何决定应用哪些 group_vars 文件?

ansible - 将列表中每个路径的基本名称保存到新列表中

java - 异常后继续执行

java - 使用 switch 语句跳出 while 循环

javascript - 尝试在循环中记录数组,如果数组索引等于某个变量则返回一个字符串

c++ - 交换 multimap<int, int> 中的每对值

mysql - 具有 REQUIRE SSL 的 Ansible MySQL 用户