【问题标题】:How to loop in Ansible $var number of times?如何循环 Ansible $var 次数?
【发布时间】:2017-09-03 03:10:18
【问题描述】:

我想在 Ansible 中运行一个循环的次数,该次数是在 in 一个变量中定义的。这有可能吗?

想象一个服务器列表,我们想在每个服务器上创建一些编号的文件。这些值在 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 进行自我打击。

【问题讨论】:

    标签: loops dictionary ansible nested-loops


    【解决方案1】:

    文档中有一个章节: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 的参数看起来很笨拙。

    【讨论】:

    • 该链接没有“循环整数序列”一章,实际上我现在正在寻找如何创建一个简单的 for 循环...
    • 更新了答案。
    猜你喜欢
    • 2015-12-10
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2019-06-28
    相关资源
    最近更新 更多